Gemspec

Gemspec/DependencyVersion

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

已禁用

1.29

-

强制 gem 依赖项版本规范或提交引用(分支、ref 或标签)必须存在或禁止。

示例

EnforcedStyle: required(默认)

# bad
Gem::Specification.new do |spec|
  spec.add_dependency 'parser'
end

# bad
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser'
end

# good
Gem::Specification.new do |spec|
  spec.add_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

# good
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

EnforcedStyle: forbidden

# bad
Gem::Specification.new do |spec|
  spec.add_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

# bad
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

# good
Gem::Specification.new do |spec|
  spec.add_dependency 'parser'
end

# good
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser'
end

可配置属性

名称 默认值 可配置值

EnforcedStyle

required

required, forbidden

Include

**/*.gemspec

数组

AllowedGems

[]

数组

Gemspec/DeprecatedAttributeAssignment

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

待定

始终

1.30

1.40

检查 gemspec 文件中是否设置了已弃用的属性。删除已弃用的属性可以让用户获得更小的打包 gem。

示例

# bad
Gem::Specification.new do |spec|
  spec.name = 'your_cool_gem_name'
  spec.test_files = Dir.glob('test/**/*')
end

# bad
Gem::Specification.new do |spec|
  spec.name = 'your_cool_gem_name'
  spec.test_files += Dir.glob('test/**/*')
end

# good
Gem::Specification.new do |spec|
  spec.name = 'your_cool_gem_name'
end

可配置属性

名称 默认值 可配置值

严重性

警告

字符串

Include

**/*.gemspec

数组

Gemspec/DevelopmentDependencies

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

待定

1.44

-

强制 gem 的开发依赖项在 Gemfile 中指定,而不是在 gemspec 中使用 add_development_dependency 指定。或者,使用 EnforcedStyle: gemspec 强制所有依赖项在 gemspec 中指定,而不是在 Gemfile 中指定。

示例

EnforcedStyle: Gemfile(默认)

# Specify runtime dependencies in your gemspec,
# but all other dependencies in your Gemfile.

# bad
# example.gemspec
s.add_development_dependency "foo"

# good
# Gemfile
gem "foo"

# good
# gems.rb
gem "foo"

# good (with AllowedGems: ["bar"])
# example.gemspec
s.add_development_dependency "bar"

EnforcedStyle: gems.rb

# Specify runtime dependencies in your gemspec,
# but all other dependencies in your Gemfile.
#
# Identical to `EnforcedStyle: Gemfile`, but with a different error message.
# Rely on Bundler/GemFilename to enforce the use of `Gemfile` vs `gems.rb`.

# bad
# example.gemspec
s.add_development_dependency "foo"

# good
# Gemfile
gem "foo"

# good
# gems.rb
gem "foo"

# good (with AllowedGems: ["bar"])
# example.gemspec
s.add_development_dependency "bar"

强制风格:gemspec

# Specify all dependencies in your gemspec.

# bad
# Gemfile
gem "foo"

# good
# example.gemspec
s.add_development_dependency "foo"

# good (with AllowedGems: ["bar"])
# Gemfile
gem "bar"

可配置属性

名称 默认值 可配置值

EnforcedStyle

Gemfile

Gemfilegems.rbgemspec

AllowedGems

[]

数组

Include

**/*.gemspec**/Gemfile**/gems.rb

数组

Gemspec/重复赋值

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

已启用

0.52

1.40

在 gemspec 中,属性赋值方法应该只列出一次。

使用 spec.foo = 对相同名称的属性进行赋值将是意外的使用方式。另一方面,重复使用 spec.requirementsspec.add_runtime_dependency 等方法是允许的,因为这是追加值的预期用途。

示例

# bad
Gem::Specification.new do |spec|
  spec.name = 'rubocop'
  spec.name = 'rubocop2'
end

# good
Gem::Specification.new do |spec|
  spec.name = 'rubocop'
end

# good
Gem::Specification.new do |spec|
  spec.requirements << 'libmagick, v6.0'
  spec.requirements << 'A good graphics card'
end

# good
Gem::Specification.new do |spec|
  spec.add_runtime_dependency('parallel', '~> 1.10')
  spec.add_runtime_dependency('parser', '>= 2.3.3.1', '< 3.0')
end

可配置属性

名称 默认值 可配置值

严重性

警告

字符串

Include

