SonarQube MSBuild Runner 是否适用于 Microsoft.Build API?
Does SonarQube MSBuild Runner work with Microsoft.Build API?
我能够以编程方式调用 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 扫描器是一个开源项目,因此您可以亲眼看看其背后的工作原理:https://github.com/SonarSource/sonar-msbuild-runner
我不认为它与 MSBuild.exe 命令行紧密耦合,但它确实依赖于 MSBuild 的 ImportsBefore
机制,并且仅适用于特定的 MSBuild 版本(12 和 14目前)。
你的问题是关于某个问题的解决方案的实施,但是你没有说这个最初的问题是什么。这使得很难给出一个好的答案。
由于 SonarQube 的 MSBuild Runner 依赖于 MSBuild 的 ImportsBefore
特性,并且因为 Microsoft.Build
API 没有 ImportsBefore
的可比性,至少目前还没有将 Sonar Runner for MSBuild 与 API 结合使用的方法。它必须通过进程调用与 MsBuild.exe
一起使用。
您可以使用 MSBuild API 以编程方式构建项目,并在构建过程中执行 SonarQube 分析。 SonarQube Scanner for MSBuild 与 MSBuild.exe 命令行没有紧密耦合。
ImportBefore 功能在标准 Microsoft 目标文件中实现。例如,查看 %ProgramFiles(x86)%\MSBuild.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')"/>
所有这些行所做的是导入 well-known 位置中存在的任何目标文件。此机制可用于自动将目标包含到每个项目中,而无需在项目中显式包含目标文件。该机制独立于MSBuild.exe。但是,您使用哪个版本的标准目标文件并不重要:v4.0 标准目标文件不包含此机制,但 v12.0 和 v14.0 版本包含此机制。
以编程方式触发构建的最简单方法是使用 MSBuild v12.0 或 v14.0 并依赖标准 ImportBefore 行为。
或者,您可以执行以下操作之一:
手动编辑项目文件以明确包含所需的 SonarQube 目标,或
在触发构建之前使用 MSBuild API 以编程方式导入所需的 SonarQube 目标(通过添加类型为 "Import" 的 "Item",其中 include 参数指向要导入的目标文件的位置)。 SonarQube Scanner for MSBuild 集成测试使用这种方法。
我能够以编程方式调用 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 扫描器是一个开源项目,因此您可以亲眼看看其背后的工作原理:https://github.com/SonarSource/sonar-msbuild-runner
我不认为它与 MSBuild.exe 命令行紧密耦合,但它确实依赖于 MSBuild 的 ImportsBefore
机制,并且仅适用于特定的 MSBuild 版本(12 和 14目前)。
你的问题是关于某个问题的解决方案的实施,但是你没有说这个最初的问题是什么。这使得很难给出一个好的答案。
由于 SonarQube 的 MSBuild Runner 依赖于 MSBuild 的 ImportsBefore
特性,并且因为 Microsoft.Build
API 没有 ImportsBefore
的可比性,至少目前还没有将 Sonar Runner for MSBuild 与 API 结合使用的方法。它必须通过进程调用与 MsBuild.exe
一起使用。
您可以使用 MSBuild API 以编程方式构建项目,并在构建过程中执行 SonarQube 分析。 SonarQube Scanner for MSBuild 与 MSBuild.exe 命令行没有紧密耦合。
ImportBefore 功能在标准 Microsoft 目标文件中实现。例如,查看 %ProgramFiles(x86)%\MSBuild.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')"/>
所有这些行所做的是导入 well-known 位置中存在的任何目标文件。此机制可用于自动将目标包含到每个项目中,而无需在项目中显式包含目标文件。该机制独立于MSBuild.exe。但是,您使用哪个版本的标准目标文件并不重要:v4.0 标准目标文件不包含此机制,但 v12.0 和 v14.0 版本包含此机制。
以编程方式触发构建的最简单方法是使用 MSBuild v12.0 或 v14.0 并依赖标准 ImportBefore 行为。
或者,您可以执行以下操作之一:
手动编辑项目文件以明确包含所需的 SonarQube 目标,或
在触发构建之前使用 MSBuild API 以编程方式导入所需的 SonarQube 目标(通过添加类型为 "Import" 的 "Item",其中 include 参数指向要导入的目标文件的位置)。 SonarQube Scanner for MSBuild 集成测试使用这种方法。