【问题标题】:Integrating Google Closure Compiler with MS Build on a build server在构建服务器上将 Google Closure Compiler 与 MS Build 集成
【发布时间】:2011-08-11 13:13:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: msbuild continuous-integration minify google-closure-compiler google-closure


    【解决方案1】:

    我们在一个基于 .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 任务。主要兴趣点是它使用 .Net 版本的编译器(使用 IKVM),因此它在进程内运行 - github.com/unintelligible/ClosureCompilerMsBuild(它还可以选择提交到托管编译器,尽管是进程内版本显然要快很多。)
    • 我是 MSBuild 的菜鸟,但我不知道如何让你的代码与 plovr 一起工作。我用什么填充 $(Plovr)。我试过直接&lt;Exec Command="&amp;quot;C:\Program Files (x86)\Java\jre7\bin\java.exe&amp;quot; -jar plovr.jar build plovr-config.js" /&gt;,但是当我发布我的项目时,我一直收到退出代码1。
    【解决方案2】:

    您应该看到我在Using Microsoft AJAX Minifier with Visual Studio 2010 1-click publish 回答的一个非常相似的问题。您应该可以使用那里的详细信息来解决这里的问题。

    【讨论】:

      【解决方案3】:

      SquishItDetails 是一个运行时压缩器,但做得很好。

      【讨论】:

        【解决方案4】:

        最明显的选择是YUI Compressor,稳定可靠。

        它有一个 .Net 端口:Yahoo! UI Library: YUI Compressor for .Net 带有 mbsbuild 任务的船舶。

        另外,使用原始(Java)是just as easy使用Exec任务,唯一的缺点是它有java依赖。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-19
          • 1970-01-01
          • 2010-10-30
          • 2014-07-04
          • 2014-10-15
          • 2011-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多