MSbuild减少冗余元数据字符串

MSbuild减少冗余元数据字符串,msbuild,Msbuild,我编写了一个msbuild props文件,如下所示: @(XDTConfig->'%(文件名).template%(扩展名)') @(XDTConfig->'%(文件名)%(扩展名)') @(XDTConfig->'%(文件名)。$(配置)%(扩展名)') @(XDTConfig->'%(RootDir)%(目录)')) 我希望能够将该属性组放在目标范围之外以减少冗余,但如果这样做,似乎没有一个属性能够正确扩展。为什么这些属性不能在项目范围而不是目标范围内扩展 基于Lanorkin的解决

我编写了一个msbuild props文件,如下所示:


@(XDTConfig->'%(文件名).template%(扩展名)')
@(XDTConfig->'%(文件名)%(扩展名)')
@(XDTConfig->'%(文件名)。$(配置)%(扩展名)')
@(XDTConfig->'%(RootDir)%(目录)'))
我希望能够将该属性组放在目标范围之外以减少冗余,但如果这样做,似乎没有一个属性能够正确扩展。为什么这些属性不能在项目范围而不是目标范围内扩展


基于Lanorkin的解决方案

%(文件名).template%(扩展名)
%(文件名)%(扩展名)
%(文件名)。$(配置)%(扩展名)
%(RootDir)%(目录)

我不太确定你想做什么

但是看起来您需要了解
属性
项目
项目元数据

  • 属性
    $
    引用,包含单个值
  • @
    引用,可以近似为数组,数组可以包含多个值
  • 项元数据
    %
    引用,可以被认为是每个
    附带的某种字典
所以,如果您试图在项目范围中声明PropertyGroup,您可能不会在其中包含数组,但看起来这正是您想要做的

您可以尝试将项元数据与现有项相关联,并且仅在任何目标中使用此元数据

以下是msbuild 4的工作示例(以前的版本有自己的魔力):


好极了!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