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