2014年7月29日 星期二

如何透過MSBuild 的過程中 COPY 檔案

最近有一個內部專案

我們想要利用 TFS 進行 自動化建置部署


所以開始動工吧!

我們新增一個組建

圖1


圖2

圖3

設定MSBuild的Config 如下:

/P:VisualStudioVersion=12.0 /P:DeployOnBuild=True /P:DeployTarget=MSDeployPublish /P:MsDeployServiceUrl=https://TESTWEB2:8172/msdeploy.axd /P:AllowUntrustedCertificate=True  /P:MSDeployPublishMethod=WMSvc /P:DeployIisAppPath=xxxxx   /P:CreatePackageOnPublish=True   /P:UserName=帳號/P:Password=密碼

接下來測試一下!
新增一個佇例一個新的組建。



完成後發現,程式是無法執行的原因是

缺少DLL檔

所以我們必需要針對MSBuild進行客製化,將我們需要的檔案移轉到我們要進行Deploy的Package的目錄,讓部署的時侯可以包含這些檔案。

但是如何客製化呢?
請這樣做

先卸載專案

編輯專案檔
請在文件最後面的地方加上


 
<ItemGroup  >
    <BinFiles Include="$(OutDir)**\*.dll" />
    <SourceFile Include="@(BinFiles)" />
 </ItemGroup>
  
<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <Message Text="Test COPY Binaries Dll Start"/>
    <Copy SourceFiles="%(SourceFile.FullPath)" DestinationFolder="$(_PackageTempDir)\bin" Condition="$([System.String]::Copy(%(SourceFile.Filename)).Contains('關鍵字'))" />
    <Message Text="Test COPY Binaries Dll End"/></Target>

上面的行為如下:

我們定義二個 itemgroup 分別為:BinFiles 、SourceFile
BinFiles 我們定義的是MSBuild時,產生的路徑中全部的DLL檔案
SourceFile 我們定義的是使用 BinFiles的路徑

接下來 目標 Target 動作

我們定義了二個properties
 AfterTargets(在這個事件之後) CopyAllFilesToSingleFolderForMsdeploy 我們要執行下列動作
Name AdditionalFilesForPackage 這個是在LOG會顯示的TAG

Message: 顯示在LOG上的訊息
Copy:我們要COPY的檔案路徑、目標位置、條件
詳細內容請參考 :MSDN

以上動作就會將DLL COPY到PackageTempDir 讓MSDeploy進行封裝的動作。

比較困難的地方是語法的設定,因為MSDN上也沒有寫的非常的清楚。