有没有更新MSBuild项目元数据值的方法?

4

我需要更新项目元数据值。将值进行添加很容易:

<ItemDefinitionGroup>
  <ClCompile>
    <PreprocessorDefinitions>FOO;BAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  </ClCompile>
</ItemDefinitionGroup>

然而,我需要做的是删除部分数值。理想情况下,以下代码可以实现此功能,但它并不能实现:
<ItemDefinitionGroup>
  <ClCompile>
    <PreprocessorDefinitions>%(PreprocessorDefinitions.Replace('FOO;',''))</PreprocessorDefinitions>
  </ClCompile>
</ItemDefinitionGroup>

有没有办法在MSBuild 4中完成这个任务?
2个回答

2

我曾试图做同样的事情,虽然我无法弄清如何从字符串中去除定义,但我发现了一个额外的属性:UndefinePreprocessorDefinitions

<ItemDefinitionGroup>
  <ClCompile>
    <UndefinePreprocessorDefinitions>FOO</UndefinePreprocessorDefinitions>
  </ClCompile>
</ItemDefinitionGroup>

这将取消之前对FOO的定义。即使看起来有点傻,将-DFOO -UFOO传递给编译器而不是什么都不传也可以正常工作。

1
在后续的ItemDefinitionGroup中,您可以创建当前元数据的副本,然后调用Replace
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Dump" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemDefinitionGroup>
    <SomeItem>
      <SomeMetaData>foo,bar,baz</SomeMetaData>
    </SomeItem>
  </ItemDefinitionGroup>

  <ItemGroup>
    <SomeItem Include="one;two" />
  </ItemGroup>

  <ItemDefinitionGroup>
    <SomeItem>
      <!-- Remove "bar" -->
      <SomeMetaData>$([System.String]::Copy('%(SomeMetaData)').Replace('bar',''))</SomeMetaData>
    </SomeItem>
  </ItemDefinitionGroup>

  <Target Name="Dump">
    <Message Text="SomeItem.SomeMetaData: @(SomeItem -> '%(Identity)=%(SomeMetaData)') " />
  </Target>
</Project>

使用MSBuild 14运行时的输出如下:

 > MSBuild .\foo.proj
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 2/17/2017 7:09:48 PM.
Project "D:\temp\mb\foo.proj" on node 1 (default targets).
Dump:
  SomeItem.SomeMetaData: one=foo,,baz;two=foo,,baz
Done Building Project "D:\temp\mb\foo.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.03

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接