从执行的批处理文件传播退出代码以返回到Ant

5

我需要从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%

to

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
1个回答

2
我刚刚完成了一个简单的批处理文件:
@echo off echo [batch] exit /b 2 你上面的ant脚本执行后,exec返回了我批处理中的错误代码。一切都正常工作。
exec返回:2

这是在以下环境下测试的:
Apache Ant(TM) version 1.9.3 compiled on December 23 2013Windows 7 64-bit

你应该粘贴你的批处理文件和从运行ant获得的实际结果。要么是你使用的Ant版本有问题,要么(最有可能的)是批处理文件有问题。

请按照以下步骤操作:

  • 从命令行运行 sbt.bat publish
  • 紧接着运行 echo %ERRORLEVEL% 并记录结果

如果你得到的是 0,那么你的批处理文件有问题。

编辑: 或者,这里有一篇文章描述了一个使用宏定义的解决方法。


1
我按照你的建议做了,但是我得到了一个退出代码为1 - JimN
嗯,这是预料中的。这里有一篇文章提到了一个包装器宏定义作为解决方法。该文章还建议使用exit /b在ant中不起作用。我可以确定它适用于Ant 1.9.3。要么尝试更新您的Ant版本,要么尝试使用该宏定义。 - Slav
非常有趣,谢谢!我会尝试升级Ant,因为我们正在使用1.8.4版本。 - JimN
升级到Ant 1.9.3并没有解决问题。我现在正在查看macrodef。 - JimN
macrodef解决方案对我很有效。虽然它看起来相当丑陋(特别是因为我需要确保我们的脚本在非Windows平台上运行),但它能够胜任。感谢您的帮助。 - JimN
使用类似这样的简单批处理文件,当我执行 exit /b 0 时,exec 任务得到的退出代码是1而不是0,但对于我尝试过的所有其他值都有效。相反,执行 exit 0exec 任务得到了预期的0,并且它也适用于其他退出代码。 - Qtax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接