MSBuild 15.0(Visual Studio 2017)错误MSB4067适用于SSDT(SSRS和SSAS)项目:“元素<Project>下面的<State>元素未被识别”。

14

MSBuild 14.0(包含在Visual Studio 2015中的版本)在构建包含SSDT项目(rptproj或dwproj项目)的解决方案时记录警告(MSB4078)。例如:

警告MSB4078:项目文件“Reports.rptproj”不受MSBuild支持,因此无法构建。

这很好,MSBuild不支持SSDT项目,我们必须使用Visual Studio(即devenv.com)来构建它们。例如,请参见this answer

然而,当使用MSBuild 15.0(包含在Visual Studio 2017中的版本)构建相同的解决方案文件时,会出现以下错误

Reports.rptproj(3,3):错误MSB4067:元素<State>在元素<Project>下不被识别。

虽然我可以从构建配置中删除SSDT项目,但这并不理想,因为我希望在从Visual Studio内部构建解决方案时构建它们。

有没有办法将错误 MSB4067 降级为警告,或在构建解决方案时跳过某些项目?


1
与其供应商交谈。由于MSBuild现在是开源的,您可以在其GitHub存储库中执行此操作。 - Lex Li
谢谢 - 我现在已经在 MSBuild GitHub 存储库上提出了一个问题(https://github.com/Microsoft/msbuild/issues/2064)。 - Andrew Bennet
2个回答

15

更新(2017年10月)

Visual Studio的最新版本Microsoft Reporting Services Projects (1.18)增加了对SSRS项目的MSBuild支持。安装后,SSRS项目可以更新为MSBuild支持的格式,从而避免了这个问题的发生。


原回答

这是MSBuild 15中的错误,标记为“基础更新2”修复。

一个MSBuild维护者在GitHub问题线程中提供的解决方法是:

在与您的.sln文件相邻的地方放置以下内容的文件,并给其特殊名称:

after.{yoursolutionname}.sln.targets

<Project InitialTargets="WorkAroundMSBuild2064">
 <Target Name="WorkAroundMSBuild2064">
  <!-- Work around https://github.com/Microsoft/msbuild/issues/2064 by
   removing *.rptproj from the generated solution metaproject. -->
  <ItemGroup>
   <ProjectReference Remove="%(ProjectReference.Identity)"
                 Condition="'@(ProjectReference->'%(Extension)')' == '.rptproj'" />
  </ItemGroup>
 </Target>
</Project>

只要没有其他.csproj项目对.rptproj项目有依赖关系,这似乎是有效的。


4
现在大家都在等待MSBuild对于 .dtproj 的支持,似乎会等上一辈子。 - it3xl
1
@it3xl 的评论似乎是有效的,只有解决方法适用于 .dtproj。 - George Vovos

0
可以使用/ignoreprojectextensions: .rptproj跳过项目,但我仍然会收到警告(VS2015),因此你可能仍然会遇到错误。

可以指定要构建的项目列表。

msbuild /t:myCsProj /t:mySqlProj /t:myOtherProjThatIsntaRptProj

当然,这是否可行取决于您的解决方案中有多少“其他”项目。

或者,有一些方法可以将MSBuild强制适应其他项目类型(例如https://speaksql.wordpress.com/2013/06/07/a-journey-to-db-deployment-automaton-ssis-build-using-msbuild/)。

我曾经在实际项目中看到过这种方法,但只用于SSIS。不过我听说它也可以用于SSRS / SSAS。


1
可以确认,/ignoreprojectextensions:.rptproj 对于 MSBuild 15 并不能防止出现错误。我想,除了指定所有项目的选项之外,另一个选择是定义一个新的解决方案配置,该配置排除了非 MSBuildable 项目,并使用 /p:Configuration=NewConfiguration 在该配置中进行构建。 - Andrew Bennet
这确实给“用户错误”留下了一些空间,即用户在从Visual Studio构建时选择了错误的配置,然后想知道为什么rptproj没有构建成功。我猜这就是得失之间的权衡。 - Gavin Campbell
是的,我同意,这并不理想,但可能对我来说是最好的解决办法。令人恼火的是,针对我的特定用例指定单个项目并不是非常可行——除了有相当多的项目之外,我们还将所需的项目平台/配置信息存储在解决方案级别(解决方案配置)上。似乎无法在构建单个项目时指定解决方案平台和配置... - Andrew Bennet

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