【问题标题】:How do I vendorize gems for Rails3/Bundler我如何为 Rails3/Bundler 供应 gems
【发布时间】:2010-09-05 16:42:22
【问题描述】:

在 Rails 2.X 中,我可以简单地将 gem 复制到 vendor/gems/gem_name,或者使用 rake 命令 rake gems:unpack。由于 Rails3 使用捆绑器,它似乎不再工作了。我找到了命令bundle package,但它的工作方式不一样。

编辑:

所以,只是详细说明一下:

rails 2 的工作方式,我可以轻松地 grepvendor/gems 中找到东西。如果它们捆绑在.gem 文件中,这是不可能的。此外,在开发 gem/plugin 时,将其放置在 rails 应用程序中以在上下文中对其进行测试非常有帮助。我将如何使用 bundler/rails3 做这些事情?我的工作流程是否天生就被破坏了?

【问题讨论】:

  • 我有一个 rails 2 应用程序,因为我已经在 vendor 文件夹中有 mysql2 gem。我的疑问是,如果是 Rails 3,我们可以在 Gemfile 中调用 vendor 文件夹中的 gem,例如 gem 'gemname', :path => 'path to gemfile inside vendor directory' 但我不知道在哪里以及如何调用 Rails 2 中 vendor 文件夹中的 gem。任何人都可以帮助我在这。如何要求并提及供应商文件夹中存在的 gem 的路径(因为我们没有 Gemfile)?

标签: ruby-on-rails ruby-on-rails-3 bundler


【解决方案1】:

回答您问题的第二部分,开发插件/gem 并将其与 rails 应用程序一起发布,而不公开 gem,您可以这样做

宝石文件

gem 'my_private_gem', :path => "vendor/gems/my_private_gem-VERSION"

假设您执行了gem unpack my_private_gem --target vendor/gems

注意:bundle package 解包所有 gem(与 Gemfile.lock 中的一样多)。我不想要 git 中的那些。

【讨论】:

  • 请注意,如果您使用了“gem unpack”命令,那么您将需要明确列出您出售的 gem 的版本号,因为不会有 *.gemspec 文件- 见manpage
  • 我必须包含 gem 版本号,以便 bundler 在给定路径中找到 gem。 gem 'my_private_gem', '1.2.3', :path => "vendor/gems/my_private_gem-VERSION"
  • my_private_gem-VERSION 解包方法对我不起作用,但这样做: gem unpack my_private_gem --version VERSION --target vendor/gems
  • 这对我有用 gem unpack my_private_gem --target vendor/gems --spec 但它把 gem 规范放在当前目录而不是目标!那么mv my_private_gem.gemspec vendor/gems 现在 bundler 不会抱怨 gem 版本了。
【解决方案2】:

Bundler 等效项 bundle package。它将 Gemfile 中指定的所有 .gem 文件打包到 vendor/cache 中,以便将来的安装从这个缓存而不是 http://rubygems.org/ 中获取 gems

【讨论】:

  • 感谢您向我保证这是 预期行为。虽然它并没有真正解决我的根本问题,所以我接受了 Ole 的回答。
【解决方案3】:

正确的 Bundler 等效项是 bundle install --deployment。这将在 vendor/bundle 中以解压状态安装 gem。

【讨论】:

  • 谢谢。这似乎等同于rake gems:unpack。对于我的用例,我只想出售单个 gem,所以这里 Ole 的答案仍然是最好的解决方案,但如果你想出售所有 gem,很高兴知道有更好的方法。
  • 这个答案和 cmets 对这个问题很重要,因为许多人寻求“销售”大多数但不是所有的宝石
【解决方案4】:

这对我有用:

gem unpack <GEM_NAME> [-v <VERSION>] --target vendor/gems
gem specification <GEM_NAME> [-v <VERSION>] --ruby > vendor/gems/<GEM_NAME>[-<VERSION>].gemspec

例如:

gem unpack sidekiq-pro -v 2.1.4 --target vendor/gems
gem specification sidekiq-pro -v 2.1.4 --ruby > vendor/gems/sidekiq-pro-2.1.4.gemspec

第一个命令将 gem 解压到 vendor/gems 目录中。但是,这不包含 gemspec。第二个命令创建关联的 gemspec。值得注意的是,另一张海报提到了类似的事情。此解决方案以 ruby​​ 格式而不是 yaml 格式正确编写 gemspec。

然后您可以更新您的 Gemfile 以指向供应商的 gem:

gem '<GEM_NAME>', '<VERSION>', :path => "vendor/gems/<GEM_NAME>-<VERSION>"

例如:

gem 'sidekiq-pro', '2.1.4', :path => "vendor/gems/sidekiq-pro-2.1.4"

【讨论】:

    【解决方案5】:

    考虑使用hosted_gem_development gem 提供的“托管”开发基础架构。

    开发 gems 往往很棘手,因为就您在其中使用它们的应用程序而言,它们就像单独的项目一样。

    “托管”开发基础设施通过将 gem 包含到(使它们“托管”)您的实时应用程序中来使开发更加容易。然后像更新常规应用程序代码一样更新 gem 的代码。

    Go to project page

    【讨论】:

    • 很高兴你们对我投了反对票,但这篇文章并不是盲目的宣传。它也与宝石供应商化有关。
    • 假设我有一个版本化的应用程序,我想始终使用 gem 的最新提交。您的 gem 会起作用(以及在生产中)吗?
    • @lulalala,使用 hosted_gem_development 你必须手动更新 gem 源,例如通过发出git pull 或其他任何方式。
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2015-04-26
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多