Ruby on rails 在';处使用shell命令调用ruby脚本失败;装载耙铲';
我在使用shell命令调用Ruby脚本时遇到了一个问题,然后Ruby脚本调用Rake 我已经构建了一个测试自动化框架,当从命令行运行时(我在OSX Yosemite上),它会执行以下操作:Ruby on rails 在';处使用shell命令调用ruby脚本失败;装载耙铲';,ruby-on-rails,ruby,shell,rake,shoes,Ruby On Rails,Ruby,Shell,Rake,Shoes,我在使用shell命令调用Ruby脚本时遇到了一个问题,然后Ruby脚本调用Rake 我已经构建了一个测试自动化框架,当从命令行运行时(我在OSX Yosemite上),它会执行以下操作: 调用一个Ruby脚本,该脚本设置一组环境变量 然后调用Rake rake = Rake.application rake.init rake.load_rakefile rake['execute_tests'].invoke Rake文件运行Cucumber任务,然后测试框架愉快地启动浏览器并开始执行测
rake = Rake.application
rake.init
rake.load_rakefile
rake['execute_tests'].invoke
Cucumber::Rake::Task.new(:execute_tests) do |task|
# => need to populate these so that the cucumber.yml parses
ENV['TEST_WEB_PARALLEL_OS'] = "null"
ENV['TEST_WEB_PARALLEL_OS_VERSION'] = "null"
ENV['TEST_WEB_PARALLEL_BROWSER'] = "null"
ENV['TEST_WEB_PARALLEL_BROWSER_VERSION'] = "null"
#------------------------------------------------
# Specify rake profile
#------------------------------------------------
runProfile = ENV['TEST_PLATFORM'].downcase + "_" + ENV['TEST_INTERFACE'].downcase + "_" + ENV['TEST_ENVIRONMENT'].downcase + "_" + ENV['TEST_TYPE'].downcase
# => running headless
if ENV['TEST_HEADLESS'] == "TRUE"
# => need to truncate poltergeist - using the @poltergeist tag in cucumber was causing issues with other drivers
ENV['TEST_BROWSER'] = "POLTER"
reportProfile = ENV['TEST_PLATFORM'].downcase + "_" + ENV['TEST_INTERFACE'].downcase + "_" + ENV['TEST_ENVIRONMENT'].downcase + "_" + ENV['TEST_TYPE'].downcase + "_" + osHelper.getOperatingSystem.to_s + "_" + ENV['TEST_BROWSER'].downcase + "_hlst"
# => running headed
else
reportProfile = ENV['TEST_PLATFORM'].downcase + "_" + ENV['TEST_INTERFACE'].downcase + "_" + ENV['TEST_ENVIRONMENT'].downcase + "_" + ENV['TEST_TYPE'].downcase + "_" + osHelper.getOperatingSystem.to_s + "_" + ENV['TEST_BROWSER'].downcase + "_lst"
end
#------------------------------------------------
# Set the env var then run profile
#------------------------------------------------
ENV['REPORT_PROFILE'] = reportProfile
ENV['RUN_PROFILE'] = runProfile
task.profile = runProfile
end
`ruby ./exe/execute_web_tests_local_singlethread.rb salesforce integration regression headed chrome false false`
…然后代码将一直执行,直到下一行尝试执行为止:
rake.load_rakefile
这时,代码就失效了。我看不到子进程的任何输出或stacktrace,因此我无法在知道进程在上面指定的行上失败之后进行调试
不幸的是,这是我能说的最具体的。如果有人能为我如何着手调查和/或解决这一问题提供任何建议,我将不胜感激
我也尝试过使用Open3,这导致了同样的问题
干杯当您使用Ruby./exe/execute\u web\u tests\u local\u singlethread.rb向Ruby抛售时,子进程将在父进程的当前工作目录(即GUI应用程序运行的目录)中运行 调用
rake.load\u rakefile
时,它将查找相对于当前工作目录的rakefile
,而不是相对于要调用的脚本的目录
有几种方法可以解决这个问题。一种是在执行命令之前,在父进程(GUI)中设置RAKEOPT
环境变量。这将由子进程继承:
ENV['RAKEOPT'] = "--rakefile ./exe/Rakefile"
或者,您可以更改父进程中的工作目录:
Dir.chdir("./exe") do
`ruby execute_web_tests_local_singlethread.rb salesforce integration regression headed chrome false false`
end
这可能不可取。如果应用程序是线程化的并且依赖于当前目录(可能是),那么修改当前目录可能会产生一些意外的后果
最后一件事:您可能无法启动以这种方式运行浏览器的子进程。就我所知,完整浏览器和无头浏览器都需要有关您正在运行的图形环境的信息。当您运行附加到GUI终端会话的进程时,这很好,但在尝试从内部启动另一个图形进程时,可能会遇到其他问题
希望有帮助