当我的 .gemspec 中包含所有 gem 时,如何避免打包程序警告多个来源?

How can I avoid bundlers warning about multiple sources when I have all gems in my .gemspec?

在我自己的 gem 中,我有一个 Gemfile 基本上是这样的:

source 'https://my.gemserver.com'
source 'https://rubygems.org'

gemspec

我的 .gemspec 将所有依赖项列为 add_dependencyadd_development_dependency

从 Bundler 1.8 开始,我收到警告:

Warning: this Gemfile contains multiple primary sources. Using `source` more than
once without a block is a security risk, and may result in installing unexpected gems.
To resolve this warning, use a block to indicate which gems should come from the
secondary source. To upgrade this warning to an error,
run `bundle config disable_multisource true`.

有没有办法解决这个警告(不通过捆绑配置静音)?我在 Rubygems 规范中找不到有关源选项的任何信息。

不,您需要关闭警告或将源代码块添加到您的 Gemfile 中,其中包含您希望来自您的私人服务器的特定 gem。不需要复制来自 rubygems.org 的那些(或者你可以反过来做,如果你依赖比 public 更私有的 gem,并且你的私有 gem 本身并不依赖于 public。

问题是 gemspec 格式不支持为每个 gem 指定来源,因此如果不将它们复制到 Gemfile,就无法指定哪个来源gem来自每个来源。

有点难过,但必须将它移到 Gemfile :-(

宝石文件:

source 'https://my.gemserver.com' do
  your_gem1
  your_gem2
  #...
end

source 'https://rubygems.org'

gemspec

但是,如果您的某些宝石应该包含在 :development:test 组中,则可以使用以下内容

宝石文件:

your_gem1, :source => 'https://my.gemserver.com'
#...
group :development do
  your_gem2, :source => 'https://my.gemserver.com'
  #...
end

source 'https://rubygems.org'

gemspec

要详细说明关于 the bundler issue 的讨论,正如之前的回答所述,您 必须 Gemfile 中包含 gem。但是,您只需要在 .gemspec 中指定 gem 的版本。如果您更改版本的频率高于私有依赖项,这不是一个糟糕的解决方案。

引用Gemfile中没有版本的gem:

# Gemfile
source 'https://rubygems.org'

source 'https://xxx@gem.fury.io/me/' do
  gem 'my-private-dependency'
end

gemspec

参考 gem 和 .gemspec 中的版本说明:

# my-gem.gemspec
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)

Gem::Specification.new do |spec|
  spec.add_dependency 'my-private-dependency', '~> 0.1.5'
end