【问题标题】:MSBuild says 'Label' attribute unrecognized only when I import a particular targets file仅当我导入特定目标文件时,MSBuild 才说“标签”属性无法识别
【发布时间】:2015-02-04 17:20:16
【问题描述】:

当我一起使用以下导入时:

<Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" Label="SlowCheetah" />
<Import Project="$(SolutionDir)\packages\SpecFlow.1.9.0\tools\TechTalk.SpecFlow.targets" Condition="Exists('$(SolutionDir)\packages\SpecFlow.1.9.0')" />

我得到这个构建错误:

元素 中的“标签”属性无法识别

我可以从第一个 Import 元素中删除 Label 属性或完全删除第二个 import 元素以消除错误。

有人可以解释发生了什么吗?似乎第二个目标文件的内容正在改变正在使用的 MSBuild 版本......不知何故。

注意:您可以通过将 SlowCheetah 和 Specflow NuGet 包添加到您的项目中来获得这些目标。

【问题讨论】:

标签: msbuild


【解决方案1】:

虽然表现为 MsBuild 错误,但这确实是 SpecFlow 的问题(检查完整错误,行号指向 TechTalk.SpecFlow.targets,它调用从 TechTalk.SpecFlow 中的 specflow.exe 导入的 GenerateAll 任务。任务):SpecFlow 的 NuGet 包的 dll 是针对不支持 PropertyGroup 上的 Label 属性的 .Net35 构建的。因此,当您将一个项目文件传递给它时,就像您的项目文件一样,该文件恰好包含这样的 Label 某处 specflow 失败。

SpecFlow 声称可以与 .Net40 一起使用,因此您可以自己从源代码构建针对 .Net40 的 NuGet 包,然后使用它而不是在线版本。或者使用 SpecFlow 提出支持请求:毕竟 .Net35 已经很老了。

【讨论】:

  • 所以 MSBuild 在遇到 .Net4 之前的二进制文件时会切换版本?
  • 不完全是。实际上 msbuild 本身与错误没有太大关系:它只是显示它。错误本身是在解析项目文件的 SpecFlow 代码中生成的,而不是在 msbuild 中生成的。现在解析代码可能使用来自 .Net 命名空间的一些类,例如 Microsoft.Build.BuildEngine,msbuild 很可能也使用这些类,但这是错误和 msbuild 之间的唯一联系。
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2022-01-05
  • 2017-05-08
相关资源
最近更新 更多