我有一个看起来像这样的Gemfile:
来源' http://rubygems.org'
gemspec
gem "parent_gem", "0.1.3", :path => "#{File.expand_path(__FILE__)}/../vendor/gems/parent_gem-0.1.3"
parent_gem
取决于child_gem-1.4.1
,我们已将其打包在包中的/vender/gems
文件夹中。如果用户在Ubuntu上的主机上安装child_gem-1.6.0
,他们将获得Gem::ConflictError
,因为它会尝试使用1.6并记录child_gem-1.6.0 conflicts with child_gem (~> 1.4.1).
但是,如果用户在Amazon Linux上运行它,那么工作正常并使用打包的子gem。
如果我运行gem list child_gem
,我会在两个系统上获得以下输出:
*** LOCAL GEMS ***
child_gem (1.6.1)
gem list parent_gem
不返回任何内容,因为它没有分开安装,只存在于程序包的vendor
目录中。
在启动脚本的文件中,有以下行:
Gem.use_paths(nil, Gem.path << "/opt/my-app/vendor")
/opt/my-app/vendor
目录包含child_gem-1.4.1
。
最终,我知道使用Bundler正确设置软件包可以解决问题,但我试图理解为什么这是一个问题。
Ruby如何决定在系统中寻找宝石的位置?我在哪里可以理解为什么它适用于亚马逊Linux但不适用于Ubuntu?