ItemGroup带有关于文件的自定义元数据

10

我正在尝试创建一个名为“文件”(Files)的任务项组,其中包含一个名为“TargetPath”的元数据属性,该属性填充了到文件的相对路径。

示例:
对于以下路径:

D:\Test\Blah.exe
D:\Test\Config\fun.config
D:\Test\en-US\my.resources.dll

输出应为:

文件目标 = Blah.exe
文件目标 = Config\fun.config
文件目标 = en-US\my.resources.dll

这是我的最佳尝试,希望这可以使我的问题更清晰明了:

<ItemGroup>
     <Files Include="d:\test\**\*" >
        <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
     </Files>
 </ItemGroup>

<Message Text="File Target = @(Files->'%(TargetPath)')"/>

我希望“TargetPath”被正确地填充... 目前似乎是 null 或者空值。 有人知道我缺少什么吗?

编辑:

是的,我意识到我可以这样做:

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/>

然而,我正在构建这个ItemGroup以使用ResolveManifestFiles MSBuild任务,该任务要求我构建一个带有TargetPath元数据属性的TaskItem,以便能够自定义该值。

3个回答

8

在创建itemgroup之前,您正在尝试为其分配动态元数据。在您的示例中,无需创建自定义元数据,因为这些信息已经是众所周知的元数据的一部分,所以您只需要执行以下操作:

<ItemGroup>
   <Files Include="d:\test\**\*" ></Files>
</ItemGroup>

<Message Text="File Target = @(Files->'%(RecursiveDir)%(Filename)%(Extension)')"/>  

或者:

<Message Text="File Target = %(Files.RecursiveDir)%(Files.Filename)%(Files.Extension)"/>

编辑:

此示例使用CreateItem任务动态更新项目组:

<ItemGroup>
    <Files Include="d:\test\**\*" ></Files>
</ItemGroup>

<CreateItem
    Include="@(Files)"
    AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output TaskParameter="Include" ItemName="Files"/>
</CreateItem>

我明白你的意思,然而我正试图使用另一个任务,该任务依赖于我传递给它的TaskItems具有这个元数据属性。 - Anderson Imes

3

现代的MSBuild不需要CreateTask(自.NET 3.5起)。

您可以像这样操作:

<ItemGroup>
    <Files Include="d:\test\**\*" />
    <FilesWithMetadata Include="%(Files.Identity)" >
        <TargetPath>%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
    </FilesWithMetadata>
</ItemGroup>

0

我喜欢这样使用CreateItem方法:

  <ItemGroup>
    <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
       <Private>True</Private>
    </Reference>
    ...
  </ItemGroup>

  <CreateItem Include="@(Reference)" Condition="'%(Reference.Private)' == 'True'" AdditionalMetadata="TargetPath=$([System.IO.Path]::GetFileName(%(Reference.HintPath)))">
    <Output TaskParameter="Include" ItemName="DLLFiles"/>
  </CreateItem>

  <Message Text="HintPaths:  &quot;@(DLLFiles->'$(OutputPath)%(TargetPath)')&quot;" Importance="high" />

我正在使用Transforms仅获取文件名。

输出:

HintPaths: "bin\Release\log4net.dll;bin\Release\Newtonsoft.Json.dll;bin\Release\RabbitMQ.Client.dll;bin\Release\ReflectSoftware.Insight.dll"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接