MSbuild减少冗余元数据字符串
我编写了一个msbuild props文件,如下所示:MSbuild减少冗余元数据字符串,msbuild,Msbuild,我编写了一个msbuild props文件,如下所示: @(XDTConfig->'%(文件名).template%(扩展名)') @(XDTConfig->'%(文件名)%(扩展名)') @(XDTConfig->'%(文件名)。$(配置)%(扩展名)') @(XDTConfig->'%(RootDir)%(目录)')) 我希望能够将该属性组放在目标范围之外以减少冗余,但如果这样做,似乎没有一个属性能够正确扩展。为什么这些属性不能在项目范围而不是目标范围内扩展 基于Lanorkin的解决
@(XDTConfig->'%(文件名).template%(扩展名)')
@(XDTConfig->'%(文件名)%(扩展名)')
@(XDTConfig->'%(文件名)。$(配置)%(扩展名)')
@(XDTConfig->'%(RootDir)%(目录)'))
我希望能够将该属性组放在目标范围之外以减少冗余,但如果这样做,似乎没有一个属性能够正确扩展。为什么这些属性不能在项目范围而不是目标范围内扩展
基于Lanorkin的解决方案
%(文件名).template%(扩展名)
%(文件名)%(扩展名)
%(文件名)。$(配置)%(扩展名)
%(RootDir)%(目录)
我不太确定你想做什么
但是看起来您需要了解属性
、项目
和项目元数据
由属性
引用,包含单个值$
由项
引用,可以近似为数组,数组可以包含多个值@
由项元数据
引用,可以被认为是每个%
附带的某种字典项
好极了!1.请解释身份检查的作用2。请评论我编辑的文章的有效性(我设法简化了一点解决方案)1。我只是习惯了,这里其实不需要。基本上,当我使用%(..)表示法时,我让msbuild使用任务批处理,从而迫使它重新计算每个项的值。否则,它只会将相同的值分配给所有Item.MetadataID。同样,情况并非如此。2.(看起来不错)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<!-- Dummy initializations -->
<ItemGroup>
<XDTConfig Include="item1.ext1" />
<XDTConfig Include="item1.ext2" />
<XDTConfig Include="item2.ext2" />
<XDTConfig Include="item2.ext3" />
<XDTConfig Include="item3.ext3" />
</ItemGroup>
<PropertyGroup>
<Configuration>Debug</Configuration>
</PropertyGroup>
<Target Name="InitMetadata">
<!-- Assigning custom metadata to already existing items -->
<ItemGroup>
<XDTConfig Condition="'%(XDTConfig.Identity)' == '%(Identity)'">
<XDTSource>%(Filename).template%(Extension)</XDTSource>
<XDTDest>%(Filename)%(Extension)</XDTDest>
<XDTTrans>%(Filename).$(Configuration)%(Extension)</XDTTrans>
<XDTDir>%(RootDir)%(Directory)</XDTDir>
</XDTConfig>
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="InitMetadata">
<!-- Here we use item metadata for batching Message target -->
<Message Importance="High" Text="Transform: Source = %(XDTConfig.XDTDir)%(XDTConfig.XDTSource), Destination = @(XDTConfig), Transform = %(XDTConfig.XDTDir)%(XDTConfig.XDTTrans)" />
</Target>
</Project>
Transform: Source = D:\temp\msbuild\item1.template.ext1, Destination = item1.ext1, Transform = D:\temp\msbuild\item1.Debug.ext1
Transform: Source = D:\temp\msbuild\item1.template.ext2, Destination = item1.ext2, Transform = D:\temp\msbuild\item1.Debug.ext2
Transform: Source = D:\temp\msbuild\item2.template.ext2, Destination = item2.ext2, Transform = D:\temp\msbuild\item2.Debug.ext2
Transform: Source = D:\temp\msbuild\item2.template.ext3, Destination = item2.ext3, Transform = D:\temp\msbuild\item2.Debug.ext3
Transform: Source = D:\temp\msbuild\item3.template.ext3, Destination = item3.ext3, Transform = D:\temp\msbuild\item3.Debug.ext3