【发布时间】: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