【问题标题】:Rails 3.0 - can't load ruby-oci8 with BundlerRails 3.0 - 无法使用 Bundler 加载 ruby​​-oci8
【发布时间】:2013-01-10 00:19:21
【问题描述】:

Rails n00b 在这里 - 需要一些帮助。我正在尝试将 Rails3 应用程序从 Linux 移植到 Windows。我的 Gemfile 如下所示:

source 'http://rubygems.org'
gem 'rails', '3.0.0'
gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3'
gem 'ruby-oci8', '1.0.6'

我在这台 Windows 机器上没有 Oracle 客户端,所以我无法本地编译 ruby​​-oci8 gem。

我已经在我的 Gemfile 中注释掉了“ruby-oci8”行,并从这里手动安装了 gem:http://rubygems.org/downloads/ruby-oci8-1.0.6-x86-mswin32-60.gem。我还将必要的 DLL 复制到 ruby\bin

我已经验证它有效:

ruby -rubygems -e "require 'oci8'; OCI8.new('user','password','pasdev:2700/gen11dvu').exec('select * from ARCS_USER_LO
GON') do |r| puts r.join(','); end"

这会从我的数据库返回大量数据,所以我知道它有效。

但是,如果我尝试从 rails 控制台(或正在运行的应用程序)require 'oci8',我会得到以下信息:

LoadError: no such file to load -- oci8

我认为这发生在 b/c Rails 只加载 Gemfile 中指定的 gem,但我不知道如何指定它!我已经安装了我需要的 gem:

C:\javadev\ashbtw3>gem list

*** LOCAL GEMS ***

activerecord (3.0.0)
bundler (1.0.21, 1.0.0)
rails (3.0.0)
rake (0.8.7)
ruby-oci8 (1.0.6 x86-mswin32-60)
...etc...

如果我在 Gemfile 中取消注释这一行:

gem 'ruby-oci8', '1.0.6'

bundle 尝试下载并编译另一个 1.0.6,当然失败了。我也尝试了所有这些变体,但均未成功:

gem 'ruby-oci8', '1.0.6', :platforms => :mingw
gem 'ruby-oci8', '1.0.6-x86-mswin32-60', :platforms => :mingw32
gem 'ruby-oci8-1.0.6-x86-mswin32-60'
gem 'ruby-oci8', '1.0.6-x86-mswin32-60'

为什么 bundler 试图安装我已经拥有的 gem?如何正确指定版本和平台以使 Bundler 看到该 gem 已安装,并将其包含在 Gemfile.lock 中?这里有没有其他解决方案,我可以在不安装 Oracle 客户端的情况下使用?

编辑 1

按照凯尔的建议,我尝试了以下方法:

gem 'ruby-oci8', :path => 'C:/Ruby187/lib/ruby/gems/1.8/gems/ruby-oci8-1.0.6-x86-mswin32-60

这使得 Bundler 运行成功!

Using ruby-oci8 (1.0.6) from source at C:/Ruby187/lib/ruby/gems/1.8/gems/ruby-oci8-1.0.6-x86-mswin32-60

但是,现在尝试从 Rails 控制台要求“oci8”给了我这个:

C:\javadev\ashbtw3>ruby script\rails console
Loading development environment (Rails 3.0.0)
irb(main):001:0> require 'oci8'
LoadError: no such file to load -- oci8lib
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:225:in `load_dependency'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:591:in `new_constants_in'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:225:in `load_dependency'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `require'
        from C:/Ruby187/lib/ruby/gems/1.8/gems/ruby-oci8-1.0.6-x86-mswin32-60/lib/oci8.rb:20
        from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.0/lib/active_support/dependencies.rb:239:in `require'

它丢失的文件位于已安装 gem 目录中的 ext/oci8 下,但它看不到它。

还有什么我可以做的吗?

【问题讨论】:

    标签: ruby-on-rails bundler gemfile oci8


    【解决方案1】:

    您是否尝试过指定 :path

    gem 'ruby-oci8', :path => '/path/to/ruby-oci8-1.0.6-x86-mswin32-60'
    

    【讨论】:

    • 谢谢凯尔 - 看起来它可能有效,但我无法直接指定宝石。当我尝试它说:The path c:/ruby-oci8-1.0.6-x86-mswin32-60.gem does not exist. 当我使用你的想法并将路径指向已安装的 gem 目录而不是 gem 文件本身时,它确实更进一步。我已经用那次尝试的结果更新了我的问题。
    • @ValBlant 除了在 gemfile 中添加 require => 'oci8' 之外,我不确定还能尝试什么。这是一个完整的猜测。我不知道它是否会起作用。祝你好运!
    • 不走运。 require => 'oci8' 什么也没做。
    • 当。它越来越需要,但是在其中一个 oci8 文件中,路径似乎混淆了,因此它不需要另一个文件。从您的堆栈跟踪:/lib/oci8.rb:20。对不起,我帮不上什么忙。祝你好运。
    猜你喜欢
    • 2016-01-19
    • 2011-10-24
    • 2017-08-14
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多