MSBUILD批量目标

时间:2012-11-01 15:31:05

标签: 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中有两行

3 个答案:

答案 0 :(得分:2)

您没有正确使用输入和输出。

您的部署目标应该类似于

<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,将文件读入@(Servers)项目。

[edit] Outputs =“%(Identity)”的原因是在没有实际执行最新检查的情况下获得目标批处理。

答案 1 :(得分: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>

答案 2 :(得分:0)

这将是最干净的方法。使用DependsOnTargets确保在DeployToServer之前运行Test目标。

要获取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>