我将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
任务以获取元数据值。
这可能吗?我吠叫错了树吗?
答案 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>
该任务可以克隆项目数组,计算元数据值,并将其分配给输出项目数组,在此示例中,这将覆盖传递给任务的原始项目数组。