Ruby gemfile中具有多个requires的gem

Ruby gemfile中具有多个requires的gem,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,所以我有这个宝石,它取决于很多其他宝石。在gemspec中,它说 s.add_dependency "haml" ... bundler似乎并不在意,所以我必须在文件中重复这些依赖关系。是否有需要多个gem的语法?类似的东西(不起作用): require似乎只允许一个对象我敢肯定Bundler会依靠gems本身来管理它们自己的依赖关系。其思想是,您不应该需要这样的语法来指定依赖项,因为gem在它的gempec文件中为您执行此操作,require关键字用于:“如果gem的主文件与gem名称不同,

所以我有这个宝石,它取决于很多其他宝石。在gemspec中,它说

s.add_dependency "haml" ...
bundler似乎并不在意,所以我必须在文件中重复这些依赖关系。是否有需要多个gem的语法?类似的东西(不起作用):


require似乎只允许一个对象

我敢肯定Bundler会依靠gems本身来管理它们自己的依赖关系。其思想是,您不应该需要这样的语法来指定依赖项,因为gem在它的
gempec
文件中为您执行此操作,
require
关键字用于:“如果gem的主文件与gem名称不同,请指定如何要求它。”

如果一个gem有
s.add_依赖项“haml”…
并且它不工作,那么gem的
gempsec
文件有错误,或者您的
bundler版本有错误(或者太老了,不知道依赖项或其他信息)。我会向《创业板》的作者报告

在您找出gem或其依赖项的问题之前,您可以使用的一种解决方法是,向gem文件添加注释,说明您这样做的原因


你对哪个宝石有意见?如果您指定了一个名称,其他人可能会验证您的体验或为您提供更好的帮助。另外,当您尝试在shell中使用gem dependency gem_name时会发生什么情况?

您必须告诉bundler使用gempec作为依赖项的源。要做到这一点,只需将其插入您的
GEM文件

source "http://rubygems.org"

# require this gem's dependencies
gemspec
通常对于gem,这是
Gemfile

的唯一内容,您只需传递一个requires数组即可。我在研究
RSpec
时遇到了这个问题,比如
Minitest
的语法糖,并指出我需要:

require 'minitest/spec'
require 'minitest/autorun'
让这一切顺利进行。我以前从未在
Gemfile
中尝试过多个requires,谷歌搜索将我引向了这个问题,更多的谷歌搜索将我引向
Gemfile
文档,其中说明:

REQUIRE AS (:require)
Each gem MAY specify files that should be used when autorequiring via
Bundler.require. You may pass an array with multiple files, or false
to prevent any file from being autorequired.

gem "sqlite3-ruby", :require => "sqlite3"
gem "redis", :require => ["redis/connection/hiredis", "redis"]
gem "webmock", :require => false
因此,在我自己的
Gemfile
中,我包含了

group :test do
  gem 'minitest', require: ['minitest/autorun', 'minitest/spec']
  gem 'rack-test', require: 'rack/test'
  gem 'simplecov', require: false
end
它工作得很好,允许我编写一个类似

describe 'basic crud' do
  it 'must create a user with valid details' do
    User.transaction do
      user = User.create!(username: 'test', password: 'pass')
      user.username.must_equal 'test'
      user.destroy
    end
  end
end

我发现它读起来比
assert\u equals user.username,'test'
更好,并且让我可以访问我熟悉的
之前:每个do…
之后:所有do…
准备和清理方法。

是否有一个命令可以使用bundler检查这一点?该创业板来自私人git回购,rubygems看不见。(这可能是不满足依赖关系的原因)它所依赖的gem也是私有的吗?如果是这样的话,那可能是你的问题。不,我不相信bundler有这样的命令。适当的命令应该是
gem-dependency
,因为bundler就是使用这个命令的。看见还要注意的是,bundler只在
sources
指令中指定的gem中查找gem,因此如果它所依赖的gem不是托管在
rubygems.org
上,您可能需要添加另一个源来告诉它在哪里可以找到这些依赖项。我刚刚检查过,回购协议实际上不是私有的,gempec就在那里:依赖关系是众所周知的gems。我刚刚在一个空白的Gemfile中添加了这一行:
gem'portfolio\u engine',:git=>'https://bitbucket.org/janlimpens/portfolio-engine.git“
,然后执行一个
捆绑安装
,它还安装了许多作为捆绑包依赖项的gem(包括
haml
)。哪些宝石没有安装,而您认为在尝试时应该安装?您使用的是什么版本的
bundler
describe 'basic crud' do
  it 'must create a user with valid details' do
    User.transaction do
      user = User.create!(username: 'test', password: 'pass')
      user.username.must_equal 'test'
      user.destroy
    end
  end
end