【问题标题】:Does SonarQube MSBuild Runner work with Microsoft.Build API?SonarQube MSBuild Runner 是否与 Microsoft.Build API 一起使用?
【发布时间】:2016-03-27 05:20:09
【问题描述】:

我能够以编程方式调用MsBuild.SonarQube.Runner begin(通过直接调用引用的程序集)、Microsoft.Build.BuildManager.Build 和MsBuild.SonarQube.Runner end。但是,问题是 Runner end 报告 未找到 ProjectInfo.xml 文件。可能的原因:您指定了无效的构建配置或未导入自定义 MSBuild 分析目标。

MsBuild.SonarQube.Runner 是否与 MSBuild.exe 命令行工具紧密结合?我不清楚跑步者究竟如何获得构建事件的详细信息。

我想要达到的目标有可能吗?

我必须补充一点,runner begin 并且构建成功了。 bin\Debug 文件夹中填充了构建的二进制文件。

【问题讨论】:

    标签: msbuild sonarqube sonarqube-msbuild-runner


    【解决方案1】:

    您可以使用 MSBuild API 以编程方式构建项目,并在构建过程中执行 SonarQube 分析。 SonarQube Scanner for MSBuild 没有与 MSBuild.exe 命令行紧密耦合。

    ImportBefore 功能在标准 Microsoft 目标文件中实现。例如,查看 %ProgramFiles(x86)%\MSBuild\14.0\Bin\Microsoft.Common.CurrentVersion.targets,其中包含以下行:

      <Import Project="$(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore\*" Condition="'$(ImportUserLocationsByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore')"/>
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore\*" Condition="'$(ImportByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.targets\ImportBefore')"/>
    

    所有这些行都是导入已知位置中存在的任何目标文件。此机制可用于自动将目标包含到每个项目中,而无需在项目中显式包含目标文件。此机制独立于 MSBuild.exe。但是,您使用哪个版本的标准目标文件确实很重要:v4.0 标准目标文件不包含此机制,但 v12.0 和 v14.0 版本包含。

    以编程方式触发构建的最简单方法是使用 MSBuild v12.0 或 v14.0 并依赖标准 ImportBefore 行为。

    或者,您可以执行以下操作之一:

    1. 手动编辑您的项目文件以明确包含所需的 SonarQube 目标,或者

    2. 在触发构建之前使用 MSBuild API 以编程方式导入所需的 SonarQube 目标(通过使用 include 参数指向要导入的目标文件的位置)。 SonarQube Scanner for MSBuild 集成测试使用这种方法。

    【讨论】:

    • 我继续使用Process.Start() 调用msbuild.exe,但您的建议似乎是有效的。即使我没有尝试过,也接受它作为答案。
    【解决方案2】:

    由于 SonarQube 的 MSBuild Runner 依赖于 MSBuild 的 ImportsBefore 功能,并且由于 Microsoft.Build API 无法与 ImportsBefore 相媲美,至少目前还没有办法将 Sonar Runner for MSBuild 与 API 结合使用.它必须通过进程调用与MsBuild.exe 一起使用。

    【讨论】:

      【解决方案3】:

      用于 MSBuild 的 SonarQube 扫描仪是一个开源项目,因此您可以亲自了解一切如何在幕后工作:https://github.com/SonarSource/sonar-msbuild-runner

      我不认为它与 MSBuild.exe 命令行紧密耦合,但它确实依赖于 MSBuild 的 ImportsBefore 机制,并且仅适用于特定的 MSBuild 版本(目前为 12 和 14)。

      您的问题是关于某个问题的解决方案的实施,但是您没有说这个最初的问题是什么。这使得很难给出一个好的答案。

      【讨论】:

      • ImportsBefore 是 MSBuild.exe 的特定功能,并且由于 MSBuild 的 SonarQube Scanner 依赖于它,因此间接扫描器变得特定于 MSBuild。这意味着我不能使用Microsoft.Build API。我打算调用 MSBuild.exe 作为外部进程。希望有效。
      猜你喜欢
      • 2016-03-01
      • 2015-10-18
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2016-07-24
      • 2016-03-30
      • 2015-08-11
      • 2016-02-27
      相关资源
      最近更新 更多