MSBuild错误:元素<ProjectReference>中的属性“Remove”未被识别。

4
我将尝试设置一个 .csproj 文件,其中包含一个条件项组,该项组将删除 <ProjectReference> 项组中的所有元素。
例如:
<ItemGroup>
   <ProjectReference Include="..\..\..\..\Projects\Registrar\Ucsb.Sa.Registrar.Common\Ucsb.Sa.Registrar.Common\Ucsb.Sa.Registrar.Common.csproj">
      <Project>{1EDDDE57-0181-41B4-B2AE-FB76450F85C8}</Project>
      <Name>Ucsb.Sa.Registrar.Common</Name>
   </ProjectReference>
</ItemGroup>
<ItemGroup Condition="$(OnBuildServer) == 'true'">
   <ProjectReference Remove="*" />
</ItemGroup>
<ItemGroup Condition="$(OnBuildServer) == 'true'">
   <Reference Include="Ucsb.Sa.Registrar.Common">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>$(RegCommonDll)</HintPath>
   </Reference>
</ItemGroup>

但是,当我将项目加载到VS 2008中时,会出现错误消息“元素中的属性“Remove”无法识别”。奇怪的是,Remove属性在模式(C:\ Program Files \ Microsoft Visual Studio 9.0 \ Xml \ Schemas \ 1033 \ MSBuild \ Microsoft.Build.Core.xsd)中存在。有关此属性的MSDN文档(http://msdn.microsoft.com/en-us/library/bb651786.aspx)。并且,在名为“MSBuild Items”的MSDN文章底部有关于它的评论。

.csproj文件似乎指向.NET 3.5;但是我无法验证是否使用该版本的msbuild来加载项目(有人知道如何做吗?)

.csproj文件的第一行:

<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

PS. 我从Build with msbuild and dynamically set project references中得到了使用条件语句的想法。


我还尝试将注册表键更改为默认值3.5。这些键不配置Visual Studio,而是在创建新项目时配置默认值(http://msdn.microsoft.com/en-us/library/bb397428.aspx,\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\3.5\,\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0\)。当然,这并没有起作用。我还检查了PATH环境变量,并将所有对2.0目录的引用替换为3.5。同样,这也没有产生解决方案。 - smaglio81
1个回答

13

更新

在 MSBuild 15 中添加了对目标以外的支持的移除操作,我的下面的答案现在已经过时。

Remove 属性可以从项目类型中删除特定的项(文件)。该属性在 .NET Framework 3.5 中被引入(仅限于目标内)。自 MSBuild 15.0 开始支持目标内外的使用。

原始回答

参考https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-items?view=vs-2022#BKMK_RemoveAttribute

你不能在静态项上使用Remove属性。静态项是在目标之声明的那些项。你只能在动态项目声明内部使用此属性。动态项目声明是在目标内找到的那些项目。例如,请查看以下构建脚本。

<Project ToolsVersion="3.5" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  
  <ItemGroup>
    <ProjectReference  Include="One.dll"/>
  </ItemGroup>
  <Target Name="Demo">
    <ItemGroup>
      <ProjectReference  Remove="@(ProjectReference)"/>
    </ItemGroup>
    <Message Text="ProjectReference : @(ProjectReference)"/>
  </Target>
</Project>

请注意,不要使用Remove="*"来删除所有内容,它只会删除当前目录中包含在ProjectReference项目组中的每个文件。如果您想清除一个项目,必须执行Remove="@(ProjectReference)",其中ProjectReference是该项目的名称。


有没有办法删除静态项目? - citizenmatt
@citizenmatt 你可以在一个目标中使用 ItemGroup 来实现这个,但是你不能在目标外部使用 Remove 来操作 ItemGroup。 - Sayed Ibrahim Hashimi
这正是我担心的。谢谢! - citizenmatt
@SayedIbrahimHashimi,这在最新的MSBuild(17)中仍然是这种情况吗?文档表明确实是这种情况:https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-items?view=vs-2022#attributes-for-items-in-an-itemgroup-of-a-target - Ohad Schneider
不用等,现在我看到它说“从MSBuild 15.0开始支持内部和外部目标”。 - Ohad Schneider
1
@OhadSchneider 是的,那是真的,我已经更新了我的答案来表明这一点。谢谢。 - Sayed Ibrahim Hashimi

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