Интеграция компилятора Google Closure с MS Build на сервере сборки - PullRequest
10 голосов
/ 23 апреля 2011

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

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

Я заинтригован компилятором Google Closure, и я натолкнулся на эту .Net MSBuild Задачу компилятора Google Closure , но, похоже, она не очень широко используется.Есть ли лучшие варианты для использования с MSBuild, используя либо Closure, либо альтернативные инструменты минимизации?

Ответы [ 4 ]

8 голосов
/ 01 мая 2011

В течение некоторого времени мы использовали Closure Compiler в проекте на основе .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).Мы просто использовали разные типы групп элементов для каждой соответствующей части вызова скрипта.

<Target Name="Build" DependsOnTargets="Init;FindCompiler">
  <PropertyGroup Condition="'@(Extern)' != ''">
    <Externs>-f --externs=@(Extern, ' -f --externs=')</Externs>
  </PropertyGroup>
  <PropertyGroup Condition="'@(Define)' != ''">
    <Defines>-f --define=@(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>

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

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

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

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

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

1 голос
/ 29 апреля 2011

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

1 голос
/ 29 апреля 2011

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

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

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

0 голосов
/ 30 апреля 2011

Вы должны увидеть очень похожий вопрос, на который я ответил на Использование Microsoft AJAX Minifier с Visual Studio 2010 одним щелчком мыши опубликовать . Вы должны быть в состоянии использовать детали там, чтобы решить ваши проблемы здесь.

...