1

我能够以编程方式调用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 文件夹中填充了构建的二进制文件。

4

3 回答 3

0

由于 SonarQubeImportsBefore的 MSBuild Runner 依赖于 MSBuild 的特性,并且Microsoft.BuildAPI 没有可比性ImportsBefore,至少目前还没有办法将 Sonar Runner for MSBuild 与 API 结合使用。它必须与MsBuild.exe进程调用一起使用。

于 2015-12-22T18:15:05.237 回答
0

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

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

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

于 2015-12-22T08:27:58.050 回答
0

您可以使用MSBuild API以编程方式构建项目,并将SonarQube分析作为构建的一部分执行。MSBuild的SonarQube 扫描仪与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目标(通过添加类型为“Import”的“Item”,其中包含指向要导入的目标文件的位置的参数)。用于 MSBuild集成测试的SonarQube 扫描仪使用这种方法。

于 2016-01-11T09:42:00.437 回答