MSBuild exec任务,退出代码为空

jas*_*ard 6 msbuild exec exit-code

我有以下exec任务,执行assemblyinfo.cs文件的签入.我正在尝试返回退出代码,但由于某种原因它总是空的.

<!--Checkin if all succeeded-->
<Exec Condition=" '$(LocalCompilationSuccess)' != 'Failed' and '$(LocalTestSuccess)' != 'Failed' " ContinueOnError="True"
              Command='&quot;$(TfCommand)&quot; checkin /recursive /comment:"$(NoCICheckInComment) $(BuildDefinitionName): build succeeded, checkin changes." /override:"TeamBuild $(BuildDefinitionName)" $/SomeProject/Trnk' WorkingDirectory="$(SolutionRoot)"  >
  <Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
</Exec>
Run Code Online (Sandbox Code Playgroud)

我试图以两种方式阅读退出代码:

'%(ErrorCode.Identity)'
'$(ErrorCode)'
Run Code Online (Sandbox Code Playgroud)

两者都是空的.有什么建议?

Chr*_*n.K 14

一般来说,它的工作方式如您所示.

作为参考,这是一个更"自包含"的例子:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
  <Target Name="help">
    <Exec ContinueOnError="True" Command='cmd.exe /c dir'>
       <Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
    </Exec>
    <Message Importance="high" Text="$(ErrorCode)"/>
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

但是,您可能需要考虑以下几点:

  • 确保你的Exec偶数执行,即Condition评估结果 True.

  • ErrorCode使用Message-Task 输出属性,以查看它是否实际设置(到您期望的值).但是,请确保MSBuild将显示输出,方法是使用Importance='high'或运行msbuild.exe /v:d以启用详细消息.

  • 此外,由于 https://github.com/nunit/nunit-console/issues/242,我建议设置 `IgnoreStandardErrorWarningFormat="true"`。否则,“ExitCode”可能是“-1”,而不是已启动进程的实际退出代码。 (3认同)
  • 在mono/xbuild下,我还必须在`<Exec>`任务中指定`IgnoreExitCode ="true"`来填充属性. (2认同)