只有當用戶使用特定版本的紅寶石時,纔有可能添加寶石依賴項?如何將條件rubygem需求添加到寶石規格中?
背景:我正在使用Test :: Unit :: Autorunner之類的fork of a project。它們是Ruby 1.8標準庫的一部分,但不是1.9.1中標準庫的一部分,而是在「測試單元」gem中。我想添加一個依賴關係,如果有人使用ruby 1.9.1或更高版本,請安裝「test-unit」gem,但如果他們使用1.8或更低版本,則不需要安裝任何東西。
只有當用戶使用特定版本的紅寶石時,纔有可能添加寶石依賴項?如何將條件rubygem需求添加到寶石規格中?
背景:我正在使用Test :: Unit :: Autorunner之類的fork of a project。它們是Ruby 1.8標準庫的一部分,但不是1.9.1中標準庫的一部分,而是在「測試單元」gem中。我想添加一個依賴關係,如果有人使用ruby 1.9.1或更高版本,請安裝「test-unit」gem,但如果他們使用1.8或更低版本,則不需要安裝任何東西。
乾草...我是那種紅寶石新手......如果這是做到這一點的最好辦法。
任何方式...我希望我能做到這一點只用紅寶石....但是u可以使用操作系統的shell來做到這一點,在你的程序的安裝程序使用此,只是執行(適用於基於Linux的操作系統系統):
$ruby --version
(U能夠執行從紅寶石安裝程序文件,就像:ruby --version
) ,並把可能根據輸出,如果是1.9.1添加一個額外的行執行:
$ sudo gem install gem_name
其他,只是讓它成爲。
如果你看一下gemspec documentation for add_dependency,沒有一個紅寶石版本的選項。也許你可以使用post_install_message屬性來告訴用戶如果他們使用ruby 1.9來安裝gem。
你不行。您需要反正有
spec.required_ruby_version = '~> 1.9.1'
spec.add_dependency 'test-unit', '~> 2.0.5'
Gemspecs建立兩種寶石,一個與
spec.required_ruby_version = '~> 1.8.6'
和一個只是Ruby文件,這樣你就可以在其內部執行任何Ruby代碼,所以:
spec.add_dependency = 'test-unit', '>= 2.0' if RUBY_VERSION =~ '1.9'
編輯:規格只在建設者機器上運行。
Ruby代碼在哪裏執行?在寶石創建者的機器上,還是在安裝者的機器上? – 2009-11-09 22:35:33
忘記它。它只會在創作者的機器上運行。爲了不會對您產生巨大的維護問題,您可以展示安裝後的消息,或使用pre_install或post_intall掛鉤來安裝gem。 我編輯了答案。 – Mereghost 2009-11-10 14:41:56
結賬有點教程這裏: http://wiki.github.com/rdp/ruby_tutorials_core/gem
它顯示瞭如何安裝不同的版本取決於什麼版本的紅寶石installee使用依賴。
(簡短的回答 - 這是不容易,因爲它應該是)
創業板不支持有條件的依賴(除創業板建設者的環境 - 如上面提到的),並且捆綁器不是一個可行的選擇要解決這個問題要麼 - 見https://github.com/carlhuda/bundler/issues/1281
我做了一個項目,這個確切的事情。訣竅是將腳本作爲擴展添加,然後在安裝時在用戶的機器上執行。
以下是代碼片段和鏈接到我們的github上:
首先,在gemspec時,(我們實際上使用的Rakefile生成它,但結果最終是相同的)source
# This file *needs* to be named this, there are other files
# for other extension processors
s.extensions << 'ext/mkrf_conf.rb'
然後相關線路在mkrf_conf.rb source
require 'rubygems/dependency_installer.rb'
inst = Gem::DependencyInstaller.new
inst.install "test-unit" if RUBY_VERSION > "1.9"
-1請不要這樣做。這就搞砸了各種依賴工具。 – 2009-11-08 02:16:48
@Bob阿曼:你碰巧知道該怎麼辦? – 2009-11-09 22:37:20