2012-11-01 58 views
2

我想將應用程序部署到服務器列表。我有所有的構建問題照顧,但我有麻煩發佈到服務器列表。我想從一個外部文件中讀取服務器列表,並調用目標傳遞每個服務器的名稱。MSBUILD批處理目標

<ItemGroup> 
    <File Include="$(SolutionFolder)CP\Build\DenormDevServers.txt" /> 
</ItemGroup> 

<Target Name="DeployToServer" Inputs="Servers" Outputs="Nothing"> 
    <Message Text="Deployment to server done here. Deploying to server: @(Servers)" /> 
</Target> 

<Target Name="Test"> 
    <ReadLinesFromFile File="@(File)"> 
     <Output TaskParameter="Lines" ItemName="Servers" /> 
    </ReadLinesFromFile> 

    <CallTarget Targets="DeployToServer" ContinueOnError="true"></CallTarget> 
</Target> 

我似乎無法得到它的「部署」到列表中的每個服務器。輸出如下所示:

Deployment to server done here. Deploying to server: 

請注意,沒有服務器名稱,也不會超過一次。 DenormDevServers.txt中有2行

+0

是否需要MsBuild目標批處理,可以從問題標題中解釋?目標批處理是一種特定的功能,在目標的輸入和輸出之間執行最新檢查,並且在移動到下一個輸入之前調用目標中的所有任務用於單個輸入。 http://msdn.microsoft.com/en-US/library/ms228229(v=vs.80).aspx – fsimonazzi

回答

0

這實現了您的結果。我認爲你嘗試使用任務有點像方法。

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTarget="Test" > 

<ItemGroup> 
    <File Include=".\CP\Build\DenormDevServers.txt" /> 
</ItemGroup> 

<Target Name="DeployToServer" DependsOnTargets="Test"> 
    <Message Text="Deployment to server done here. Deploying to server: @(Servers)" /> 
</Target> 

<Target Name="Test"> 
    <ReadLinesFromFile File="@(File)"> 
     <Output TaskParameter="Lines" ItemName="Servers" /> 
    </ReadLinesFromFile> 
</Target> 
</Project> 
1

您沒有正確使用輸入和輸出。

你的部署目標應該是這個樣子

<Target Name="DeployToServer" Inputs="@(Servers)" Outputs="%(Identity)"> 
    <Message Text="Deployment to server done here. Deploying to server: %(Servers.Identity)" /> 
</Target> 

而且你應該使用依賴,而不是顯式調用的目標,例如

<Target Name="Test" DependsOn="LoadServers;DeployToServer"/> 

並創建一個將文件讀入@(服務器)項目的新目標LoadServers。

輸出=「%(身份)」的原因是在沒有實際執行最新檢查的情況下獲得目標批處理。

0

這將是最乾淨的方法。使用DependsOnTargets確保在DeployToServer之前運行測試目標。

要獲取ItemGroup中每個項目的值,您必須使用%(Identity)。

以下代碼將生成所需的輸出。

<ItemGroup> 
    <File Include="$(SolutionFolder)CP\Build\DenormDevServers.txt" /> 
</ItemGroup> 

<Target Name="DeployToServer" 
     DependsOnTargets="Test"> 
    <Message Text="Deployment to server done here. Deploying to server: %(Servers.Identity)" /> 
</Target> 

<Target Name="Test"> 
    <ReadLinesFromFile File="@(File)"> 
     <Output TaskParameter="Lines" 
       ItemName="Servers" /> 
    </ReadLinesFromFile>  
</Target>