Bundler

Bundler/DuplicatedGem

默认启用 安全 支持自动更正 添加版本 更改版本

启用

0.46

1.40

Gem 的要求应在 Gemfile 中只列出一次。

示例

# bad
gem 'rubocop'
gem 'rubocop'

# bad
group :development do
  gem 'rubocop'
end

group :test do
  gem 'rubocop'
end

# good
group :development, :test do
  gem 'rubocop'
end

# good
gem 'rubocop', groups: [:development, :test]

# good - conditional declaration
if Dir.exist?(local)
  gem 'rubocop', path: local
elsif ENV['RUBOCOP_VERSION'] == 'master'
  gem 'rubocop', git: 'https://github.com/rubocop/rubocop.git'
else
  gem 'rubocop', '~> 0.90.0'
end

可配置属性

名称 默认值 可配置值

严重程度

警告

字符串

包含

**/*.gemfile, **/Gemfile, **/gems.rb

数组

Bundler/DuplicatedGroup

默认启用 安全 支持自动更正 添加版本 更改版本

启用

1.56

-

Gem 组或一组组应在 Gemfile 中只列出一次。

例如,如果围绕 groupsourcegitplatformspath 的值不同,则不会注册任何违规。

platforms :ruby do
  group :default do
    gem 'openssl'
  end
end

platforms :jruby do
  group :default do
    gem 'jruby-openssl'
  end
end

示例

# bad
group :development do
  gem 'rubocop'
end

group :development do
  gem 'rubocop-rails'
end

# bad (same set of groups declared twice)
group :development, :test do
  gem 'rubocop'
end

group :test, :development do
  gem 'rspec'
end

# good
group :development do
  gem 'rubocop'
end

group :development, :test do
  gem 'rspec'
end

# good
gem 'rubocop', groups: [:development, :test]
gem 'rspec', groups: [:development, :test]

可配置属性

名称 默认值 可配置值

严重程度

警告

字符串

包含

**/*.gemfile, **/Gemfile, **/gems.rb

数组

Bundler/GemComment

默认启用 安全 支持自动更正 添加版本 更改版本

已禁用

0.59

0.85

Gemfile 中的每个 gem 应包含一个注释,解释其在项目中的用途,或其版本或来源的原因。

可选的 "OnlyFor" 配置数组可用于仅在 gem 使用某些选项或具有版本说明符时注册违规。

当包含 "version_specifiers" 时,如果 gem 具有任何版本说明符,则会强制执行注释。

当包含 "restrictive_version_specifiers" 时,如果 gem 具有阻止 gem 版本的版本说明符,则会强制执行注释。

对于数组中的任何其他值,如果存在同名的选项,则会强制对 gem 执行注释。一个有用的用例是在使用更改 gem 来源的选项时强制执行注释。

  • bitbucket

  • gist

  • git

  • github

  • source

有关 Bundler 支持的所有选项的完整列表,请参阅 https://bundler.rubygems.org.cn/man/gemfile.5.html

示例

OnlyFor: [] (默认)

# bad

gem 'foo'

# good

# Helpers for the foo things.
gem 'foo'

OnlyFor: ['version_specifiers']

# bad

gem 'foo', '< 2.1'

# good

# Version 2.1 introduces breaking change baz
gem 'foo', '< 2.1'

OnlyFor: ['restrictive_version_specifiers']

# bad

gem 'foo', '< 2.1'

# good

gem 'foo', '>= 1.0'

# Version 2.1 introduces breaking change baz
gem 'foo', '< 2.1'

OnlyFor: ['version_specifiers', 'github']

# bad

gem 'foo', github: 'some_account/some_fork_of_foo'

gem 'bar', '< 2.1'

# good

# Using this fork because baz
gem 'foo', github: 'some_account/some_fork_of_foo'

# Version 2.1 introduces breaking change baz
gem 'bar', '< 2.1'

可配置属性

名称 默认值 可配置值

包含

**/*.gemfile, **/Gemfile, **/gems.rb

数组

IgnoredGems

[]

数组

OnlyFor

[]

数组

Bundler/GemFilename

默认启用 安全 支持自动更正 添加版本 更改版本

启用

1.20

-

