2012-02-27 55 views
2

我一直在研究一些我想分享的工具(不是庫)。使用rubygems打包它們的正確方法是什麼?有沒有最佳做法?如何正確打包使用rubygems的應用程序?

具體來說,我想知道如何處理用戶具有多個版本的依賴關係的可能性。 Bundler在開發環境中做得非常出色;對於最終用戶應用程序是否有任何等價物?任何方式使用gemspec自動需要所有指定的寶石的正確版本?

我知道幾個包的一切可執行的解決方案,但我想避免它們。我認爲用戶應該能夠發出gem install my_utility並獲得具有正確依賴關係的最新版本,並且仍然有一個健全的環境。

回答

2

看起來像你最大的問題是如何在使用gemspec文件時獲得正確版本的gem依賴關係,對吧?

嗯,這裏是典型的gemspec文件的例子:

Gem::Specification.new do |spec| 
    spec.name   = "hello_world" 
    spec.version  = "0.1.0" 
    spec.author  = "Bilbo Baggins" 
    # Here's a gem dependency 
    spec.add_dependency "json", ">= 0.4.0" 
end 

如果你想使用 json的1.5.4版,嘗試這樣的事情:

Gem::Specification.new do |spec| 
    # ... 
    spec.add_dependency "json", "= 0.4.0" 
end 

這隻會確保指定的版本已經安裝,但實際上確保您在您的實用程序中加載加載,您可以這樣做:

gem "json", "= 0.4.0" 
require "json" 
+0

在我的代碼中,我使用標準的'require'來加載庫。只有'gemspec'足以確保指定的版本是必需的,即使用戶有多個,可能更新的版本的寶石?作爲一名開發人員,我使用RVM gemsets處理這個問題,但我不想強加給其他人。 – 2012-02-27 23:15:46

+0

是的,這正是我的意思,但它似乎並不是真的......但是好消息:仍然有一種方法可以輕鬆地做到這一點!我現在就更新答案。 – Jwosty 2012-02-27 23:20:41

+0

+1,謝謝。我當時覺得'gem'方法可以取代'require',所以我避免了它,因爲它會導致與rubygems緊密耦合。我正在努力找出一個隔離這些電話的好地方。只是爲了澄清,它不會正確地加載我的庫,只確保正確的版本在需要時加載,對嗎? – 2012-02-27 23:37:55

1

您可以使用bundler開發寶石。

+0

是的,但我不希望有人'捆綁exec'我的應用程序。我需要一種方法來在加載期間鎖定寶石版本。 – 2012-02-27 23:05:00

+1

寶石用戶不需要使用捆綁軟件。用於gemspec和依賴關係otomation和gem版本控制的bundler ruby​​gems接口。 – 2012-02-27 23:09:28

相關問題