【问题标题】:MSBuild Error: The attribute "Remove" in element <ProjectReference> is unrecognizedMSBuild 错误:元素 <ProjectReference> 中的属性“删除”无法识别
【发布时间】:2010-11-13 13:38:25
【问题描述】:

我正在尝试设置一个 .csproj 文件以具有一个条件项组,它将删除 项组中的所有元素。

例如:

<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)。并且,在底部有一个关于它的评论MSDN 文章标题为“MSBuild Items”。

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

.csproj 文件的第一行:

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

附言。我想到了使用来自Build with msbuild and dynamically set project references的条件句

【问题讨论】:

  • 我还尝试将注册表项更改为默认值 3.5。这些键不配置 Visual Studio,而是在创建新项目时配置默认值(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。同样,这并没有产生解决方案。

标签: .net visual-studio visual-studio-2008 msbuild


【解决方案1】:

您不能将 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 您可以使用目标中的 ItemGroup 执行此操作,但您不能在目标之外的 ItemGroup 上使用 Remove。
  • 这就是我害怕的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2014-01-13
相关资源
最近更新 更多