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