【问题标题】:How to use Bundler with offline .gem file?如何将 Bundler 与离线 .gem 文件一起使用?
【发布时间】:2011-05-15 09:22:18
【问题描述】:

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

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

Bundler 有一个 path attribute,我已经尝试以多种方式使用它,但我还没有让它工作:

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

这是我得到的错误:

$ 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 确实在这个目录中的任何想法?除了似乎不起作用的路径属性之外的任何其他选项?

非常感谢!

【问题讨论】:

  • 您能否围绕它构建一个 gem,需要 .gem 文件,并带有适当的 gemspec?

标签: ruby-on-rails ruby rubygems bundler


【解决方案1】:

我正在使用 Rails 3.0.3,Rails 3 和捆绑器的新手。

我遇到了同样的错误:

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

通过指定版本号解决:

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

使用>=0.0.1 将版本还原为原始错误。但是,我无法解释这些。

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

【讨论】:

  • 不知道为什么这个答案被否决了。明确包括对我有用的版本号。
  • 谢谢——重新审视这个问题后,我发现我的回答可能不是针对具体问题,而是相同的错误消息。
  • .gem复制到vendor/cache文件夹时,同样的“必须指定版本号”适用
  • 回答您关于版本号的问题。从 Gemfile 手册页:“类似于 :git 选项的语义,:path 选项要求相关目录包含 gem 的 .gemspec,或者您指定捆绑程序应使用的显式版本。”
【解决方案2】:

尝试解压缩 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 目录尚不存在,您可能还需要在应用根目录中创建它。

【讨论】:

  • 同意这是一种解决方法,但在内置此功能之前,它是这种情况的最佳答案
  • 你需要一个标志才能让你的命令工作:gem unpack my-gem-file.gem --target=/my-rails-app/vendor/gems/
【解决方案3】:

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

bundle install --local

这将安装本地 gem。

【讨论】:

    【解决方案4】:

    由于此 gem 将位于您将在其上运行应用程序的任何机器上,因此只需在 Gemfile 中指定 gem,然后手动安装 gem。当您运行“bundle install”时,bundler 将看到它已经安装并继续。

    在安装 ruby​​gems.org 上尚不可用的 ruby​​-debug-base19 版本时,这对我有用。

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

    我自己从来没有这样做过,但它看起来很简单。如果您的 gem 服务器将在 Internet 上,请确保您没有违反任何 Chilkat 服务条款。

    【讨论】:

      【解决方案5】:

      首先使用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
      

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        相关资源
        最近更新 更多