为什么 MSBuild 试图 运行 它正在构建的项目?

Why is MSBuild trying to run the projects it's building?

我目前正在编写一个 msbuild 脚本来构建我一直在研究的解决方案,以及 运行 它的测试。在我的开发机器上,这按预期工作。但是,当我尝试在我们的构建服务器上 运行 相同的构建脚本时,我遇到了几次失败。我已经追踪到问题的根源,因为我的构建脚本似乎正在尝试 运行 与我的应用程序关联的 .exe 文件。脚本执行期间的这一行提示了我,因为它没有 运行 我的开发箱上的命令:

MSIAuthoring:
  Building MSI
  "C:\Program Files (x86)\Jenkins\workspace\Test Build\BuildArtifacts\MsiBuildTool.exe" "/MBSBUILD:MsiBuildTool"

我对构建脚本相当陌生,但我的理解是构建脚本不应该尝试 运行 我的程序,除非我明确告诉它这样做。有谁知道这可能是什么原因造成的?

作为参考,这是我的构建脚本:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="RunTests" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <BuildArtifactsDir Include="BuildArtifacts\"/>
    <SolutionFile Include="MsiBuildTool.sln"/>
    <NUnitConsole Include="C:\Program Files (x86)\NUnit 2.6.4\bin\nunit-console.exe"/>
    <UnitTestsDll Include="BuildArtifacts\MsiBuildToolUnitTests.dll"/>
    <TestResultsPath Include="BuildArtifacts\TestResults.xml"/>
  </ItemGroup>

  <PropertyGroup>
    <Configuration Condition="'$(Configuration)' == ''">Release</Configuration>
    <Platform Condition="'$(Platform)' == ''">Any CPU</Platform>
  </PropertyGroup>

  <Target Name="Init" DependsOnTargets="Clean">
    <MakeDir Directories="@(BuildArtifactsDir)"/>
  </Target>

  <Target Name="Clean">
    <RemoveDir Directories="@(BuildArtifactsDir)"/>
  </Target>

  <Target Name ="Compile" DependsOnTargets="Init">
    <MSBuild Projects="@(SolutionFile)"
             Targets ="Build"
             Properties ="OutDir=%(BuildArtifactsDir.FullPath);Configuration=$(Configuration);Platform=$(Platform)"/>
  </Target>

  <Target Name="RunTests" DependsOnTargets="Compile">
    <Exec Command='"@(NUnitConsole)" @(UnitTestsDll) /xml=@(TestResultsPath)'/>
  </Target>
</Project>

更新: 在对输出进行一些挖掘之后,我发现 "MSIAuthoring" 步骤是我正在使用的 Wix# 库的结果。如本帖所述:https://wixsharp.codeplex.com/discussions/644609# 我通过删除 .csproj 文件中的这一行禁用了 MSIAuthoring 步骤:

<Import Project="..\packages\WixSharp.1.0.22.3\build\WixSharp.targets" Condition="Exists('..\packages\WixSharp.1.0.22.3\build\WixSharp.targets')" />

您正在构建解决方案文件,因此 MSBuild 将首先生成 msbuild-xml 脚本,然后再构建它。找出为什么它在构建机器上被调用而不是在您的开发机器上调用 - follow this advice 并从您的开发环境和构建服务器获取生成的 MSBuild 脚本。然后比较一下。

同时按照 Lex Li 的建议启用诊断日志记录 (/verbosity:diag in the command line),您将看到详细的决定,为什么每个目标是 运行 或不是 - grep 记录类似 "Conditions A, B, C on target BuildMSI evaluated to False" 的内容这将向您展示环境之间的差异。

它可能是某种类型的 post-build 脚本,仅当 运行 不在开发环境中时才构建 MSI 的项目之一 - 检查实际的构建脚本以找到它的位置从。还要检查它是否真的与您的构建脚本相关,并且它不是您 Jenkins 构建配置中的额外构建步骤。