2014-11-06 80 views
3

我想了解寶石應該去哪裏。我寫了一個ruby腳本,我正試圖將其轉換爲寶石。我用bundler爲我的寶石創建了一個框架。我應該把我的寶石放在我的寶石中?

現在我得到了2個文件'Gemfile'和'mygem.gemspec'。

在我的Gemfile我得到了2行說:

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   = ["[email protected]"] 
    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/

現在的人說(從鏈接):

「當開發一個寶石,使用gemspec方法在你的Gemfile,以避免重複一般情況下,創業板公司的Gemfile應該包含RubyGems的源和單gemspec行......」

所以我離開了我的gemspec文件,因爲它是..

I C hecked facter的官方信息庫及其Gemfile文件是: https://github.com/puppetlabs/facter/blob/master/Gemfile

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

現在他爲什麼在Gemfile中他的寶石,並沒有在gemspec?他正在做的和我讀的完全相反。

請問有人能告訴我這個清楚嗎?

謝謝!

回答

2

一個重要的細節是Gemfilemygem.gemspec是Ruby文件。這意味着您有很大的靈活性,並且可以通過許多不同的方式使其工作,只要bundlegem可以獲取他們所需的數據。但是,值得遵循最近文檔中的標準示例,代碼通常更清晰,更易於遵循。

的Gemfile方法gemspec告訴捆紮機「這個項目將使用在gemspec定義寶石的名單」的一種方便的方法 - 即它避免了你需要列出依賴兩次 - 以使bundle install並允許該gem自動安裝它的依賴關係。

何處添加依賴關係?在gemspec結束,像這樣:

spec.add_development_dependency "rake" 

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

理想情況下,你應該是指,你一定會工作無缺陷與寶石的最低版本。

您不應該使用因素寶石作爲模板或示例,那裏有一些非標準的事情。一開始你鏈接的.gemspec是而不是 facter的gemspec用於構建寶石。至少在一定程度上來自這個已有近10年曆史的寶石的悠久歷史。在第一次寫作時,bundlergem工具包就像現在一樣。


這是不直接問,但值得一提的完整性:

的依賴性列表是捆紮機(在的Gemfile)和寶石建築/安裝(在.gemspec)。它們不會自動在代碼中包含依賴項。因此,您仍然需要像以前一樣將require語句添加到您的ruby源代碼中。

+0

好的非常感謝。但我仍然有點困惑。那麼讓我們說有人安裝我的寶石,通過做'寶石安裝mygem',這也將安裝任何寶石gemspec權利?如果用戶已經使用過,但版本不同? 並且在這種情況下又是Gem中使用的Gemfile?什麼時候有人會使用'bundle install'來安裝一個gem?你用捆綁安裝來從gemfile中安裝寶石通常不是? – 2014-11-07 07:44:56

+1

'bundle install'用於維護一個項目的一致環境,並且會盡量同時滿足所有的版本要求。這就是爲什麼簡單的開放式依賴是最好的。 Gemfile由Bundler使用,因此一個gem開發者可以擁有一組一致的依賴來開發。這包括處理安裝在系統上的多個版本,並選擇用於項目的版本。當gem *被安裝*時,安裝過程不直接使用'Gemfile',它使用由'.gemspec'構建的數據。 – 2014-11-07 08:09:23