Ruby gem 当目标脚本由另一个 ruby 脚本生成时未找到

Ruby gem not found when target script is spawned by another ruby script

我有一个 watir 脚本,我想从 Rails 应用程序按需启动。我的控制器操作看起来像这样:

def run_scrape
  pid = Process.spawn('C:\Ruby22-x64\bin\ruby.exe "C:\Users\Admin\Dropbox\dev\watir-scripts\ds-vin.rb" 3VWB07AJ')
  Process.detach(pid)
  true
end

实际脚本开头为:

require 'watir-webdriver'
b = Watir::Browser.new :ie
# etc

现在,如果我导航到文件夹并直接 运行 脚本,一切正常。一旦它从 Rails 触发(在不同的位置;看起来好像搞砸了),我收到以下错误:

`require': cannot load such file -- watir-webdriver (LoadError)

Watir-webdriver 在我的 gem 列表中。我还需要同一文件夹中的几个 .rb 文件,这在我使用 require_relative 之前一直是个问题。我想我在这里缺少一些简单的东西。我如何 require_relative 全局 gem?

第一个解决方案是 运行 你的爬虫在与 Rails 相同的进程中,但在不同的线程中:

require 'C:\Users\Admin\Dropbox\dev\watir-scripts\ds-vin.rb'
thr = Thread.new do 
    b = Watir::Browser.new :ie
    ...
end

其次是修复您的环境,如果您要使用 Process.spawn - 假设您的 gem 已安装 system-wide,您可以执行类似

的操作
ENV['GEM_PATH'] = "c:/Ruby220/lib/ruby/gems/2.2.0"

在您的 ds-vin.rb 脚本的顶部。要找到您应该使用的确切 gem 路径,请确保您 运行 gem which watir-webdrivergem environment 并从那里复制。