我们如何通过另一个应用程序(在同一台服务器上运行)运行一个应用程序的rake任务?

时间:2015-10-20 08:08:55

标签: ruby-on-rails ruby gem bundler

问题: 我有两个应用程序A& B都在同一台服务器上运行。我在文件系统中有一个脚本

cd /data/B/
bundle exec rake -T 

当我通过应用程序A的rails控制台运行脚本时,当控制台加载A的宝石并且rake任务失败时,它会出错

  eg: system("sh ~/test.sh")

rake aborted!
LoadError: cannot load such file -- log4r
/home/kumolus/api/config/application.rb:9:in `require'
/home/kumolus/api/config/application.rb:9:in `<top (required)>'
/home/kumolus/api/Rakefile:1:in `require'
/home/kumolus/api/Rakefile:1:in `<top (required)>'
(See full trace by running task with --trace)

当我通过unix命令行运行脚本时(无论我的pwd如何)它都可以运行

cd ~
sh test.sh  #works

cd /data/A   #my application A's dir
sh ~/test.sh   #also works

我需要它来通过rails工作。任何帮助?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为cd到该文件夹​​应该足以在执行cd 的shell进程中切换环境。试试这个。

进入项目B并执行

which bundle
在命令行中

,并将结果复制到某处。 然后做

which rake

并复制其结果。

然后,切换到项目A并启动rails控制台。然后试试这个:

`cd /path/to/projectB; bundle exec rake  -T`

如果这不起作用,请尝试:

`cd /path/to/projectB; <result of doing "which bundle" earlier> exec rake -T`

然后,如果它仍然无效,请尝试:

`cd /path/to/projectB; <result of doing "which bundle" earlier> exec <result of doing "which rake" earlier> -T`

答案 1 :(得分:1)

谢谢你的帮助, 由于捆绑器的默认行为,我找到了一个解决方案。

我将with_clean_env方法与块一起使用,然后执行。

谢谢团队 干杯