我有一个我编写的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脚本运行脚本。
关于如何执行此脚本的任何建议?
答案 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命令是一个好主意,但是你只能将字符串作为参数传递,而不能传递给内存中的对象。