是否应该在打包的 gem 中包含测试?

Should one include tests in a packaged gem?

我一直在查看文档和著名的示例 gem 来寻找一个简单问题的答案:

一个人是否应该在自己的 PACKAGED gem 中包含测试,如果是,为什么?

换句话说,你是否将测试文件添加到 files gemspec 属性,你是否通过 add_development_dependencies 包含测试依赖项?如果是这样,为什么?

测试 gem 并将测试包含在 gem 的源存储库中对我来说非常有意义。将测试与打包在 gem 中的已部署源代码一起包括在内对我来说意义不大。是否有一种标准方法可以让人们使用来自 rubygem 的 gem 的测试?

话虽这么说,好像很多大项目都包含测试,所以我一定漏掉了什么,对吧?

无需在 gem 文件中包含测试。但是,如果测试文件很小(它们可能很小),那没什么大不了的。

长期以来,在使用命令bundle gem mygemname新建gem时,生成的gemspec中包含了以下几行:

Gem::Specification.new do |s|
  # ...
  s.files = `git ls-files -z`.split("\x0")
  s.test_files = s.files.grep(/^(test|spec|features)\//)
  # ...
end

由于您的测试已经包含在 test_files 中,因此它们也包含在 files 中实际上并不重要。

但是,如果您今天 运行 使用相同的命令 bundle gem mygemname,那么您将在生成的 gemspec 文件中看到这一行:

Gem::Specification.new do |s|
  # ...
  s.files  = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  # No mention of s.test_files !
  # ...
end

有什么变化?

好吧,s.test_files 现在 几乎 已弃用。有一个 open issue in RubyGems to not install test_files, which has been deferred to a post-2.x RubyGems release due to 'backward compatibility'. It also used to be possible to run tests for a Gem whilst installing it, with gem install -t gemname; this feature has now been removed(参见错误 #25707)。

我相信,这就是为什么您仍然看到许多 gem 源代码中包含测试文件的原因。但是包括他们在内已经没有任何意义了。