Msbuild ItemGroup中的动态元数据分配
我将Msbuild ItemGroup中的动态元数据分配,msbuild,metadata,msbuild-4.0,Msbuild,Metadata,Msbuild 4.0,我将项目组定义为: <ItemGroup> <ProtoFiles Include="Protos\*.proto"/> </ItemGroup> 它将生成项目目录中所有.proto文件的列表。我希望组中的每个项都包含一段元数据,该元数据指定将基于.proto文件生成的文件的名称。我知道我能做到: <ItemGroup> <ProtoFiles Include="Protos\*.proto"> &
项目组定义为:
<ItemGroup>
<ProtoFiles Include="Protos\*.proto"/>
</ItemGroup>
它将生成项目目录中所有.proto文件的列表。我希望组中的每个项都包含一段元数据,该元数据指定将基于.proto文件生成的文件的名称。我知道我能做到:
<ItemGroup>
<ProtoFiles Include="Protos\*.proto">
<OutputFile>%(ProtoFiles.Filename).cs</OutputFile>
</ProtoFiles>
</ItemGroup>
%(ProtoFiles.Filename).cs
但我的问题是,它不是从.proto文件名到输出文件名的简单映射。有一些复杂的逻辑,我需要封装在某个地方,并在分配元数据时调用它。我需要像这样的东西:
<ItemGroup>
<ProtoFiles Include="Protos\*.proto">
<OutputFile><GetOutputFilename ProtoFilename="%(ProtoFiles.Filename)"/></OutputFile>
</ProtoFiles>
</ItemGroup>
其思想是调用我的自定义GetOutputFilename
任务以获取元数据值
这可能吗?我是不是找错树了?我想不是,试着将ItemGroup
传递给任务以生成此元数据。可以对元数据值进行操作,但不幸的是。如果不确切知道它是什么,就很难知道该逻辑对于MSBuild是否太复杂。您是否有在@(ProtoFiles)上运行的自定义任务来生成输出文件?如果是这样的话,为什么不改变你的任务(或者重构成一个新的任务),只计算输出文件而不创建它们,像这样
<ProtoTask
Files="@(ProtoFiles)"
... other params
DryRun="true">
<Output
TaskParameter="OutputFiles"
ItemName="ProtoFiles" />
</ProtoFiles>
任务可以克隆项目数组,计算元数据值,并将其分配给输出项目数组,在这里的示例中,输出项目数组将覆盖传递到任务中的原始项目数组。谢谢。我研究了属性函数,但据我所知,它们不适用于此上下文。也就是说,我不能对%(ProtoFiles.Filename)
调用String.Replace
。如果你不同意,你能用一个例子来更新你的答案吗?到目前为止,我对语法一无所知。