0

爲了在構建/包/部署過程中縮減一些JS和CSS文件,我已經掌握了Ajax縮小器。這是一個很棒的工具,完全符合我們的需求。但是,將這一功能集成到我們的構建/部署過程中非常困難。TFS構建2010 - 在部署前縮小JS/CSS

理想情況下,我們要運行此工具當我們執行我們的TFS 2010建立一個(即本地(按Ctrl + Shift + B jobbie)建立一個dev的機器)。另外,我們希望在這種情況下用縮小的文件(即在相同的文件名下)替換我們目前的'未縮小'文件,而不是加載名爲'.min.js'的附加文件等。

大量閱讀之後,我認爲關鍵是在工作流程中進行自定義構建任務 - 但我不知道如何解決這個問題 - 特別是當我正在尋找縮小直接從我們的發行版中拉下來的文件時作爲TFS 2010版本的一部分在TFS中分支(即不在某人的本地工作區中)。

這是我找到我想要達到的最接近的討論:Microsoft Ajax Minifier - TFS 2010 Workflow - AjaxMin in the TFS Build

我beleive我需要構建工作流中的自定義代碼活動,但對如何創建一個沒有想法解決這個問題。任何人都可以闡述一個在部署之前允許縮小的過程嗎?

回答

5

確定 - 感謝這些答案和大量的研究......我來到了以下解決方案:)

與自定義代碼活動的開始,我試圖運行從C#代碼minifier然後叫活動作爲工作流程的一部分。這不起作用,因爲.min版本的.dll版本公開了一些壓縮.js和.css文件的方法,然後使您打開某種類型的StreamWriter,並使用從其返回的壓縮字符串重寫該文件該方法(如果你想覆蓋你現有的文件)。相當密集的開放和關閉文件全天,所以我不大滿意該解決方案。使用進程類來運行帶有-clobber選項的.exe(用於覆蓋文件)並不理想,並且產生了一些奇怪的結果(不正確地縮小文件並在每個文件的頭部寫入一些垃圾)。所以,你問,我解決的解決方案是編寫一個PowerShell腳本(我從here得到的開始 - 我稍微修改了一個命令行參數 - 這將是根文件夾。您的項目腳本通過每個文件(每個子目錄中的文件)遞歸去和minifies的.css和.js文件裏面整齊漂亮的骨頭這看起來是這樣的:。

$ScriptDirectory = $args[0] 
Write-Host "Validating directory parameter: $ScriptDirectory" 
Write-Host "" 

if ((Test-Path -path $ScriptDirectory) -ne $True) 
{ 
    #Throw an error of some kind (the parameter passed in isn't a valid directory). 
} 

$Minifier = 「C:\Program Files\Microsoft\Microsoft Ajax Minifier 4\AjaxMin.exe」 

get-childitem $ScriptDirectory -recurse -force -include *.js, *.css -exclude *.min.js, *.min.css | foreach-object {&$Minifier $_.FullName -out $_.FullName -clobber} 

所以我們去通過擴展名爲.js或.css的根文件夾中的每個子項目(忽略.min。*的擴展名,因爲它們已經被壓縮)。

在TFS中,我們所需要做的就是將一個InvokeProcess步驟添加到execute the PowerShell script in TFS。您可以使用InvokeProcess活動的Arguments屬性傳遞參數(目錄中開始縮小)。

要獲取TFS構建在編譯代碼之前編譯代碼的目錄(臨時工作空間,如果您喜歡),可以在構建的Run On Agent序列中使用可用的SourcesDirectory變量。這是您的文件由TFS構建過程編譯和打包的位置,因此在此處縮小的任何內容都將在最終部署包中結束。

PS - 的SourcesDirectory是相當高的了 - 你可能不希望一路從那裏深入到你的.js和.css文件,所以你mgiht需要指定類似:

SourcesDirectory + "/" + "MyProjectFolder/Scripts" 

確保在代碼部署到工作流程之前添加此InvokeProcess步驟,並且嘿-presto - 您將縮小.js和.css文件,這些文件僅將原始文件名稱保留爲TFS構建的一部分,而不是本地文件名稱。

非常感謝所有回答並指出我正確的方向。我希望這可以幫助一路上的人!

1

這樣做是一種自定義的代碼活動,當然是可行的,但你必須付出一些努力。我的建議是:

  1. 首先遵循埃瓦爾德·霍夫曼的TFS 2010自定義的博客http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx學習aboutr創建自定義活動
  2. 然後從同一系列看一看http://www.ewaldhofman.nl/post/2010/06/01/Customize-Team-Build-2010-e28093-Part-10-Include-Version-Number-in-the-Build-Number.aspx實現一種機制,以找到所有文件符合某種模式。在那個例子中,assemblyInfo.cs文件被索引並且它們的內容改變了。通過搜索你的* .js文件來取代。
  3. 在文件選擇上釋放Ajax Minifier的威力,並用縮小的文件替換原始文件。
  4. 構建活動,將其作爲您在TFS 2010中使用的構建過程模板中的一個步驟(也在相同的博客文章中進行介紹),並將其調整到您滿意的程度。

或者,你可以問你已包括在你的問題,分享他與我們創建:-)

請Minifier TFS活動的帖子的作者,讓我知道如何工作了你。

+0

我很樂意分享......但我是爲了工作而做的。但我會爲你們(以及TFS社區擴展)「重寫」它。什麼是最好的地方呢? Git的?引擎收錄? –

1

您需要實現一個Invoke Process Activity,以便Minifier在您的TFS構建期間得到執行。爲了達到這個目的,你還必須在服務器中安裝minifier來完成你的構建,所謂的Build-Agent(s)。通過這樣做,您將確保只在您的TFS構建期間(而不是本地VS構建)調用Minifier。

爲了重命名您生成的輸出文件(* .min.js),您需要實現另一個自定義活動。 覆蓋您簽入的文件需要先讓它們可寫,這意味着另一個自定義活動(我在another answer中提供了一個代碼段)。

整個舞美
調用Minifier與InvokeProcess - >使文件檢查可寫 - >的文件會覆蓋在改名的文件縮小的

在TFS構建中執行此操作的正確方法是將它們包裝在Sequence中。

關於如何實施調用過程的一個很好的介紹性博客文章被發現here
我也發現E.Hofman的series具有實際價值。

+0

謝謝 - 這正是我指出正確的方向。另一個快速的問題 - 我如何才能真正獲得.js和.css文件的路徑,因爲這些文件直接從版本控制下載,並且位於構建代理的某種臨時工作空間中,這是否正確? –

+0

請參閱工具箱中的「Team Foundation構建活動」。在那裏您可以找到「ConvertWorkspaceItem」和「ConvertWorkspaceItems」,它們接受作爲輸入的文件的源控制標記($/...)並將當前實際路徑返回到文件 – pantelif

+0

dont invoke .. .thats沒有管理。您在原始帖子中鏈接的問題是我的。通過電子郵件聯繫我。我會告訴你我是怎麼做到的 –