【问题标题】:Propagating exit code from exec'd batch file back to ant将退出代码从 exec'd 批处理文件传播回 ant
【发布时间】:2014-03-14 03:30:25
【问题描述】:

我需要从 ant 调用 sbt。我正在使用“exec”任务执行此操作,如下所示:

  <target name="publish-jar">
    <exec executable="sbt.bat" failonerror="true">
      <arg value="publish"/>
    </exec>
  </target>

如果 sbt 任务失败,我需要 ant 任务“失败”,这就是使用 failonerror="true" 的原因。但是,这不起作用。当 sbt 任务失败时,ant 不会报告构建失败。

这看起来像这里讨论的问题:Ant exec resultproperty is not working。建议的解决方法是从sbt.bat 中删除“/B”。换句话说,改变:

exit /B %ERROR_CODE%

exit %ERROR_CODE%

然而,正如一位评论者所说:

这样做的缺点是,如果您直接运行批处理文件进行测试,它将终止您的 shell。您可以在批处理文件中使用 if 和 arg 在 ant 调用它时选择 \b 并在不调用时正常退出。

问题:是否有修复方法,当失败发生时:(1) 不终止调用者的 shell 并且 (2) 将退出代码传播给 ant?

更新

这是运行我的 ant 任务的输出。实际的错误在这里并不重要(我故意不配置要发布到的存储库,以强制出错):

C:\dev\la\sdf3\modules\test>ant publish-jar
Buildfile: C:\dev\la\sdf3\modules\test\build.xml

publish-jar:
     [exec] [info] Loading global plugins from C:\Users\jn\.sbt\0.13\plugins
     [exec] [info] Set current project to test (in build file:/C:/dev/la/sdf3/modules/test/)
     [exec] :: loading settings :: file = C:\dev\la\sdf3\modules\ivysettings.xml

     [exec] [info] :: delivering :: com.jn#test;SNAPSHOT ::
SNAPSHOT :: integration :: Fri Mar 14 08:45:58 HST 2014
     [exec] [info]      delivering ivy file to C:\dev\la\sdf3\modules\com.jn\target\scala-2.10\ivy-SNAPSHOT.xml
     [exec] java.lang.RuntimeException: Repository for publishing is not specified.
     [exec]     at scala.sys.package$.error(package.scala:27)
     [exec]     at sbt.Classpaths$$anonfun$getPublishTo$1.apply(Defaults.scala:1203)
     [exec]     at sbt.Classpaths$$anonfun$getPublishTo$1.apply(Defaults.scala:1203)
     [exec]     at scala.Option.getOrElse(Option.scala:120)
     [exec]     at sbt.Classpaths$.getPublishTo(Defaults.scala:1203)
     [exec]     at sbt.Classpaths$$anonfun$57.apply(Defaults.scala:1037)
     [exec]     at sbt.Classpaths$$anonfun$57.apply(Defaults.scala:1037)
     [exec]     at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
     [exec]     at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
     [exec]     at sbt.std.Transform$$anon$4.work(System.scala:64)
     [exec]     at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
     [exec]     at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
     [exec]     at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
     [exec]     at sbt.Execute.work(Execute.scala:244)
     [exec]     at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
     [exec]     at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
     [exec]     at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
     [exec]     at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
     [exec]     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
     [exec]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
     [exec]     at java.util.concurrent.FutureTask.run(FutureTask.java:262)
     [exec]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
     [exec]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     [exec]     at java.lang.Thread.run(Thread.java:744)
     [exec] [error] (*:publishConfiguration) Repository for publishing is not specified.
     [exec] [error] Total time: 0 s, completed Mar 14, 2014 8:45:59 AM

BUILD SUCCESSFUL
Total time: 4 seconds

【问题讨论】:

    标签: windows batch-file ant sbt exit-code


    【解决方案1】:

    我刚刚做了一个简单的批处理:
    @echo off echo [batch] exit /b 2 上面的 ant 脚本和 exec 从我的批处理中返回了错误代码。一切正常。
    exec returned: 2

    已在以下位置进行测试:
    Apache Ant(TM) version 1.9.3 compiled on December 23 2013Windows 7 64-bit

    您应该粘贴批处理文件和运行 ant 获得的实际结果。您使用的 Ant 版本有问题,或者(很可能)批处理文件有问题。

    执行以下操作

    • 从命令行运行sbt.bat publish
    • 之后立即运行 echo %ERRORLEVEL% 并记录结果

    如果您收到0,那么您的批次就是问题所在。

    编辑: 或者,有一个 article here 描述了使用宏定义的解决方法

    【讨论】:

    • 我按照你的建议做了,我得到了一个退出代码1
    • 嗯,这是应该的。有一个article here 提到了一个包装宏定义作为一种解决方法。那篇文章还建议 exit /b 不适用于 ant。我可以肯定地告诉你它适用于 Ant 1.9.3。尝试更新您的 Ant 或尝试使用宏定义
    • 非常有趣,谢谢!我会尝试升级 ant,因为我们使用的是 1.8.4。
    • 升级到 Ant 1.9.3 并没有解决问题。我现在正在查看宏定义。
    • macrodef 解决方案对我有用。它非常难看(特别是因为我需要确保我们的脚本也可以在非 Windows 平台上运行),但它可以。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多