【问题标题】:Dynamic Metadata Assignment in an ItemGroupItemGroup 中的动态元数据分配
【发布时间】:2011-07-21 23:50:26
【问题描述】:

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

这可能吗?我是不是找错树了?

【问题讨论】:

    标签: msbuild metadata msbuild-4.0


    【解决方案1】:

    我认为不是,而是尝试将 ItemGroup 传递给任务以生成此元数据。 Property Functions 可以元数据值进行操作,但不幸的是cannot be used to define metadata

    【讨论】:

    • 谢谢。我查看了属性函数,但据我所知,它们不适用于这种情况。也就是说,我不能针对%(ProtoFiles.Filename) 调用String.Replace。如果您不同意,您能否以我将如何执行此操作的示例更新您的答案?到目前为止,语法已经使我难以理解。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2013-05-29
      • 2019-07-19
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多