代码之家  ›  专栏  ›  技术社区  ›  WedTM

Rails 3,捆绑机,装载错误

  •  1
  • WedTM  · 技术社区  · 16 年前

    我的问题是,如果脚本是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
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Ryan Bigg Andrés Bonilla    16 年前

    (基于你对这个问题的评论)

    Gemfile 这样就可以由Bundler提供了。捆绑机是 到目前为止

    想象一下这种情况:你不知何故失去了你目前拥有的宝石。无论这种情况是通过格式或系统更改或任何其他原因发生的。不管是什么,你的宝贝都丢了。你打算如何重新安装你所有的宝石?你呢 能够

    Bundler通过让您声明应用程序需要什么gem并只将这些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的精确版本。

    当/如果你的宝石被清除,你可以简单地克隆你的项目再次运行 捆绑安装 Gemfile.lock文件

    如果你不想 准确的 bundle update 这将忽略 Gemfile公司 来定义它们。这将检查gems的新版本并安装它们,更新 当它完成的时候。

    老实说,我不理解捆绑者的仇恨。如果你能用比“天哪,耶胡达是撒旦”更宽泛的词来解释,我将不胜感激。

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

    在Gemfile中,您将拥有以下内容:

    group(:scripts) do
      gem 'gem1'
    end
    

    要在脚本中使用这些宝石:

    require 'bundler'
    Bundler.require(:scripts)
    

    您可能还希望需要默认gem,您可以通过在的参数中添加default anywhere来实现这一点 require :

    Bundler.require(:default, :scripts)
    

    如果这个因为某种原因不起作用,我想这是因为它无法定位 Gemfile公司 ENV['BUNDLE_GEMFILE'] 去那条通往 Gemfile公司

        2
  •  1
  •   Andrew Vit    16 年前

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

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