2012-10-06 66 views
1

我需要從一個Rails應用程序中獲得寶石的當前工作目錄。如何從Ruby中使用bundler或Rails獲取gem的位置?

我目前使用

`bundle show foo`.strip 

這在我的環境中工作的偉大,但:

  • 是緩慢的,因爲它需要加載一個殼
  • ,當有人試圖運行它可能會打破應用程序在Windows或在JRuby或者在不同的紅寶石比用於啓動應用程序
一的$ PATH點

所以我想要一個方法來做到這一點,而不需要調用子shell。

的捆紮機的RDOC一直沒有幫助。您曾經能夠從Rails 2中獲取這類信息,但看起來Rails 3讓Bundler能夠處理它。

回答

3

如果寶石在你的Gemfile/Gemfile.lock的,它的路徑出現在$LOAD_PATH全局變量。你可以利用這個事實:

$:.grep(/activerecord/).first 

$:是一樣的$LOAD_PATH。你也可以使用。

另一種方法:

Bundler.load.specs.find{|s| s.name == 'activerecord' }.try(:full_gem_path) 
+0

這不是很漂亮,但基本的思路應該工作。一個問題是許多寶石在他們的名字中有「主動記錄」,所以我需要一個完全匹配。在我的情況下,活動記錄顯示爲.../gems/activerecord-3.2.8/lib。我可以指望以/開頭的名字並以 - 結尾嗎?反斜槓可能嗎?寶石是否有可能未版本控制?我現在使用'/ [\/\\] activerecord [\/\\ - - ] /'。你能想到任何其他可能的邊框字符嗎? –

+0

@BryanLarsen我已經更新了我的答案。請參閱**另一種方法**。基於寶石的名字。 – jdoe

+0

「另一種方法」應該是一個鏈接嗎? –

相關問題