引用目标中 ItemGroup 的元数据定义内众所周知的项目元数据
这是一个 MSBuild 脚本:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="AugmentItemGroup" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<ItemGroup>
<ItmGrp Include="File1.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
<ItmGrp Include="File2.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
<ItmGrp Include="File3.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
</ItemGroup>
<Target Name="AugmentItemGroup">
<ItemGroup>
<ItmGrp Include="File4.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
</ItemGroup>
<Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" />
</Target>
</Project>
我期望它的输出是:
D:\t\File1.txt to dest\File1.txt
D:\t\File2.txt to dest\File2.txt
D:\t\File3.txt to dest\File3.txt
D:\t\File4.txt to dest\File4.txt
但结果是:
D:\t\File1.txt to dest\File1.txt
D:\t\File2.txt to dest\File2.txt
D:\t\File3.txt to dest\File3.txt
D:\t\File4.txt to dest\File1.txt
D:\t\File4.txt to dest\File2.txt
D:\t\File4.txt to dest\File3.txt
为什么当 ItemGroup 时 %(FileName)%(Extension)
众所周知的元数据引用的行为不同是否在目标内部?
是否有可能在目标内部获得“目标外部”行为?
Here's an MSBuild script:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="AugmentItemGroup" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<ItemGroup>
<ItmGrp Include="File1.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
<ItmGrp Include="File2.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
<ItmGrp Include="File3.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
</ItemGroup>
<Target Name="AugmentItemGroup">
<ItemGroup>
<ItmGrp Include="File4.txt">
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
</ItemGroup>
<Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" />
</Target>
</Project>
The output I would expect from it is:
D:\t\File1.txt to dest\File1.txt
D:\t\File2.txt to dest\File2.txt
D:\t\File3.txt to dest\File3.txt
D:\t\File4.txt to dest\File4.txt
But the result is:
D:\t\File1.txt to dest\File1.txt
D:\t\File2.txt to dest\File2.txt
D:\t\File3.txt to dest\File3.txt
D:\t\File4.txt to dest\File1.txt
D:\t\File4.txt to dest\File2.txt
D:\t\File4.txt to dest\File3.txt
Why is the behavior of the %(FileName)%(Extension)
well-known metadata reference is different when an ItemGroup is inside a target?
Is it possible to get the "outside a target" behavior inside a target?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这将给出您想要的输出。尽管在一般情况下这可能不是正确的方法,但它确实通过使自定义元数据成为计算的项目定义的一部分来避免“File4”发生的批处理:
编辑:
如果(如下面的评论所述)每个item 的 %(Dest) 值不同,您只需计算最终值:
摘自 MSBuild 诡计 技巧 #70, 71
This will give the output you desire. Though it may not be the correct approach in the general case, it does avoid the batching that occurs with "File4" by making the custom metadata a part of the item definition that is calculated:
edit:
If (as your comment below says) each item has a different value for %(Dest), you just need to make the final value calculated:
Excerpted from MSBuild Trickery tricks #70, 71