我正在研究将javascript文件压缩为CI过程的一部分的方法,以便我们可以在开发中使用未压缩的文件,并在将它们部署到暂存服务器和实时服务器时将其自动压缩。

这是针对ASP.NET网站的;我们使用Hudson作为构建服务器。

我对Google Closure编译器很感兴趣,并且遇到了这个.Net MSBuild Google Closure Compiler Task,但它似乎并未得到广泛使用。使用闭包或替代的缩小工具,是否可以与MSBuild一起使用更好的选择?

最佳答案

我们已经在基于.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还支持其他一些很酷的功能,例如尺寸报告和模块图,但是即使没有这些功能,我们对当前的设置也非常满意。

关于msbuild - 在构建服务器上将Google Closure编译器与MS Build集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5765496/

10-11 07:10