验证项目是否包含 Gemfile 或 gems.rb 文件以及根据配置的正确关联锁定文件。

示例

EnforcedStyle: Gemfile (默认)

# bad
Project contains gems.rb and gems.locked files

# bad
Project contains Gemfile and gems.locked file

# good
Project contains Gemfile and Gemfile.lock

EnforcedStyle: gems.rb

# bad
Project contains Gemfile and Gemfile.lock files

# bad
Project contains gems.rb and Gemfile.lock file

# good
Project contains gems.rb and gems.locked files

可配置属性

名称 默认值 可配置值

EnforcedStyle

Gemfile

Gemfile, gems.rb

包含

**/Gemfile, **/gems.rb, **/Gemfile.lock, **/gems.locked

数组

Bundler/GemVersion

默认启用 安全 支持自动更正 添加版本 更改版本

已禁用

1.14

-

强制 Gem 版本规范或提交引用(分支、引用或标签)是必需的还是禁止的。

示例

EnforcedStyle: required (默认)

# bad
gem 'rubocop'

# good
gem 'rubocop', '~> 1.12'

# good
gem 'rubocop', '>= 1.10.0'

# good
gem 'rubocop', '>= 1.5.0', '< 1.10.0'

# good
gem 'rubocop', branch: 'feature-branch'

# good
gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'

# good
gem 'rubocop', tag: 'v1.17.0'

EnforcedStyle: forbidden

# good
gem 'rubocop'

# bad
gem 'rubocop', '~> 1.12'

# bad
gem 'rubocop', '>= 1.10.0'

# bad
gem 'rubocop', '>= 1.5.0', '< 1.10.0'

# bad
gem 'rubocop', branch: 'feature-branch'

# bad
gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'

# bad
gem 'rubocop', tag: 'v1.17.0'

可配置属性

名称 默认值 可配置值

EnforcedStyle

required

required, forbidden

包含

**/*.gemfile, **/Gemfile, **/gems.rb

数组

AllowedGems

[]

数组

Bundler/InsecureProtocolSource

默认启用 安全 支持自动更正 添加版本 更改版本

启用

始终

0.50

1.40

将符号参数传递给 source(例如 source :rubygems)已弃用,因为它们默认使用 HTTP 请求。如果可能,请改为指定 'https://rubygems.org.cn',或者如果不行,请指定 'https://rubygems.org.cn'

自动更正时,此 cop 将用 'https://rubygems.org.cn' 替换符号参数。

此 cop 不会替换使用 http:// 的现有源。这在 HTTPS 不可用的情况下可能是必要的。例如,在通过内联网使用内部 gem 服务器时,或在禁止 HTTPS 时。但是,您应该尽可能强烈地首选 https://,因为它更安全。

如果您不允许 http://,请将 false 设置为 AllowHttpProtocol。此选项默认情况下为 true,以确保安全自动更正。

示例

# bad
source :gemcutter
source :rubygems
source :rubyforge

# good
source 'https://rubygems.org.cn' # strongly recommended

AllowHttpProtocol: true (默认)

# good
source 'https://rubygems.org.cn' # use only if HTTPS is unavailable

AllowHttpProtocol: false

# bad
source 'https://rubygems.org.cn'

可配置属性

名称 默认值 可配置值

严重程度

警告

字符串

AllowHttpProtocol

true

布尔值

包含

**/*.gemfile, **/Gemfile, **/gems.rb

数组

Bundler/OrderedGems

默认启用 安全 支持自动更正 添加版本 更改版本

启用

始终

0.46

0.47

宝石应该在组内按字母顺序排序。

示例

# bad
gem 'rubocop'
gem 'rspec'

# good
gem 'rspec'
gem 'rubocop'

# good
gem 'rubocop'

gem 'rspec'

TreatCommentsAsGroupSeparators: true(默认)

# good
# For code quality
gem 'rubocop'
# For tests
gem 'rspec'

TreatCommentsAsGroupSeparators: false

# bad
# For code quality
gem 'rubocop'
# For tests
gem 'rspec'

可配置属性

名称 默认值 可配置值

TreatCommentsAsGroupSeparators

true

布尔值

ConsiderPunctuation

false

布尔值

包含

**/*.gemfile, **/Gemfile, **/gems.rb

数组