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
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
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/重复赋值
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.52 |
1.40 |
在 gemspec 中,属性赋值方法应该只列出一次。
使用 spec.foo =
对相同名称的属性进行赋值将是意外的使用方式。另一方面,重复使用 spec.requirements
、spec.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
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'
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
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
Gemspec/RubyVersion全局使用
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.72 |
1.40 |
检查 gemspec 中是否使用了 RUBY_VERSION
常量。使用 RUBY_VERSION
很危险,因为该常量的值由 rake release
决定。可能会出现依赖关系基于执行 rake release
时使用的 Ruby 版本,而不是用户的 Ruby 版本。