有没有更好的方法从rake任务执行多个系统命令?

时间:2016-06-08 09:45:43

标签: ruby rake

我的calabash项目中有一个rake任务,它执行多个系统命令,如:

desc 'Export and execute features from JIRA '
  task :run_jira, [:key, :language, :apk_file] do |_, args|
  key = args[:key]
  language = args[:language] || 'en'
  apk_file = args[:apk_file] || default_apk
  system "curl -u admin:admin -X GET http://myjira/rest/raven/1.0/export/test?keys=#{key} > jira.zip"
  system "unzip -o jira.zip -d features/jira"
  system "rm -rf jira.zip"
  system "calabash-android run #{apk_file} -p android -p #{language} -p common -f json -o results/reports/calabash-#{key}.json  features/jira"
  system "curl -H 'Content-Type: application/json' -X POST -u admin:admin --data @results/reports/calabash-#{key}.json http://myjira/rest/raven/1.0/import/execution/cucumber"
end

有没有更好的方法来执行这5个系统调用?我的想法是创建一个.sh脚本并从任务开始,但由于脚本将在OS X和Linux机器上执行,我认为它可能会造成更多麻烦。

1 个答案:

答案 0 :(得分:1)

您可以将所有这些命令加入到单个命令中并执行该命令。假设您创建了一个包含所有命令的数组commands,您可以这样做:

composite_command = commands.join('; ')
system(composite_command)

如果你想让执行停止,如果有任何包含错误,你可以用双&符号&符号替换分号:

composite_command = commands.join(' && ')
system(composite_command)

这说明&&做了什么:

$ ls foo && echo hi
ls: foo: No such file or directory
$ touch foo
$ ls foo && echo hi
foo
hi

shell将失败定义为返回0以外的退出代码。

最大命令长度,但我希望它总是至少为1024.