10

我正在研究如何将JavaScript文件作为CI过程的一部分进行缩小,以便我们可以在开发中使用未缩小的文件,并在部署时自动压缩它们登台和在线服务器。在构建服务器上集成Google Closure Compiler与MS Build在编译服务器上构建

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

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

回答

8

我们已经在基于.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 [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> 

这很简单,我们没有打扰寻找任务,或试图投资建设自己的。关闭是一个相当快速的项目,所以在不过分依赖任何第三方构建系统的情况下,尤其是那些看起来没有维护的项目(您链接的任务),这是很好的。

现在,我一直在讲过去式,因为我们的构建系统已经迁移了一下。具体而言,随着我们的项目不断发展,将脚本代码的不同部分划分为模块变得越来越重要。使用开箱即用的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支持的其他一些很酷的功能,如大小报告和模块图表,但即使没有这些图表,我们对目前的设置也非常满意。

+0

感谢您的详细解答。我们会试试这个。 – 2011-05-04 20:18:39

+0

如果有人感兴趣,我为闭包编译器写了一个快速而脏的MSBuild任务。主要的兴趣点是它使用.Net版本的编译器(使用IKVM),所以它运行在进程中 - https://github.com/unintelligible/ClosureCompilerMsBuild(它也可以选择提交到托管编译器,尽管进程中的版本显然要快得多。) – zcrar70 2011-07-07 14:41:43

+0

我是MSBuild的总noob,但我无法弄清楚如何使你的代码在那里与plovr一起工作。我该如何填充$(Plovr)。我尝试了直接命令行:'但保留当我发布我的项目时获得退出代码1。 – Ally 2014-03-28 21:07:50