Msbuild 在目标中的ItemGroup的元数据定义中引用已知的项元数据
下面是一个MSBuild脚本:Msbuild 在目标中的ItemGroup的元数据定义中引用已知的项元数据,msbuild,metadata,target,msbuild-4.0,itemgroup,Msbuild,Metadata,Target,Msbuild 4.0,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">
<?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\File1.txt
D:\t\File4.txt to dest\File2.txt
D:\t\File4.txt to dest\File3.txt
当项目组位于目标内部时,%(文件名)%(扩展名)
众所周知的元数据引用的行为为何不同
有可能在目标内部获得“目标外部”行为吗?这将提供您想要的输出。虽然在一般情况下这可能不是正确的方法,但它确实避免了“File4”中出现的批处理,因为它将自定义元数据作为计算的项定义的一部分:
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="AugmentItemGroup"
ToolsVersion="4.0">
<ItemDefinitionGroup>
<ItmGrp>
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
</ItemDefinitionGroup>
<ItemGroup>
<ItmGrp Include="File1.txt" />
<ItmGrp Include="File2.txt" />
<ItmGrp Include="File3.txt" />
</ItemGroup>
<Target Name="AugmentItemGroup">
<ItemGroup>
<ItmGrp Include="File4.txt" />
</ItemGroup>
<Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" />
</Target>
</Project>
<Project ...>
<ItemDefinitionGroup>
<ItmGrp>
<_Dest />
</ItmGrp>
</ItemDefinitionGroup>
<ItemGroup>
<ItmGrp Include="File1.txt"><Dest>dest1</Dest></ItmGrp>
<ItmGrp Include="File2.txt"><Dest>dest2</Dest></ItmGrp>
<ItmGrp Include="File3.txt"><Dest>dest3</Dest></ItmGrp>
</ItemGroup>
<Target Name="AugmentItemGroup">
<ItemGroup>
<ItmGrp Include="File4.txt"><Dest>dest4</Dest></ItmGrp>
<ItmGrp>
<_Dest>%(Dest)\%(FileName)%(Extension)</_Dest>
</ItmGrp>
</ItemGroup>
<Message Text="%(ItmGrp.FullPath) to %(ItmGrp._Dest)" />
</Target>
</Project>
dest\%(文件名)%(扩展名)
编辑:
如果(如您下面的评论所述)每个项目的%(Dest)值不同,您只需计算最终值:
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="AugmentItemGroup"
ToolsVersion="4.0">
<ItemDefinitionGroup>
<ItmGrp>
<Dest>dest\%(FileName)%(Extension)</Dest>
</ItmGrp>
</ItemDefinitionGroup>
<ItemGroup>
<ItmGrp Include="File1.txt" />
<ItmGrp Include="File2.txt" />
<ItmGrp Include="File3.txt" />
</ItemGroup>
<Target Name="AugmentItemGroup">
<ItemGroup>
<ItmGrp Include="File4.txt" />
</ItemGroup>
<Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" />
</Target>
</Project>
<Project ...>
<ItemDefinitionGroup>
<ItmGrp>
<_Dest />
</ItmGrp>
</ItemDefinitionGroup>
<ItemGroup>
<ItmGrp Include="File1.txt"><Dest>dest1</Dest></ItmGrp>
<ItmGrp Include="File2.txt"><Dest>dest2</Dest></ItmGrp>
<ItmGrp Include="File3.txt"><Dest>dest3</Dest></ItmGrp>
</ItemGroup>
<Target Name="AugmentItemGroup">
<ItemGroup>
<ItmGrp Include="File4.txt"><Dest>dest4</Dest></ItmGrp>
<ItmGrp>
<_Dest>%(Dest)\%(FileName)%(Extension)</_Dest>
</ItmGrp>
</ItemGroup>
<Message Text="%(ItmGrp.FullPath) to %(ItmGrp._Dest)" />
</Target>
</Project>
目的地1
目的地2
目的地3
目的地4
%(目标)\%(文件名)%(扩展名)
摘自技巧#70,71对我来说,这种方法的问题是“dest”部分会因项目而异,因此不能将相同的定义应用于组中的所有项目。那么,请尝试上面的第二种方法。注意Dest vs.u Dest的使用这帮我完成了一项完全不同的任务,谢谢。另外,对于图书链接,我打算买下它。