【问题标题】:MSBuild 15.0 (Visual Studio 2017) error MSB4067 for SSDT (SSRS and SSAS) projects: "The element <State> beneath element <Project> is unrecognized"SSDT(SSRS 和 SSAS)项目的 MSBuild 15.0 (Visual Studio 2017) 错误 MSB4067:“元素 <Project> 下的元素 <State> 无法识别”
【发布时间】:2017-05-02 10:16:22
【问题描述】:

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

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

这很好,MSBuild 不支持 SSDT 项目,我们不得不退回到使用 Visual Studio 构建它们(即devenv.com)。例如,请参阅this answer

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

Reports.rptproj(3,3):错误 MSB4067:元素 下的元素 无法识别。

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

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

【问题讨论】:

  • 与其供应商交谈。由于 MSBuild 现在是开源的,您可以在其 GitHub 存储库中执行此操作。
  • 谢谢 - 我现在在 MSBuild GitHub 存储库上提出了 an issue

标签: .net msbuild visual-studio-2017 sql-server-data-tools msbuild-15


【解决方案1】:

更新(2017 年 10 月)

最新版本的 Microsoft Reporting Services Projects for Visual Studio (1.18) adds MSBuild support for SSRS projects。安装后,SSRS 项目可以更新为 MSBuild 支持的格式,从而防止此问题发生。


原答案

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

MSBuild 维护者之一在GitHub issue thread 中给出的解决方法是:

将包含这些内容的文件放在具有特殊名称的 .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 项目的项目依赖项,这似乎可行。

【讨论】:

  • 现在每个人都将等待 .dtproj 和永恒的 MSBuild 支持
  • @it3xl 的评论似乎有效,只有解决方法适用于 .dtproj
【解决方案2】:

可以使用/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。

【讨论】:

  • 可以确认 /ignoreprojectextensions:.rptproj 不会阻止 MSBuild 15 的错误。我想指定所有项目的另一种选择是定义一个新的解决方案配置,排除非 MSBuildable 项目,并构建在该配置中使用/p:Configuration=NewConfiguration
  • 这确实为“用户错误”留下了一点空间,用户在从 Visual Studio 构建时选择了错误的配置并想知道为什么 rptproj 没有构建.我猜是秋千和环形交叉路口。
  • 是的,我同意,这并不理想,但这对我来说可能是最好的解决方法。烦人的是,为我的特定用例指定单个项目并不是很可行——除了有很多项目之外,我们在解决方案级别(解决方案配置)存储所需的项目平台/配置信息。在构建单个项目时,您似乎无法指定解决方案平台和配置...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2014-01-21
  • 2010-11-13
  • 2023-03-23
相关资源
最近更新 更多