2012-11-01 61 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>