MSBuild说';标签';只有在导入特定目标文件时,属性才无法识别

MSBuild说';标签';只有在导入特定目标文件时,属性才无法识别,msbuild,Msbuild,当我同时使用以下导入时: <Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" Label="SlowCheetah" /> <Import Project="$(SolutionDir)\packages\SpecFlow.1.9.0\tools\TechTalk.SpecFlow.targets" Condition="Exists('$(SolutionDir

当我同时使用以下导入时:

<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')" />

我得到这个生成错误:

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

我可以从第一个导入元素中删除Label属性,或者完全删除第二个导入元素以消除错误

有人能解释一下发生了什么事吗?似乎第二个目标文件的内容正在以某种方式更改正在使用的MSBuild的版本


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

虽然表现为MsBuild错误,但这确实是Specflow的问题(检查完整错误,行号指向TechTalk.SpecFlow.targets,它在其中调用GenerateAll任务,该任务是从TechTalk.SpecFlow.tasks中的SpecFlow.exe导入的):SpecFlow的NuGet包的DLL是基于.Net35构建的,该.Net35不支持
PropertyGroup
上的
Label
属性。因此,当您传递给它一个项目文件(如您的项目文件)时,它恰好包含SpecFlow失败的某个地方的此类标签


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

请参见此处的答案:@AlexeyShcherbak的可能重复,该答案不适用,因为实验室el属性在我添加另一个导入之前是有效的。Visual Studio是否正在更改我的MSBuild版本?@stijn,该答案不适用,因为在我添加另一个导入之前,label属性是有效的。Visual Studio是否正在更改我的MSBuild版本?我无法复制此内容。我只是将某些项目文件中显示的代码粘贴到了不同的位置和位置它从不抱怨。因此,请添加更多信息:VS version,项目文件中的这些导入位置,…因此MSBuild在遇到.Net4之前的二进制文件时会切换版本?不完全如此。事实上,MSBuild本身与错误没有多大关系:它只是显示错误。错误本身是在分析项目f的SpecFlow代码中生成的现在,解析代码可能使用了.Net命名空间中的某些类,如Microsoft.Build.BuildEngine,msbuild也可能使用这些类,但这是错误与msbuild之间的唯一链接。