我应该把宝石放在我的宝石中?

时间:2014-11-06 22:42:29

标签: ruby gem bundler

我想知道宝石应该去哪里。我写了一个ruby脚本,我试图将其转换为gem。我用bundler为我的宝石创建了一个骨架。

现在我有2个文件' Gemfile'和' mygem.gemspec'。

在我的Gemfile中,我有两行说:

source 'https://rubygems.org'

# Specify your gem's dependencies in cudruby.gemspec
gemspec

..在我的mygem.gemspec'我得到了:

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'mygem/version'

Gem::Specification.new do |spec|
  spec.name          = "mygem"
  spec.version       = Mygem::VERSION
  spec.authors       = ["mygem"]
  spec.email         = ["mygem@gmail.com"]
  spec.summary       = %q{mygem}
  spec.description   = %q{mygem}
  spec.homepage      = "http://www.mygem.com"
  spec.license       = "MIT"

  spec.files         = Dir["{lib}/**/*.rb", "bin/*", "LICENSE", "*.md"]
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.6"
  spec.add_development_dependency "rake"
end

现在我的ruby脚本过去依赖3个宝石,' facter'调试器' json'。

我在哪里添加这些?怎么样?

我发现了这个: http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

现在这个人说(来自链接):

"在开发gem时,请在Gemfile中使用gemspec方法以避免重复。通常,gem的Gemfile应包含Rubygems源和单个gemspec行..."

所以我离开了我的gemspec文件..

我检查了facter的官方存储库,它的Gemfile是: https://github.com/puppetlabs/facter/blob/master/Gemfile

..和他的gemspec是: https://github.com/puppetlabs/facter/blob/master/.gemspec

现在他为什么在Gemfile中拥有他的宝石,gemspec中什么都没有?他只是做了与我读到的完全相反的事情。

有人可以告诉我这个吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

一个重要的细节是 Gemfile mygem.gemspec 是Ruby文件。这意味着您具有很大的灵活性,并且只要bundlegem获取所需的数据,就可以以多种不同的方式使用。但是,值得遵循最近文档中的标准示例,代码通常更简洁,更容易理解。

Gemfile 中的方法gemspec是告诉Bundler“此项目使用gemspec中定义的gems列表”的便捷方式 - 即它避免了您需要两次列出依赖项 - 启用bundle install并允许gem自动安装其依赖项。

在哪里添加依赖项?在gemspec的最后,如下所示:

  spec.add_development_dependency "rake"

  # Example of one of your dependencies
  spec.add_dependency "facter", ">= 2.3.0"
end

理想情况下,您应该使用您的宝石推荐您确定无错误的最低版本。

你不应该使用 facter gem作为模板或示例,那里有一些非标准的东西。首先,您链接的.gemspec是不是 facter用于构建gem的gemspec。至少部分来自这个宝石的悠久历史,这个宝石已有近10年的历史。在第一次编写时,bundlergem的工具包与现在完全不同。


这不是直接询问,但值得注意的是完整性:

依赖项列表适用于Bundler(在 Gemfile 中)和gem building / installation(在 .gemspec 中)。它们不会自动在代码中包含依赖项gem。所以你还需要像以前一样在你的ruby源中添加require语句。