我想知道宝石应该去哪里。我写了一个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中什么都没有?他只是做了与我读到的完全相反的事情。
有人可以告诉我这个吗?
谢谢!
答案 0 :(得分:2)
一个重要的细节是 Gemfile 和 mygem.gemspec 是Ruby文件。这意味着您具有很大的灵活性,并且只要bundle
和gem
获取所需的数据,就可以以多种不同的方式使用。但是,值得遵循最近文档中的标准示例,代码通常更简洁,更容易理解。
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年的历史。在第一次编写时,bundler
和gem
的工具包与现在完全不同。
这不是直接询问,但值得注意的是完整性:
依赖项列表适用于Bundler(在 Gemfile 中)和gem building / installation(在 .gemspec 中)。它们不会自动在代码中包含依赖项gem。所以你还需要像以前一样在你的ruby源中添加require
语句。