ItemGroup中的动态元数据分配

时间:2011-07-21 13:21:47

标签: msbuild metadata msbuild-4.0

我将ItemGroup定义为:

<ItemGroup>
    <ProtoFiles Include="Protos\*.proto"/>
</ItemGroup>

它会生成项目目录中所有 .proto 文件的列表。我希望组中的每个项都包含一段元数据,用于指定将根据 .proto 文件生成的文件的名称。我知道我可以这样做:

<ItemGroup>
    <ProtoFiles Include="Protos\*.proto">
        <OutputFile>%(ProtoFiles.Filename).cs</OutputFile>
    </ProtoFiles>
</ItemGroup>

但我的问题是,它不是从 .proto 文件名到输出文件名的简单映射。涉及到一些棘手的逻辑,我需要在某处封装并在分配元数据时调用它。我需要这样的东西:

<ItemGroup>
    <ProtoFiles Include="Protos\*.proto">
        <OutputFile><GetOutputFilename ProtoFilename="%(ProtoFiles.Filename)"/></OutputFile>
    </ProtoFiles>
</ItemGroup>

我的想法是调用我的自定义GetOutputFilename任务以获取元数据值。

这可能吗?我吠叫错了树吗?

2 个答案:

答案 0 :(得分:1)

我认为不是,请尝试将ItemGroup传递给任务以生成此元数据。 Property Functions可以在 元数据值上运行,但遗憾的是cannot be used to define metadata

答案 1 :(得分:1)

很难知道MSBuild的逻辑是否过于棘手而不确切知道它是什么。您是否有自定义任务在@(ProtoFiles)上运行以生成输出文件?如果是这样,为什么不改变你的任务(或重构为新的)只计算输出文件而不创建它们,像这样,

<ProtoTask
   Files="@(ProtoFiles)"
   ... other params
   DryRun="true">
   <Output
      TaskParameter="OutputFiles"
      ItemName="ProtoFiles" />
</ProtoFiles>

该任务可以克隆项目数组,计算元数据值,并将其分配给输出项目数组,在此示例中,这将覆盖传递给任务的原始项目数组。