gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:43 27 4
gpt4 key购买 nike

我在一个小团队中工作,开发了几个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com