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

时间:2015-09-04 15:18:52

标签: msbuild

我正在编写一个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')" />

1 个答案:

答案 0 :(得分:1)

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

同时启用Lex Li建议的诊断日志记录(/verbosity:diag in the command line),您将看到为什么每个目标运行的详细决策 - grep日志类似于&#34;条件A,B,目标BuildMSI上的C评估为False&#34;这将向您展示环境之间的区别。

它可能是某个项目的某种类型的构建后脚本,只有在不在开发环境中运行时才构建MSI - 检查实际的构建脚本以查找它的来源。还要检查它是否与您的构建脚本真正相关,并且它不是Jenkins构建配置中的额外构建步骤。