如何在脱机.gem文件中使用Bundler?

时间:2010-11-24 22:05:10

标签: ruby-on-rails ruby rubygems bundler

对于我的应用程序,我需要处理加密的ZIP文件。尽管他们看起来很可怕,但似乎Chilkat的commercial Zip gem可能是实现这一目标的最佳方式。

因为这是一个商业宝石,所以他们没有Bundler所看到的任何典型宝石资源。我能够在Mac OS X下安装Linux 64位版本的gem(虽然我还没有尝试过运行它,所以还没有任何关于它是否真的有用的话)。但是,我首先尝试让Bundler从我下载的.gem文件中识别并加载gem。

Bundler有一个path attribute,我试图在几个方面使用它,但我还没有让它工作:

  1. 我尝试使用path指向.gem文件本身,但路径需要一个目录。
  2. 我尝试将.gz添加到.gem文件的末尾并解压缩 - 我在里面找到了一个带有data.tar.gz和metadata.gz的目录。用这两个文件指向解压缩目录的路径不起作用。
  3. 我尝试提取data.tar.gz和metadata.gz,并将提取的版本放在我指向路径的目录中。这失败了。
  4. 我注意到gem没有gemspec文件 - 我创建了一个并将其放在目录中。没有运气。
  5. 这是我得到的错误:

    $ bundle install
    Fetching source index for http://rubygems.org/
    Fetching source index for http://gems.github.com/
    Could not find gem 'chilkat (>= 0, runtime)' in source at /Users/username/appname/vendor/cache/chilkat-9.1.0-x86_64-linux.
    Source does not contain any versions of 'chilkat (>= 0, runtime)'
    

    关于如何让Bundler看到gem确实在这个目录中的任何想法?路径属性以外的任何其他选项似乎都不起作用?

    非常感谢!

5 个答案:

答案 0 :(得分:71)

我正在使用Rails 3.0.3,Rails 3和bundler的新功能。

我得到同样的错误:

gem 'mygem', :path => '/path/to/gem'

通过指定版本号解决:

gem 'mygem', '0.0.1', :path => '/path/to/gem'

>=0.0.1用于恢复为原始错误的版本。但是,我无法解释这一点。

引用JD有用的提交,来自Gemfile手册页:“类似于:git选项的语义,:path选项要求相关目录包含gem的.gemspec,或者指定显式捆绑商应该使用的版本。“

答案 1 :(得分:10)

尝试解压缩gem,然后使用Gemfile中的路径。

gem unpack my-gem-file.gem /my-rails-app/vendor/gems/

然后将这样的行添加到Gemfile

gem 'my-gem', '0.0.1', :path => 'vendor/gems/my-gem'

显然路径和版本号会有所不同。您还可能需要在应用程序根目录中创建vendor / gems目录(如果它尚不存在)。

答案 2 :(得分:5)

将gem复制到应用程序根文件夹中的vendor / cache目录。

bundle install --local

这将安装本地gem。

答案 3 :(得分:0)

由于此gem将在您运行应用程序的任何计算机上是本地的,只需在Gemfile中指定gem,然后手动安装gem。当您运行“捆绑安装”时,捆绑包将看到它已经安装并继续运行。

当安装ruby-debug-base19的版本时,这对我来说很有用,但在rubygems.org上还没有。

另一种方法是设置您自己的宝石服务器,可供所有应用服务器访问。见http://guides.rubygems.org/run-your-own-gem-server/

我自己从未这样做,但看起来非常简单。如果您的宝石服务器将在互联网上,请确保您没有违反任何Chilkat服务条款。

答案 4 :(得分:0)

首先使用semanticart解决方案解压缩gem。然后在解压缩的gem中添加gemspec。 Bundler将能够正常运行。

Gem::Specification.new do |s|
  s.name         = "chilkat"
  s.version      = "9.4.1"
  s.platform     = Gem::Platform::RUBY
  s.required_rubygems_version = ">= 1.3.6"
  s.files        = Dir.glob("lib/**/*")
  s.require_path = "lib"
  s.summary      = "Make do with a self written gemspec"
end