2017-07-25 90 views
1

我需要使用属性调用msbuild任务,只能在运行时计算什么名称。我试图通过这个脚本如何在内联任务中编辑或添加属性

做的main.xml

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

    <UsingTask TaskName="GetVars" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">   
    <ParameterGroup> 
     <Result ParameterType="System.String" Output="true"/> 
    </ParameterGroup> 
    <Task> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      this.Result = "AAA=123;BBB=456;"; 
     ]]> 
     </Code> 
    </Task> 
    </UsingTask> 

    <PropertyGroup> 
    <Vars></Vars> 
    </PropertyGroup> 

    <Target Name="Make"> 
    <GetVars> 
     <Output TaskParameter="Result" PropertyName="Vars"/> 
    </GetVars> 

    <MSBuild Projects="Proj.xml" Targets="make" Properties="$(Vars)"/> 
    </Target> 
</Project> 

Proj.xml

​​

这个脚本给这个输出:

AAA = 123;BBB=456; 
BBB = 

我预计这样的输出:

AAA = 123; 
BBB = 456; 
+0

请提供一个[MVCE](http://stackoverflow.com/help/mcve),以便其他人可以尝试只是代码的相关部分。无论如何,如果我正确理解你想要什么,这是非常标准的msbuild,也包含在内联任务的文档中:https://msdn.microsoft.com/en-us/library/dd723643.aspx?f=255&MSPPError=-2147217396 。简而言之:如果你想要一个项目而不是一个属性,输出一个数组而不是一个字符串,并使用ItemName =“Vars”。 – stijn

+1

我改变MVC的问题。后来我看起来_items_概念 – Vasek

回答

1

如果您希望联任务产生几个项目(的MSBuild的等值的其他语言的数组或列表的),你应该说明会这样,而不是使用属性(这是一个单一的键/值对)。这包括在一些联机任务documentation - 但是使用全面的ITaskItems,而只是使用一个字符串数组将会。所以:

  • 输出使用ItemName =
  • 通过项目的MSBuild任务(这是它无论如何预计),使用@()符号的内联任务
  • 将其分配给一个项目,而不是物业一System.String[]

在代码:

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

    <UsingTask TaskName="GetVars" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">   
    <ParameterGroup> 
     <Result ParameterType="System.String[]" Output="true"/> 
    </ParameterGroup> 
    <Task> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      this.Result = new System.String[]{"AAA=123", "BBB=456"}; 
     ]]> 
     </Code> 
    </Task> 
    </UsingTask> 

    <Target Name="Make"> 
    <GetVars> 
     <Output TaskParameter="Result" ItemName="Vars"/> 
    </GetVars> 
    <MSBuild Projects="$(MSBuildThisFile)" Targets="Show" Properties="@(Vars)"/> 
    </Target> 

    <Target Name="Show"> 
    <Message Text="AAA = $(AAA)"/> 
    <Message Text="BBB = $(BBB)"/> 
    </Target> 
</Project> 

输出:

Show: 
    AAA = 123 
    BBB = 456