清空 MSBuild ItemGroup

22
有没有一种方法可以删除ItemGroup的内容,而不需要使用目标? 我正在寻找等价于以下内容的东西:
<ItemGroup>
  <MyItemGroup Remove="@(MyItemGroup)"/>
</ItemGroup>

感谢您的选择。
2个回答

18
不,正如文档所述,Remove只能包含在Target内的ItemGroup中。我不确定为什么在你的情况下使用Target会有问题,但如果想要为每个构建配置使用'Remove'步骤,则将其添加到BeforeXXXX AfterXXX钩子之一中,例如BeforeBuild。 ItemGroup 'Remove' 文档 引用:
从.NET Framework 3.5开始,Target元素可以包含ItemGroup元素,这些元素可以包含item元素。这些item元素可以包含Remove属性,该属性从项目类型中删除特定项(文件)。例如,以下XML从Compile项目类型中删除每个.config文件。
<Target>
  <ItemGroup>
    <Compile Remove="*.config"/>
  </ItemGroup>
</Target>

你说得对。在目标以外做这件事是不可能的。我已删除我的回答并选择了你的回答作为有用的 ;) - Ludwo
@Ludwo - 很好知道。我以为我错过了什么。 - Ritch Melton
4
注意:*.config 只会匹配实际存在的文件。假设 @(Compile) 是 A.config;B.config,但只有 A.config 存在。那么在 Remove 之后,@(Compile) 仍将包含 B.config。如果这些项不代表文件,则没有通配符可以使用。 - Paul Williams
3
在一个MSBuild脚本中,如果要删除的是a) 不存在的文件或b) 非文件类型的内容,你需要包含什么? - Ritch Melton
@RitchMelton - MSBuild脚本中有时会使用不代表文件的项;例如,XmlPeek任务的Result输出参数(https://msdn.microsoft.com/en-us/library/ff598684.aspx)。此外,即使对于表示文件的项目,有时也适当使用`Remove`而不查询文件系统;例如,在`Microsoft.Common.CurrentVersion.targets`中的这些行:https://github.com/Microsoft/msbuild/blob/f98d5d96efe032b8990e3c3b404ab2dbd5d6b043/src/Tasks/Microsoft.Common.CurrentVersion.targets#L2978-L2982 - weir

17

现在有了。

MSBuild 15中的新功能

 
       
  • Item元素在目标之外具有新的Update属性。 同时,消除了对Remove属性的限制。
  •  

4
如何操作?你能给我代码吗? - walterlv
4
@walterlv - 这是原始问题中的确切代码 :) - weir

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