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

时间:2010-01-06 02:48:28

标签: msbuild

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

例:
对于这些路径:

  

d:\测试\ Blah.exe
  d:\测试\配置\ 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 个答案:

答案 0 :(得分:8)

您尝试在创建项目组之前将其分配给项目组。在您的示例中,不需要创建自定义元数据,因为此信息已经是众所周知的元数据的一部分,因此您可以这样做:

<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>

答案 1 :(得分:3)

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

你可以这样做:

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

答案 2 :(得分: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:   &#34;箱\推出\ log4net.dll; BIN \发布\ Newtonsoft.Json.dll; BIN \发布\ RabbitMQ.Client.dll; BIN \发布\ ReflectSoftware.Insight.dll&#34;