ruby - 如何让 Bundler 识别间接依赖的位置声明?

标签 ruby bundler

我在一个小团队中工作,开发了几个 gem 供内部使用。这些 gem 在不同程度上相互依赖,并托管在我的 Github 帐户上。当我声明对这些 gem 的依赖时,我总是在声明 Gemfile 中放入::git => 'url/for/gem/on/github'。但是我遇到了 Bundler 的一些令人困惑的行为——我认为:

  • 如果 gem A 依赖并在 A 的 Gemfile 中声明 github 托管的 B
  • B 依赖并在 B 的 Gemfile 中声明 github 托管的 C
  • 然后当我从 A... 运行 bundle install
  • Bundler 应该从 github 中获取 B,如 A 的 Gemfile 中所声明的那样
  • 然后从 github 中获取 C,如 B 的 Gemfile 中声明的那样

但是 Bundler 提示它找不到 C。如果我在 A 的 Gemfile 中声明 C 的正确位置,那么它不会提示。我是否正确地推断 Bundler 实际上根本不查看依赖项 Gemfile,而只是查看它们的 gemspec?如果是,对于我描述的问题,是否有比直接在 A 的 Gemfile 中将 C 声明为 A 的依赖项更好的解决方案?

更新:看来如果您可以在Gemfile 中声明一个Github 帐户作为gem 源,那么这个问题就可以解决了。这可能吗?

最佳答案

我们最近不得不处理一个非常相似的情况,内部 gem 相互依赖。我们已经使用了内部 git 主机 (GitLab),但遇到了同样的问题,无法在 gemspec 中声明 bundle 样式 git:branch: 属性。

我们的解决方案是同时设置内部 gem 托管。使用 geminabox 可以很容易地启动和运行 gem 主机。真的。运行 gem install geminabox 并为您的网络服务创建一个文件夹(我们使用 passenger,ymmw):

gems/
  public/
  tmp/
    restart.txt
  gems/
  config.ru

编辑 config.ru 这样的东西:

require "rubygems"
require "geminabox"

Geminabox.data = "gems"
run Geminabox

然后将 passenger 指向 gems/public 文件夹,它将作为一个普通的机架应用程序启动,供您使用。只需将 url 添加到 gemfiles 中的服务并跳过内部 gems 的整个 git 问题,这是我的建议 :)

有关 geminabox 的更多信息可以在他们的 github 页面上找到:https://github.com/geminabox/geminabox

关于ruby - 如何让 Bundler 识别间接依赖的位置声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017057/

相关文章:

mysql - ld : library not found for -lzstd while bundle install for mysql2 gem Ruby on macOS Big Sur 11. 4

ruby - bundle 执行中间人服务器未按预期工作

ruby - Gemfile 中可以有多个版本的 gem 吗?

ruby - JRuby "no such file to load"

ruby-on-rails - Ruby RI 失败,RDoc::Context::Section 的实例需要有方法 `marshal_load' (TypeError)

ruby-on-rails - 我怎样才能以一种很好的方式呈现 postgres 错误?

sql - 多态关联和外键引用可以引用同一个表。如何制作新对象?

ruby - 使用bundle install --path安装时无法找到ruby gems

ruby-on-rails - 如何在不加载所有记录的情况下从按特定属性排序的数据库中获取 "next"记录?

ruby-on-rails - 如何制作死链接记者?