【问题标题】:Ruby gem not found when target script is spawned by another ruby script另一个 ruby​​ 脚本生成目标脚本时找不到 Ruby gem
【发布时间】:2016-04-09 14:45:22
【问题描述】:

我有一个 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': 无法加载此类文件 -- watir-webdriver (LoadError)

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

【问题讨论】:

    标签: ruby-on-rails ruby selenium rubygems watir-webdriver


    【解决方案1】:

    第一个解决方案是在与 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 安装在系统范围内,您可以执行类似的操作

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

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

    【讨论】:

    • 是否可以脱离线程?我真的不想要 Rails 中的任何爬虫代码。
    • 另外,ENV['GEM_HOME'] 似乎不适用于“Gem Paths”下的任一路径
    • ds-vin.rb 中设置require 之前是否设置了GEM_HOME
    • 更新了使用GEM_PATH的答案。请同时发布gem which watir-webdriver 的输出。
    • 输出为:C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/watir-webdriver-0.9.1/lib/watir-webdriver.rb;然而,实际上没有任何变化,脚本神奇地开始工作。我什至颠倒了步骤来尝试再次打破它 - 没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多