Rails 3, Bundler, LoadError - PullRequest
       3

Rails 3, Bundler, LoadError

1 голос
/ 04 сентября 2010

Я пишу приложение, которое будет запускать скрипты в указанной папке, а затем записывать числа и наносить их на график.

Моя проблема в том, что если скрипт представляет собой файл ruby, операторы внутри скрипта не выполняются операторы require, потому что, похоже, что упаковщик сделал что-то необычное с путем загрузки.

Запуск 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

Ответы [ 2 ]

2 голосов
/ 04 сентября 2010

(Исходя из ваших комментариев к вопросу)

Вам нужно будет добавить hpricot (и любой другой драгоценный камень, который ему нужен) к вашему Gemfile, чтобы они были доступны в Bundler.Bundler - это на данный момент самый простой способ избежать конфликтов драгоценных камней и дурачества.

Представьте себе такую ​​ситуацию: вы каким-то образом теряете драгоценные камни, которые у вас есть в настоящее время.Происходит ли это через изменение формата или системы или по любой другой причине.Что бы это ни было, вы потеряли свои драгоценные камни.Как вы собираетесь переустановить все свои драгоценные камни?Вы могли бы хранить их список где-то еще самостоятельно, но действительно ли это возможно?

Bundler решает эту проблему, заставляя вас указать, какие гемы нужны вашему приложению, и только добавлять эти драгоценные камни в нагрузку.путь, поэтому вы не можете найти hpricot.Когда вы запускаете bundle install в первый раз, это создает Gemfile.lock, который содержит что-то вроде этого:

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

Поскольку вы фиксируете этот файл в своем «исходном» решении для управления исходным кодом (будь то Git,SVN, FTP, что угодно, это не важно) у вас есть надежный способ указать точные драгоценные камни и точные версии тех драгоценных камней, которые использует ваше приложение.

Когда / Если ваши драгоценные камни стерты, вы можете просто клонировать свойснова проект и запустить bundle install.Поскольку файл Gemfile.lock существует, у вас будут те же самые драгоценные камни, которые у вас были изначально, даже если были обновления.

Если вы не хотите точных таких же драгоценных камней, простозапустите bundle update, и это будет игнорировать спецификации в Gemfile.lock, а вместо этого вернется к зависимости от Gemfile для их определения.Это проверит наличие новых версий гемов и установит их, обновив Gemfile.lock, когда это будет сделано.

Честно говоря, я не понимаю ненависть к Бандлеру.Если бы вы могли объяснить в более широких терминах, чем «ОМГ ЭТО ХОРОШО, ЙЕУДА САТАНА», я был бы очень признателен.

Редактировать: WedTM попросил образец Gemfile и связанный код:

В Gemfile у вас будет это:

group(:scripts) do
  gem 'gem1'
end

Чтобы потребовать эти драгоценные камни для ваших скриптов:

require 'bundler'
Bundler.require(:scripts)

Вы также можете захотеть потребовать драгоценные камни по умолчанию, которыеВы можете сделать это, просто добавив значение по умолчанию в любом месте к аргументам require:

Bundler.require(:default, :scripts)

Если по какой-то причине это не сработает, я думаю, что это произойдет, потому что он не может найти Gemfile,Это можно исправить, установив ENV['BUNDLE_GEMFILE'] путь к Gemfile.

1 голос
/ 13 сентября 2010

Интересно, сможете ли вы использовать RVM для настройки среды ruby ​​перед запуском ваших скриптов.Может быть, что-то с гемсетом вроде:

data = `rvm gemset use scripts; #{RAILS_ROOT}/lib/plugins/#{ds.name}`
...