我正在尝试使用名为“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,以便能够自定义该值。
答案 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: "@(DLLFiles->'$(OutputPath)%(TargetPath)')"" Importance="high" />
我使用Transforms只获取文件名。
<强> 输出: 强>
HintPaths: &#34;箱\推出\ log4net.dll; BIN \发布\ Newtonsoft.Json.dll; BIN \发布\ RabbitMQ.Client.dll; BIN \发布\ ReflectSoftware.Insight.dll&#34;