В течение некоторого времени мы использовали 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 поддерживает и другие интересные функции, такие как отчеты о размерах и графики модулей, но даже без них мы очень и очень довольны нашей текущей настройкой.