我需要更新项目元数据值。 添加很容易达到值:
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>FOO;BAR;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
但是,我需要做的是删除部分值。理想情况下,这样的事情会起作用,但事实并非如此:
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>%(PreprocessorDefinitions.Replace('FOO;',''))</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
有没有办法在MSBuild 4中完成此任务?
答案 0 :(得分:2)
我试图做同样的事情,虽然我无法弄清楚如何从字符串中删除定义,但我确实发现了一个额外的属性:UndefinePreprocessorDefinitions
。
<ItemDefinitionGroup>
<ClCompile>
<UndefinePreprocessorDefinitions>FOO</UndefinePreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
这将取消先前对FOO的定义。将-DFOO -UFOO
传递给编译器而不是一无所有可能看起来有些愚蠢,但它的工作原理也一样。
答案 1 :(得分:1)
在随后的ItemDefinitionGroup
中,您可以create a copy当前元数据,然后在其上调用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