传递项到MSBuild任务

5
我想在我的目标中使用“MSBuild”任务来构建另一个项目,并将当前项目中的一些项(及其元数据)传递到要构建的项目中。
虽然可以使用Properties属性或AdditionalProperties Metadata传递属性,但我找不到传递项的方法。
一种可能的解决方案是将项写入文件并将文件名作为属性传递,但这只会传递项而不包括它们的元数据。
有什么好主意吗?
谢谢。
1个回答

8

编写自定义任务将项目项及其元数据转储到文件中,以供其他进程使用非常简单。但是,不要仅以原始文本形式转储项目项,应该生成一个包含项目项组(带有项目元数据)的有效MSBuild项目文件,并让该生成的文件被导入到由MSBuild任务执行的项目中。您甚至可以使用MSBuild 4.0内联任务来转储文件。

(对评论的回复)

<UsingTask
  TaskName="WriteItemsWithMetadata"
  TaskFactory="CodeTaskFactory"
  AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
  <ParameterGroup>
    <OutputFile ParameterType="System.String" Required="true" />
    <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
  </ParameterGroup>
  <Task>
    <Using Namespace="System.IO" />
    <Code Type="Fragment" Language="cs">
  <![CDATA[
  // This code simplified with specific knowledge
  // of the item metadata names.  See ITaskItem
  // documentation to enable writing out arbitrary
  // meta data values
  //
  using (StreamWriter writer = new StreamWriter(OutputFile))
  {
    writer.Write("<?");
    writer.WriteLine(" version=\"1.0\" encoding=\"utf-8\"?>");
    writer.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"");
    writer.WriteLine("  ToolsVersion=\"4.0\">");
    writer.WriteLine("  <ItemGroup>");

    foreach (var item in Items)
    {
      string meta1 = item.GetMetadata("Meta1");
      string meta2 = item.GetMetadata("Meta2");
      writer.WriteLine("    <CopyItem Include=\"{0}\">", item.ItemSpec);
      writer.WriteLine("      <Meta1>{0}</Meta1>", meta1);
      writer.WriteLine("      <Meta2>{0}</Meta2>", meta2);
      writer.WriteLine("    </CopyItem>");
    }
    writer.WriteLine("  </ItemGroup>");    
    writer.WriteLine("</Project>");    
  }
  ]]>
    </Code>
  </Task>
</UsingTask>

<ItemGroup>
  <OriginalItem Include="A">
    <Meta1>A1</Meta1>
    <Meta2>A2</Meta2>
  </OriginalItem>
  <OriginalItem Include="B">
    <Meta1>B1</Meta1>
    <Meta2>B2</Meta2>
  </OriginalItem>
</ItemGroup>
<Target Name="WriteItemsWithMetadata">
  <WriteItemsWithMetadata
    OutputFile="Out.props"
    Items="@(OriginalItem)"
    />
  <Exec Command="type Out.props" />
</Target>

1
我该如何使用MSBuild 4.0内联任务来转储文件?有没有一种方法可以枚举所有元数据以便写入?WriteLinesToFile任务只能获取文本的“行”。 - Amir Gonnen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接