**/*.gemspec

数组

Gemspec/排序依赖项

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

已启用

始终

0.51

-

gemspec 中的依赖项应按字母顺序排序。

示例

# bad
spec.add_dependency 'rubocop'
spec.add_dependency 'rspec'

# good
spec.add_dependency 'rspec'
spec.add_dependency 'rubocop'

# good
spec.add_dependency 'rubocop'

spec.add_dependency 'rspec'

# bad
spec.add_development_dependency 'rubocop'
spec.add_development_dependency 'rspec'

# good
spec.add_development_dependency 'rspec'
spec.add_development_dependency 'rubocop'

# good
spec.add_development_dependency 'rubocop'

spec.add_development_dependency 'rspec'

# bad
spec.add_runtime_dependency 'rubocop'
spec.add_runtime_dependency 'rspec'

# good
spec.add_runtime_dependency 'rspec'
spec.add_runtime_dependency 'rubocop'

# good
spec.add_runtime_dependency 'rubocop'

spec.add_runtime_dependency 'rspec'

TreatCommentsAsGroupSeparators:true(默认)

# good
# For code quality
spec.add_dependency 'rubocop'
# For tests
spec.add_dependency 'rspec'

TreatCommentsAsGroupSeparators:false

# bad
# For code quality
spec.add_dependency 'rubocop'
# For tests
spec.add_dependency 'rspec'

可配置属性

名称 默认值 可配置值

TreatCommentsAsGroupSeparators

true

布尔值

ConsiderPunctuation

false

布尔值

Include

**/*.gemspec

数组

Gemspec/RequireMFA

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

待定

始终

1.23

1.40

要求 gemspec 设置 rubygems_mfa_required 元数据。

此设置告诉 RubyGems,帐户需要 MFA(多因素身份验证)才能执行特权操作,例如(有关特权操作的完整列表,请参阅 RubyGems 的文档)

  • gem push

  • gem yank

  • gem owner --add/remove

  • 使用 gem 所有权页面添加或删除所有者

这有助于提高 gem 的安全性,因为用户可以更加确信 gem 更新是由维护者推送的。

示例

# bad
Gem::Specification.new do |spec|
  # no `rubygems_mfa_required` metadata specified
end

# good
Gem::Specification.new do |spec|
  spec.metadata = {
    'rubygems_mfa_required' => 'true'
  }
end

# good
Gem::Specification.new do |spec|
  spec.metadata['rubygems_mfa_required'] = 'true'
end

# bad
Gem::Specification.new do |spec|
  spec.metadata = {
    'rubygems_mfa_required' => 'false'
  }
end

# good
Gem::Specification.new do |spec|
  spec.metadata = {
    'rubygems_mfa_required' => 'true'
  }
end

# bad
Gem::Specification.new do |spec|
  spec.metadata['rubygems_mfa_required'] = 'false'
end

# good
Gem::Specification.new do |spec|
  spec.metadata['rubygems_mfa_required'] = 'true'
end

可配置属性

名称 默认值 可配置值

严重性

警告

字符串

Include

**/*.gemspec

数组

Gemspec/RequiredRubyVersion

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

已启用

0.52

1.40

检查 gemspec 文件中的 required_ruby_version 是否设置为有效值(非空白)并与 RuboCop 配置中为 gem 设置的 TargetRubyVersion 相匹配。

这确保 RuboCop 使用与 gem 相同的 Ruby 版本。

示例

# When `TargetRubyVersion` of .rubocop.yml is `2.5`.

# bad
Gem::Specification.new do |spec|
  # no `required_ruby_version` specified
end

# bad
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.4.0'
end

# bad
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.6.0'
end

# bad
Gem::Specification.new do |spec|
  spec.required_ruby_version = ''
end

# good
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.5.0'
end

# good
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.5'
end

# accepted but not recommended
Gem::Specification.new do |spec|
  spec.required_ruby_version = ['>= 2.5.0', '< 2.7.0']
end

# accepted but not recommended, since
# Ruby does not really follow semantic versioning
Gem::Specification.new do |spec|
  spec.required_ruby_version = '~> 2.5'
end

可配置属性

名称 默认值 可配置值

严重性

警告

字符串

Include

**/*.gemspec

数组

Gemspec/RubyVersion全局使用

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

已启用

0.72

1.40

检查 gemspec 中是否使用了 RUBY_VERSION 常量。使用 RUBY_VERSION 很危险,因为该常量的值由 rake release 决定。可能会出现依赖关系基于执行 rake release 时使用的 Ruby 版本,而不是用户的 Ruby 版本。

示例

# bad
Gem::Specification.new do |spec|
  if RUBY_VERSION >= '3.0'
    spec.add_runtime_dependency 'gem_a'
  else
    spec.add_runtime_dependency 'gem_b'
  end
end

# good
Gem::Specification.new do |spec|
  spec.add_runtime_dependency 'gem_a'
end

可配置属性

名称 默认值 可配置值

严重性

警告

字符串

Include

**/*.gemspec

数组