【问题标题】:%x[] never finishes - ant or sinatra or Windows causing it?%x[] 永远不会完成 - 蚂蚁或 sinatra 或 Windows 导致它?
【发布时间】:2011-08-03 00:36:50
【问题描述】:

我使用 %x[] 在我的 ruby​​ 脚本(在 Windows XP 上)中调用 ant 命令。我需要更改工作目录,以便蚂蚁从正确的目录开始。所以调用了两个dos命令。

cmd = "cd #{$testing_root_directory.gsub("/","\\\\")} && ant -lib lib -f \"#{$testing_root_directory_builds.gsub("/","\\\\")}\\#{params['group']}\\#{params['run']}_build.xml\" 2>&1"

变量 cmd 的内容看起来像

cd C:\Program Files\TestPro\TestPro Automation Framework\ && ant -lib l
ib -f "C:\Program Files\TestPro\TestPro Automation Framework\Output Files\builds
\basics\login_build.xml" 2>&1

这是正确的,output = %x[#{cmd}] 工作得很好。


现在我需要在调用 ant 时添加新的目标名称。所以我更改了代码以适应它。请参阅行尾的#{$target_name}

cmd = "cd #{$testing_root_directory.gsub("/","\\\\")} && ant -lib lib -f \"#{$testing_root_directory_builds.gsub("/","\\\\")}\\#{params['group']}\\#{params['run']}_build.xml\" #{$target_name} 2>&1"

然后 puts cmd 给我正确的输出

cd C:\Program Files\TestPro\TestPro Automation Framework\ && ant -lib l
ib -f "C:\Program Files\TestPro\TestPro Automation Framework\Output Files\builds
\basics\login_build.xml" aftertaf 2>&1

但现在output = %x[#{cmd}] 永远不会结束。我的 ant 文件中有两个目标。我可以清楚地看到第一个已完成(默认一个),当我通过 CTRL + C 退出我的 ruby​​ 脚本时,我可以看到第二个(aftertaf)即将开始。屏幕上有它的标签。

如果我使用第二个 cmd 变量的内容,即 在 ruby​​ 中不起作用,并直接从 DOS 命令行运行它,它可以正常工作。所以在我看来,ruby 并没有以正确的方式传递字符串。 cmd.inspect 给我"cd C:\\Program Files\\TestPro\\TestPro Automation Framework\\ && ant -lib lib - f \"C:\\Program Files\\TestPro\\TestPro Automation Framework\\Output Files\\buil ds\\basics\\login_build.xml\" aftertaf 2>&1"

我想我可以重新组织我的 ant 目标以使我的脚本工作,但我想知道为什么 %x[] 现在永远不会完成。


  • Apache Ant(TM) 版本 1.8.2 编译于 2010 年 12 月 20 日
  • ruby 1.8.7(2010-08-16 补丁级别 302)[i386-mingw32]
  • 在 Windows XP 上

更新 1

我的aftertaf 目标看起来像

<target name="aftertaf" depends="taf" description="after TAF ruby stuff">
  <exec executable="ruby.exe">
    <arg line="C:\EduTester\others\afterant.rb update_latest 10.0.0.50:4567 basics login 20110803111432"/>
  </exec>
</target>

当从system() 运行 cmd 时,ant run 会在aftertaf 目标处停止。有一个 aftertaf: 标签,就是这样。

更新 2

当我按下 CTRL+C 时,我被问到 Terminate batch job (Y/N)? 我相信它来自 ant。我在目标 aftertaf 中的 exec 之前和之后添加了 echo,并在执行 exec 之前添加了 echo。

在 exec 中使用 ruby​​.exe 的完整路径没有帮助

更新 3

我的 ruby​​ 脚本是一个 sinatra 应用程序。我不知道这很重要。看起来很重要。如果我从“正常”rb 文件中调用%X[] 以上,它就可以工作。如果我从 sinatra 调用它,则不会执行来自第二个目标的 exec。 Ant 批处理文件正在等待某些东西。如果我从新目标中删除 exec 标签,一切正常。请注意,如果从 .rb命令行.bat 文件运行 ant,则 exec 工作。如果我从 sinatra 运行相同的 .rb 或 .bat exec 不起作用

【问题讨论】:

  • 仅供参考,exec 绝对不会回来。它用已执行的进程替换当前的 ruby​​ 进程。 system 将运行子进程并在子进程完成后恢复。

标签: ruby command-line ant windows-xp sinatra


【解决方案1】:

我只是在这里猜测,因为我目前没有可用于测试的 Windows 机器,但是您的命令是否卡在等待输入?

我注意到检查和看跌之间存在一些差异。在检查版本中:

  • xml 文件参数前的“-”和“f”之间有一个空格
  • 构建目标不同。在这种情况下,它是“aftertaf”。

您可以尝试使用system 而不是%x[] 来运行您的命令。这样,ant 的输出不会被捕获,而是会发送到控制台中的标准输出,您可以看到发生了什么。

【讨论】:

  • 更新了我的问题。构建目标应该是“aftertaf”,这是我的错误。我认为额外的空间并不重要,因为 f 之后指定的构建文件已被读取并开始执行。
  • 也许当从 ruby​​ 运行 ant 时,我需要在我的 'aftertaf' 目标中指定 ruby​​.exe 文件的完整路径....
  • 如果在 aftertaf 等待时在控制台中按 Ctrl-D 会发生什么? (如果 ruby​​ 在没有命令行参数的情况下运行,它会等待您在标准输入中输入脚本,由 Ctrl-D 终止。如果您只是在 shell 中运行 ruby​​.exe,就会发生这种情况。)
  • 另外,您可能想尝试在 ant 任务中拆分命令行,并为每个 arg 使用 而不是将它们全部放在一个
  • “终止批处理作业”意味着批处理脚本正在运行。它可以是 ant 的入口点,也可以是 ruby​​ 解释器的包装器。如果您从另一个批处理脚本中调用批处理脚本,它永远不会返回。它就像红宝石中的 exec 一样工作。要让批处理调用另一个批处理脚本并在它完成时返回,您必须使用“call subscript.bat”。蚂蚁的完整路径是什么?其他蚂蚁目标会返回吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多