2012-10-12 70 views
6

我在使用節點縮小和連接javascript文件的Web項目上有一個預生成事件。這會在腳本文件夾中創建一個名爲BuiltScripts的文件夾,該文件夾是腳本文件夾的副本,但文件被縮小。當我進行部署時,我想發佈包含BuiltScripts文件夾的腳本文件夾。爲了實現這一點,我已經將BuiltScripts文件夾添加到項目中。這不是一個理想的解決方案,因爲:MSBuild:部署未包含在項目中的文件

  1. 我必須檢出BuiltScripts文件夾才能構建,因爲其中的文件是隻讀的,因爲解決方案是在源代碼控制之下。因爲我檢出了很多文件,所以在簽入時會造成麻煩。
  2. 當我向項目中添加一個新文件時,我必須確保記得將它添加到BuiltScripts文件夾中,否則將不會部署該文件的內置版本。
  3. 我的構建將在構建服務器上失敗,因爲BuiltScripts文件夾中的文件也只能在這裏讀取。
  4. 在搜索文件和執行基於文本的搜索時,遇到兩個具有相同名稱的文件副本是個問題。

我想構建服務器構建和minifi JavaScript文件作爲預構建步驟,但我不想將BuiltScripts文件夾添加到項目。但是,當構建服務器將項目打包到最後時,我希望它將BuildScripts文件夾與構建過程的輸出一起復制。我怎樣才能做到這一點?

+0

你用什麼來部署\發佈 - 這是標準的msbuild目標或你做了一些自定義? –

+0

@AlexeyShcherbak MSBuild,TFS,自定義 –

+0

我懷疑Sayed Ibrahim Hashimi在回答你的問題後寫了這篇文章:)。 http://sedodream.com/2012/10/09/VSWebPublishHowToIncludeFilesOutsideOfTheProjectToBePublished.aspx –

回答

5

而不是使用項目屬性的預生成事件(我認爲是你的意思),重寫.csproj/.vbproj文件中的BeforeBuild目標。

<Project ...> 
    ... 
    <Target Name="BeforeBuild"> 
    <!-- Create the 'BuildScripts' directory. --> 
    <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to --> 
    <!-- use for these kinds of things. --> 
    <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts"> 
     <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" /> 
    </MakeDir> 
    <!-- Execute the javascript minifier. --> 
    <Exec Command="..." /> 
    <!-- Create an item group for the minified scripts so we manipulate the target path. --> 
    <CreateItem Include="$(BuildScriptsPath)\*.js"> 
     <Output ItemName="BuiltScripts" TaskParameter="Include" /> 
     <Output ItemName="FileWrites" TaskParameter="Include" /> 
    </CreateItem> 
    <!-- Add the minified scripts to the Content item group, --> 
    <!-- which the deployment MSBuild inspects for files to deploy. --> 
    <CreateItem Include="@(BuiltScripts)" 
     AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)"> 
     <Output ItemName="ContentWithTargetPath" TaskParameter="Include" /> 
    </CreateItem> 
    </Target> 
    ... 
</Project> 

您可能必須與該是CreateItem任務的輸出,如果文件沒有部署到正確的目錄內容項目組的形狀玩。請注意,我使用了一個項目轉換來製作目標路徑scripts\YourScript.js

另請注意,第一個CreateItem任務將輸出填充到名爲「FileWrites」的項目組中。我發現Clean目標檢查該項目組以知道要刪除的文件。

將XML放入您的項目文件<Import>元素,你應該很好去。不需要簽入源代碼控制,甚至你的構建服務器也會很開心。

+0

你會添加一個步驟來刪除以前的BuiltScripts文件夾內容嗎? –

+0

我運行我的示例代碼,它看起來像IncrementalClean目標將自動刪除文件,因爲它們包含在FileWrites項目組中,這在您刪除.js文件並且您不希望它再被部署時很有用。 – Matt

0

難道你不能使用後生成事件來運行腳本來做你想做的事嗎?我用一個將我的輸出文件移動到與項目完全無關的位置。無論是簡單批處理,VBScript/JScript還是PowerShell,您都可以做任何您想做的事情。

0

我有類似的需求,儘管它只涉及將現有文件添加到部署包而不是生成它們作爲構建的一部分。我發現this page的技術很有用。

相關問題