我们在一个基于.NET的项目中已经使用了一段时间的Closure Compiler。
最初,我们使用了一个简单的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>
这很简单,我们没有费力寻找任务或尝试投资建立自己的任务。Closure是一个发展迅速的项目,因此最好处于不过度依赖任何第三方构建系统的情况,特别是看起来未得到维护的系统(你提供的任务)。
现在,我用过去时来说话,因为我们的构建系统已经有所迁移。具体而言,随着我们的项目不断增长,将脚本代码的不同部分分成模块变得越来越重要。使用默认的Closure脚本做这件事会非常麻烦。因此,我们决定转向plovr (http://plovr.com/),它使将代码分成模块变得非常简单。plovr目前得到积极维护,并由Michael Bolin创建,他实际上是Closure的专家 (也强烈推荐阅读他的书)。
我们仍然使用相同的MSBuild文件进行包装。基本上,我们在项目组中定义的内容移到了一个名为plovr-config.js的文件中,调用也变得更加简单:
<Target Name="Build" DependsOnTargets="Init;FindPlovr">
<Exec Command="$(Plovr) build plovr-config.js" />
</Target>
plovr支持一些其他很酷的功能,比如大小报告和模块图表,但即使没有这些功能,我们对我们目前的设置非常满意。
<Exec Command=""C:\Program Files (x86)\Java\jre7\bin\java.exe" -jar plovr.jar build plovr-config.js" />
,但在发布项目时一直收到退出代码1的错误提示。 - Ally