使用不同的gemfile从Rails调用ruby脚本

时间:2014-01-06 04:08:26

标签: ruby-on-rails ruby bundler

我有一个我编写的ruby脚本,它生成数据并将其加载到MongoDB。我现在正试图从我的Rails应用程序的seed.rb调用这个加载脚本(所以我可以通过rake db:seed运行)

我尝试使用此代码从rails调用它:

system( "ruby data_load/db_load.rb -a data_load/doc1.json" )

当代码执行时,我收到以下错误。 (注意它从命令行运行正常):

data_load/db_load.rb:15:in `require': cannot load such file -- mongo (LoadError)
from data_load/db_load.rb:15:in `<main>'

db_load.rb的顶部如下所示:

# includes gems from gemfile
require 'rubygems'
require 'bundler/setup'
Bundler.setup
require 'mongo'
require_relative 'load_scripts/cmd_options'
require_relative 'load_scripts/build_index'
....
include Mongo

脚本在data_load目录中有自己的gemfile。

我的猜测是ruby使用rails应用程序的bundle而不是shell脚本运行脚本。

关于如何执行此脚本的任何建议?

2 个答案:

答案 0 :(得分:2)

我认为问题在于Bundler正在寻找Gemfile。由于您的脚本直接在父级中运行,因此它会找到主应用程序的Gemfile。

在调用脚本之前设置BUNDLE_GEMFILE

system "BUNDLE_GEMFILE=data_load/Gemfile ruby data_load/db_load.rb -a data_load/doc1.json"

答案 1 :(得分:0)

我很抱歉,但我认为你不能这样做,除非你把脚本作为一个不同的进程运行(比如一个shell命令),这样做很容易:

`shell_command params`

只需使用正确的路径和参数。

否则,考虑一个gemfile是&#34;或多或少&#34;在它的基本级别,一堆需要(或加载)语句,所以加载一个不同的gemfile会覆盖原来的一个,在那之后就会产生很多rails问题。

subprocess命令是一个好主意,但是你只能将字符串作为参数传递,而不能传递给内存中的对象。