2008-12-15 48 views
3

假設你有一個軟件包。你想讓它成爲寶石,因爲寶石是在Ruby世界中分配任何事物的事實上的標準方式。寶石非常棒 - 對於圖書館來說。但對於真正的應用程序,Rubygems系統似乎缺乏。只有「最近」他們引入了一種將可執行​​文件標記爲放置在全系統可執行文件路徑中某處的方法。不幸的是,Ruby的寶石似乎仍然需要軟件包的其他方面,即將配置文件放在/ etc或/ usr/share/doc下的文件中。或者是?我的問題是:如何將一個Ruby gem包複製到任意位置?

我可以把指令或代碼放在gemspec中,以便將配置安裝到/ etc和文檔中某些明智的,標準化的位置(如/ usr/share/doc)?或者,作爲解決方法,可以運行安裝後腳本來執行這些操作嗎?

僅供參考:the GemSpec specification

請注意,rubygems.org在撰寫本文時已關閉。下面是頁面的谷歌的緩存:http://74.125.95.132/search?q=cache:JwJO6slR4BwJ:www.rubygems.org/read/chapter/20+http://www.rubygems.org/read/chapter/20%23page85&hl=en&ct=clnk&cd=1

如果檢查the specification.rb file in the repo,上下接近尾聲滾動(搜索「:部分:必需gemspec屬性」),你可以看到什麼似乎是目前支持的屬性。我看不到任何內容,看起來像我想要的。

+0

當它,SOF上的Markdown解析器被搞砸了......預覽和實際的帖子不同。 :( – Pistos 2008-12-15 03:10:50

回答

1

簡短的回答:沒有

長的答案:你應該不希望/需要做到這一點...寶石設計用作圖書館...還不如在自己的應用程序(調查您的發行版該類型的應用程序包系統)。另外,你不能假定你的寶石只能用於「一次」...理論上幾個項目/應用程序可能包括你的寶石,雖然可能有一些具體的寶石,排除它可能是全球配置的東西...由於其他架構問題,例如開發/配置應用程序以在不同階段環境(dev/test/stage/production)中工作,您仍然不希望這樣做。最好的情況下,你可能會注意到如何在自述文件中創建/ etc/config文件,幷包含一個實用程序應用程序來提示用戶輸入值。

0

你不應該想/需要做到這一點...寶石設計用作圖書館...還不如在自己的應用程序(調查該類型的東西你的發行版的應用系統級封裝)。

你知道的。我知道這一點。但是「他們」不知道這一點。對於很多衛星來說,定期的查詢和評論是:「有沒有寶石?」 「這可以作爲寶石安裝嗎?」 「你爲什麼不做寶石?」 「我沒有安裝它,因爲它不是寶石。」

是否合適,Joe Rubyist希望所有東西都是寶石。只有老的學生熟悉並且似乎容忍「ruby setup.rb」類型的交易。

無論如何,我的應用程序確實是一個獨立的應用程序;我幾乎無法想象包括這個像圖書館這樣的人。也許作爲一個應用程序集合的一部分,但是...作爲一個庫的用法看起來很牽強,但如果這一天永遠到來,我會在碰到它時跨過這個橋樑(幫助那些有衝突的人包容可能會帶來)。

並沒有「dev/test/stage/prod」的區別。這是一個普通的舊應用程序,你可以從命令行運行它。

無論如何,感謝您的評論,至少我的假設是肯定的,因爲Rubygems系統不提供這樣做的方法。

1

2015-11-11 以下是情況:RubyGems支持前後安裝/卸載鉤子作爲gem命令的擴展。換句話說,這些鉤子適用於所有已安裝的寶石,並且不打算在特定的寶石中進行自定義。它們被調用的文件名爲operating_system.rb,通常在/usr/lib64/ruby/2.2.0/rubygems;或任何位置和版本的Ruby安裝。鉤子因此採用:

# /usr/lib/ruby/x.y.z./rubygems/operating_system.rb 
Gem.pre_install do | installer | 
    # do whatever 
end 

Gem.pre_uninstall do | installer | 
    # do whatever 
end 

Gem.post_install do | installer | 
    # do whatever 
end 
. . . 

深入到API文檔,似乎聘請外部活動的具體的寶石有一個可用的插件。例如:http://guides.rubygems.org/plugins/#executablehookshttps://github.com/rvm/executable-hooks。但是,這些都似乎通常影響RubyGem應用程序,而不是專門影響一個gem。而這些插件需要安裝成寶石本身才能起作用。

在我看來,寶石具體的前後安裝掛鉤是一個安全問題。安裝系統級Gem的人有定義root特權並且允許RubyGem在簡單安裝庫之外執行任意操作具有明顯的安全隱患。

我正在與Ruby人討論此事(2015-11-10)。這可能是因爲這些鉤子僅適用於在不同平臺上安裝RubyGem的人員。

RubyGems的現在(2015)支持pre_install()post_install()鉤作爲採取&塊作爲其參數的方法。據推測,你可以做任何你想要的任何一個,只要你不返回false。返回nil是好的,但false返回將中止gem安裝。

相關問題