Интеграция компилятора Google Closure с MS Build на сервере сборки

Я изучаю способы минимизации файлов javascript как часть нашего процесса CI, так что мы можем использовать неминифицированные файлы в разработке и автоматически сжимать их при развертывании на промежуточных и живых серверах.

Это для сайта ASP.NET; мы используем Hudson как сервер сборки.

Я заинтригован компилятором Google Closure, и я столкнулся с этим .NET MSBuild Google Closure Compiler Task, но это не так. похоже, очень широко используется. Существуют ли более эффективные варианты использования с MSBuild, используя инструменты Closure или альтернативные инструменты для минимизации?

Ответ 1

Мы используем компилятор Closure в течение некоторого времени в .NET-проекте.

Сначала мы использовали простой файл MSBuild.proj, который напрямую вызывал скрипты Python. Например, мы бы сделали deps.js с чем-то вроде следующего:

<PropertyGroup>
  <ScriptDirectory>yourprojectname</ScriptDirectory>
  <ClosureLibrary>closure</ClosureLibrary>
  <CalcDeps>$(ClosureLibrary)\bin\calcdeps.py</CalcDeps>
</PropertyGroup>

<Target Name="Deps">
  <Exec Command="$(CalcDeps) -o deps -p $(ScriptDirectory) -d $(ClosureLibrary) --output_file=$(ScriptDirectory)\deps.js" />
</Target>

Фактическая сборка была более сложной, но все же относительно простой (предполагая, что вы опытный MSBuild). Мы просто использовали разные типы групп элементов для каждой соответствующей части вызова script.

<Target Name="Build" DependsOnTargets="Init;FindCompiler">
  <PropertyGroup Condition="'@(Extern)' != ''">
    <Externs>-f [email protected](Extern, ' -f --externs=')</Externs>
  </PropertyGroup>
  <PropertyGroup Condition="'@(Define)' != ''">
    <Defines>-f [email protected](Define, ' -f --define=')</Defines>
  </PropertyGroup>
  <PropertyGroup Condition="'@(Compile)' != ''">
    <Compile>-i @(Compile, ' -i ')</Compile>
  </PropertyGroup>
  <Exec Command="$(CalcDeps) $(Compile) -o compiled -c $(ClosureCompiler) -p $(ClosureLibrary) -p $(ScriptDirectory) $(Externs) $(Defines) -f @(CompilerOption, ' -f ') --output_file $(OutputFile)" />
</Target>

Это было достаточно просто, что мы не стали искать задачу или пытались инвестировать в создание собственного. Закрытие - довольно быстрый проект, поэтому хорошо быть в ситуации, когда вы не слишком зависите от каких-либо сторонних систем сборки, особенно тех, которые выглядят не подкрепленными (задача, которую вы связали).

Теперь я говорил в прошедшем времени, потому что наша система сборки немного мигрировала. В частности, по мере того, как наш проект продолжал расти, становится все более важным разделять различные части нашего кода script на модули. Выполнение этого с помощью готовых сценариев Closure было бы довольно кошмаром. Таким образом, мы решили перейти на plovr (http://plovr.com/), что делает код раздела в модулях очень простым. plovr очень активно поддерживается и был создан Майклом Болиным, который буквально написал книгу о закрытии (также очень рекомендуется).

Мы все еще обертываем это, используя тот же файл MSBuild. В основном, материал, который мы определяли в группах элементов, перемещается в файл plovr-config.js, и вызов становится намного проще:

<Target Name="Build" DependsOnTargets="Init;FindPlovr">
  <Exec Command="$(Plovr) build plovr-config.js" />
</Target>

Есть и другие интересные функции, поддерживаемые plovr, такие как отчеты о размерах и графические диаграммы модулей, но даже без них мы очень, очень довольны нашей текущей настройкой.

Ответ 2

Наиболее очевидным выбором является YUI Compressor, стабильный и надежный.

У него есть .Net-порт: Yahoo! Библиотека пользовательского интерфейса: Компрессор YUI для .Net Корабли с задачей mbsbuild.

Кроме того, использование оригинальной (Java) так же просто с помощью задачи Exec, единственным недостатком является то, что она имеет зависимость от java.

Ответ 3

Здесь SquishIt Подробности, которые являются временем выполнения компрессор, но сделано довольно хорошо.