2012-08-31 39 views
6

我想運行一個應用程序取消Github。如何從Gemfile.lock文件安裝寶石?

我已經運行bundle install安裝Gemfile所需的寶石。但是,當運行應用程序時,錯誤消息告訴我安裝的gem是錯誤的版本。

在檢查Gemfile.lock時,我注意到版本比安裝的gems舊。 (即,我安裝了更新版本的寶石,並且應用程序需要更老的寶石。)

是否有一種快速方法來安裝Gemfile.lock文件中描述的所有版本?另外還有一種方法可以忽略該文件?

的Gemfile:

source 'http://rubygems.org' 
    gem 'rails', "3.0.9" 
    gem "sass" 
    .. 

Gemfile.lock的:

sass (3.1.1) 
.. 

在上述例子中,即使SASS安裝了該應用專門需要版本3.1.1。

+0

Bundler應該總是將版本安裝在'Gemfile.lock'文件中,這是它的目的。你有沒有安裝在你的系統上的那些gem版本? – janders223

+0

我安裝了比應用程序指定的更新的寶石。當我運行軟件包安裝時,會安裝最新的可用gem版本。 – dmuk

+3

只需刪除鎖定文件並再次進行捆綁。 – emrahbasman

回答

6

確保您正在運行的bundle execute rails server

+1

+1,你需要從bundler運行服務器,以便它使用正確的寶石。 –

9

web服務器採用一個有效的Gemfile.lock文件,單獨bundle install應該是足夠了,除非一些特殊的寶石版本已猛拉。在這種情況下,您需要尋找目前仍然可用的替代寶石版本(通常bundle update name_of_yanked_gem就足夠了)。

關於sass 3.1.1,就沒有這麼多的應用程序需要特定版本,而是,這是有可能的最新版本時Gemfile.lock最後生成/更新定爲Gemfile指定的總體版本的約束。如您所列,沒有爲sass本身指定版本範圍,但其他寶石可能會施加進一步的限制,如果它們具有sass作爲依賴關係。

忽略Gemfile.lock不是一個好主意,因爲在正常情況下,它將指定上次被認爲可以與應用程序一起使用的gem版本。

+0

你確定軟件包安裝是否足夠?例如,如果安裝了同一個gem的多個版本會怎麼樣?(通常情況下)?我認爲這就是'bundler執行'的目的。 – Dty

+0

無論如何,如果生成了'Gemfile.lock',那麼在解析總體約束後,它將只包含每個指定gem的一個版本。 'bundle install'用於安裝,'bundle exec'用於執行。 – prusswan

+0

好的,我想你回答了提問者原來的問題:「我該如何安裝寶石」。我正在回答我認爲他真正的問題是什麼。 – Dty

2

試試這個..

bundle install --deployment 

通過上面部署選項,捆綁然後從Gemfile.lock的讀取。

更重要的是,寶石被安裝到目錄供應商/束,同捆目錄是自動創建

此外,新目錄.bundle限定在軌道根目錄下直接創建,並有一個名爲的配置文件,其內容如下:...

BUNDLE_FROZEN: '1' 
BUNDLE_PATH: vendor/bundle 
BUNDLE_DISABLE_SHARED_GEMS: '1' 

希望以上對你的作品。