Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Msbuild ItemGroup中的动态元数据分配_Msbuild_Metadata_Msbuild 4.0 - Fatal编程技术网

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
。如果你不同意,你能用一个例子来更新你的答案吗?到目前为止,我对语法一无所知。