TeamCity 与 MSBuild 命令行

TeamCity vs MSBuild command line

我有一个 .csproj 文件,当我在 TeamCity 中构建它时,它的行为与我通过 msbuild.exe 可执行文件构建它时的行为不同。如果我知道 为什么 ,我可以尝试修复它,但我 运行 没主意了。

命令行:(为了便于阅读而格式化)

"C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe" 
    Web\MyProject\MyProject.csproj 
    /p:Configuration=Dev;PublishProfile=Dev.pubxml;OutputPath="bin\";DeployOnBuild=true 
    /t:Package

TeamCity 构建步骤:(因为它显示在元运行ner 中,尽管我将其视为常规构建步骤时得到相同的行为,并且我删除了 dotNetCoverage 参数)

  <runner name="Package Service" type="MSBuild">
    <parameters>
      <param name="build-file-path" value="Web/MyProject/MyProject.csproj" />
      <param name="msbuild_version" value="12.0" />
      <param name="run-platform" value="x86" />
      <param name="msbuild.prop.Configuration" value="Dev" />
      <param name="msbuild.prop.DeployOnBuild" value="true" />
      <param name="msbuild.prop.PublishProfile" value="Dev.pubxml" />
      <param name="msbuild.prop.OutputPath" value="bin\" />
      <param name="msbuild.prop.Platform" value="AnyCPU" />
      <param name="targets" value="Package" />
      <param name="teamcity.step.mode" value="default" />
      <param name="toolsVersion" value="12.0" />
    </parameters>
  </runner>

这些有什么区别?

我看到的行为是 MyProject.csproj 所依赖的程序集(但没有 "Dev" 构建配置)将使用 msbuild 构建得很好,但会失败TeamCity(版本 9.1.1)。

具体来说,这两种方法都将从任务 ValidateGlobalPackageSetting 开始,但 TeamCity 然后继续 ResolveProjectReferences,而 msbuild 继续 CollectFilesFromIntermediateAssembly


从 msbuild 为这两种方法创建诊断日志后,我发现了我的问题,但我不确定如何解决它。

teamcity 日志有 _DeployOnBuild = False,但我的 msbuild 日志有 _DeployOnBuild = true。这肯定可以解释我所看到的行为差异,但我不知道为什么 TeamCity 会忽略 msbuild.prop.DeployOnBuild 属性.

我在官方 Jetbrains 跟踪系统上 asked this 并得到了答案。

显然,TeamCity 并不像我预期的那样支持任意 msbuild.prop.* 参数。它唯一支持的两个是 ConfigurationPlatform。对于其余部分,我需要添加这一行:

<param name="runnerArgs" value="/p:DeployOnBuild=true;PublishProfile=%Configuration%.pubxml;OutputPath=&quot;bin\&quot; />