1

我有一个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任务将被调用以获取元数据值。

这可能吗?我在吠叫错误的树吗?

4

2 回答 2

1

我认为不是,而是尝试将 传递ItemGroup给任务以生成此元数据。属性函数可以元数据值进行操作,但遗憾的是不能用于定义元数据

于 2011-07-21T13:27:16.910 回答
1

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

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

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

于 2011-07-21T15:50:26.523 回答