【发布时间】:2010-09-04 02:16:47
【问题描述】:
我正在编写一个应用程序,它将在指定文件夹中运行脚本,然后记录数字并绘制它们。
我的问题是,如果脚本是 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
【问题讨论】:
-
失败并显示什么错误信息?
-
@Ryan Bigg,我不想在我的 Gemfile 中要求每个 gem。我想要一个充满脚本的文件夹(Ruby 和非 ruby 之类的),ruby 将使用反引号迭代并在系统上执行。然后,我的 rails 应用程序会将每个文件的输出记录到数据库中。不应该要求那些依赖于 Rails 应用程序中的 gem。我应该能够在系统原生上下文中执行它。
-
@webdestroya,我面前没有确切的错误消息,但它是 LoadError -- hpricot 错误。这是因为 data =
#{RAILS_ROOT}/lib/plugins/#{ds.name}行尝试执行包含require hpricot的 ruby 脚本。 -
(后者)只是为了检查这里 - 带有
require hpricot的ruby 脚本是否有require 'rubygems'前面?我想确保您正确地认为问题在于捆绑程序实际上破坏了系统调用的加载路径,而不是脚本具有未声明的依赖项。我会假设反引号转义的命令不会知道捆绑程序。
标签: ruby-on-rails ruby-on-rails-3 bundler