2012-12-11 42 views
1

這是更好奇的問題,而不是問題。當使用require命令時,系統上有多個版本選擇哪一個版本?故事的背景是:我在項目中實施了bundler gem(不是Rails項目)。我沒有問題,但其他開發商有問題,經過快速調查後,我意識到我沒有使用Ruby Rubygems他們如何決定加載哪些寶石?

require "bundler/setup" 

它基本上加載了捆綁的寶石。快速修復,但它讓我想知道如何通過rubygems紅寶石決定使用哪些寶石。由於Ruby應用程序使用舊版本的其中一個寶石,而不是較新版本,因此破解代碼。這意味着它不使用「最新」的寶石,那麼背後的邏輯是什麼?

UPDATE

爲了進一步說明這個問題,讓說,當你說,require 'foo'如何紅寶石知道裝載哪一個你有寶石foo-1.0.1foo-1.0.2

回答

3

在Ruby中您require a 文件而不是寶石。如果在當前加載路徑中找不到該文件,Rubygems將搜索已安裝的gem中的該文件名稱,如果找到該文件,那麼激活激活(意味着它被添加到laod路徑中)文件是必需的。通常情況下,寶石將在其lib目錄中具有相同名稱的文件。只有一個版本的寶石可以被激活。

獲得激活的寶石是可用的最新版本,它與任何其他激活的寶石兼容。通常這意味着最新的版本將被激活,但如果您已經激活了一些聲明依賴於您嘗試激活的早期版本gem的寶石,情況可能不會如此。

例如,如果您有foo-1.0.1和安裝foo-1.0.2,然後require 'foo'(假設他們有一個叫他們lib迪爾斯foo.rb文件,並沒有其他的寶石一樣)會導致版本1.0.2被激活。但是,如果您還擁有與1.0.1相關的gem bar,則在bar已被激活後調用require 'foo'將導致激活foo的1.0.1。

Futhermore,如果你試圖要求他們在另外的順序,那麼你會得到類似

Gem::LoadError: Unable to activate bar-1, because foo-2 conflicts with foo (= 1) 

在這裏你不能激活bar,這取決於1.0.1版本的foo因爲你已經激活foo版本1.0.2。

+0

ty很棒的概述 –

0

沒有Bundler,你必須指定你想要的每個寶石。例如,

require 'my_gem' 
require 'my_other_gem' 

然而,捆紮機可以使用Gemfile

使這一點更容易爲你如果這是你Gemfile

gem 'my_gem' 
gem 'my_other_gem' 

調用,這將包括所有的寶石

require 'bundler/setup' 
+0

增加了更多解釋。 –