2011-06-06 35 views
0

我有一個應用程序在nginx後面的精簡版1.2.11上運行。我試圖在開發機器上使用bundle update將我的應用程序更新到最新版本的寶石上,委託git,然後運行cap deploy。然而,薄是給我下面的錯誤:Rails 3打包程序更新

/usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.14/lib/bundler/runtime.rb:31:in `block in setup': You have already activated rack 1.3.0, but your Gemfile requires rack 1.2.3. Consider using bundle exec. (Gem::LoadError) 

在我有以下的寶石安裝系統級服務器:

bundler (1.0.14) 
daemons (1.1.3) 
eventmachine (0.12.10) 
rack (1.3.0) 
rake (0.9.2) 
thin (1.2.11) 

我的Gemfile我aplication:

source 'http://rubygems.org' 

gem 'rails', '3.0.7' 
gem 'sqlite3' 
gem 'capistrano' 
gem 'thin' 
gem 'RedCloth' 
gem 'will_paginate', '3.0.pre2' 
gem 'jquery-rails' 

我相信瘦身需要機架1.3,而我的Gemfile中的某些東西需要機架1.2.3。我是否以錯誤的方式管理我的寶石?管理部署和正確的寶石控制的正確方法是什麼?

我發現使用bundle exec thin start的作品,但我更喜歡一個解決方案,讓我使用/etc/init.d/thin start

回答

3

請在您告訴我們您喜歡的內容之前閱讀此文檔:http://yehudakatz.com/2011/05/30/gem-versioning-and-bundler-doing-it-right/

問題是你更喜歡從安裝到系統中的gem運行命令來運行具有它在Gemfile中指定的自己的依賴關係(即機架)的應用程序。你不能同時加載同一個庫的兩個版本,所以它會導致你的問題,因爲每個命令都需要'bundle exec'。

+0

什麼是一個偉大的簡單答案乾杯! – 2011-07-03 10:05:03

+0

這是一個有趣的閱讀,但我不明白它是如何非常有用的。任何理智的瘦部署都需要使用/etc/init.d/thin start。除非有辦法做到這一點,否則我們不應該使用Thin或Bundler。另外,使一個特定的應用程序服務器成爲一個應用程序的依賴關係對我來說似乎很糟糕。我錯了嗎? – bioneuralnet 2011-11-27 05:28:39

+0

@bioneuralnet這就是你爲什麼我的回答沒有幫助嗎?問題是你不能從同一個解釋器同時啓動2個Rails應用程序 - 可能是因爲有一些單身人士正在使用,你需要加載一些特定版本的庫等,而Ruby無法應付它(嘗試它在C#上的Java)中,捆綁器只解決了依賴版本管理的問題。這就是爲什麼你需要啓動(以某種方式)爲每個應用程序分開服務器。但是你選擇哪個服務器是你的問題,也許還有其他服務器可以產生單獨的Ruby進程來啓動你的應用程序? – MBO 2011-11-28 15:03:32

-1

只要在你的cap腳本開始時做bundle exec,他會從bundler中拾取寶石。

通常我有同樣的問題,如果我有在系統/目前使用的寶石更新版本的一些寶石。

我甚至有別名叫bebundle exec。 rvm的新版本也會自動捆綁exec exec :)。