1

我正在编写一个应用程序,它将在指定文件夹中运行脚本,然后记录数字并绘制它们。

我的问题是,如果脚本是 ruby​​ 文件,则脚本内部的 require 语句会失败,因为 bundler 似乎对加载路径做了一些时髦的事情。

运行rails runner Datasource.run_jobs失败:

class Datasource < ActiveRecord::Base
  def self.run_jobs
    require 'aws_sdb'
    access_key_id = "REDACTED"
    secret_key = "REDACTED" # In all actuality these woudln't be here.
    @sdb = AwsSdb::Service.new(:access_key_id => access_key_id, :secret_access_key => secret_key)

    Datasource.all.each do |ds|
      puts "Updating #{ds.name}..."
      unless @sdb.list_domains.include? ds.name
        puts "#{ds.name} doesn't exist in SDB, creating a domain for it..."
        @sdb.create_domain ds.name
      end

      #data = "TEST"
      data = `#{RAILS_ROOT}/lib/plugins/#{ds.name}`

      @sdb.put_attributes(ds.name, Time.now.to_i, data)
      puts "Data Collected: #{data.inspect}"
    end
  end

  has_many :graphs

end
4

2 回答 2

2

(基于您对问题的评论)

您需要将 hpricot(以及任何其他需要的 gem)添加到您的Gemfile文件中,以便 Bundler 可以使用它们。到目前为止, Bundler 是避免 gem 冲突和愚蠢行为的最简单方法。

想象一下这种情况:你不知何故失去了你目前拥有的宝石。这是通过格式或系统更改或任何其他原因发生的。不管是什么,你已经失去了你的宝石。你将如何重新安装所有的 gem?您可以自己在其他地方保留一份清单,但这真的有可能吗?

Bundler 通过让您说明应用程序需要哪些 gem 并仅将这些 gem 添加到加载路径来解决此问题,这就是您找不到hpricot. 当您第一次运行bundle install时,这会创建一个Gemfile.lock包含以下内容的内容:

GEM
  remote: http://rubygems.org/
  specs:
    abstract (1.0.0)
    actionmailer (3.0.0)
    ...

因为您将此文件提交到您选择的源代码控制“解决方案”(无论是 Git、SVN、FTP 等等,这并不重要),因此您有一种可靠的方式来指定您的应用程序使用的这些 gem 的精确 gem 和精确版本。

当/如果您的 gem 被擦除时,您可以简单地再次克隆您的项目并运行bundle install. 因为该Gemfile.lock文件存在,所以即使有更新,您也将拥有与原来完全相同的 gem。

如果您不想要完全相同的gem,只需运行bundle update,这将忽略其中的规范Gemfile.lock,而是恢复为依赖于Gemfile定义它们。这将检查新版本的 gems 并安装它们,Gemfile.lock完成后更新。

老实说,我不明白 Bundler 的仇恨。如果你能用比“OMG IT SUCKS YEHUDA IS SATAN”更广泛的术语来解释,我将非常感激。

编辑:WedTM 要求提供示例 Gemfile 和相关代码:

在 Gemfile 你会有这个:

group(:scripts) do
  gem 'gem1'
end

要为您的脚本要求这些 gem:

require 'bundler'
Bundler.require(:scripts)

您可能还希望需要默认 gems,您可以通过将 default 添加到参数的任何位置来做到这一点require

Bundler.require(:default, :scripts)

如果由于某种原因这不起作用,我想那是因为它无法找到Gemfile. 这可以通过将 设置ENV['BUNDLE_GEMFILE']为 的路径来解决Gemfile

于 2010-09-04T08:57:40.387 回答
1

我想知道您是否可以在运行脚本之前使用 RVM 设置 ruby​​ 环境。也许带有宝石的东西,例如:

data = `rvm gemset use scripts; #{RAILS_ROOT}/lib/plugins/#{ds.name}`
于 2010-09-13T08:31:55.870 回答