2010-09-04 41 views
44

我正在將我們的Rails 2.3.8應用之一升級到Rails 3,並且已經遇到了捆綁器和部署的令人討厭的問題。我在Windows機器上開發應用程序,但生產環境正在運行Ubuntu Linux。現在,我的問題是bundler在生產環境中忽略了mysql寶石,而乘客吐出了:「!!!缺少mysql gem。將它添加到您的Gemfile:gem'mysql','2.8.1'」使捆綁銷售商爲不同的平臺使用不同的寶石

這裏是我的Gemfile

# Edit this Gemfile to bundle your application's dependencies. 
# This preamble is the current preamble for Rails 3 apps; edit as needed. 
source 'http://rubygems.org' 

gem 'rails', '3.0.0' 
gem 'net-ldap', :require => 'net/ldap' 
gem 'highline', :require => 'highline/import' 
gem 'mysql', '2.8.1' 
gem 'net-ssh', :require => 'net/ssh' 

# Bundle gems for the local environment. Make sure to 
# put test-only gems in this group so their generators 
# and rake tasks are available in development mode: 
group :development, :test do 
    gem 'fakeweb', :require => 'fakeweb' 
    gem 'flexmock', :require => 'flexmock/test_unit' 
end 

正如你所看到的,指定了mysql寶石。但是,在部署時,捆綁器會忽略它。爲什麼?其原因是,捆紮機生成以下Gemfile.lock(僅相關部分包括):

.... 
mime-types (1.16) 
mysql (2.8.1-x86-mingw32) 
net-ldap (0.1.1) 
.... 

注意,它包括特定於平臺的寶石。這顯然不是我想要它做的事情,因爲在Linux下運行時,gem不適合(並且顯然被忽略)。

那麼,Bundler有任何方式來處理這些問題嗎?或者我必須記得手動更改生成的Gemfile.lock中的mysql gem版本,每次我在開發機器上運行軟件包安裝時?

預先感謝您!

更新

這似乎是捆綁隊已經意識到了這個issue的。

+0

我有一個類似的問題,我需要在Windows上使用rmagick 2.12.0,但在任何其他Ruby平臺上的當前版本。 Bundler錯誤,如果我嘗試丟失兩次rmagick。 – 2010-11-01 13:05:40

+2

請嘗試手動將MySQL(2.8.1)添加到Gemfile.lock。在我們的Gemfile.lock中,我們有'sqlite3-ruby(1.3.1)'_and_'sqlite3-ruby(1.3.1-x86-mingw32)' – oma 2010-11-05 15:58:47

+0

Morten,這實際上就是我今天所做的。不幸的是,捆綁軟件運行時,Bundler會刪除「原始」mysql行(並且只保留Windows版本)。 – 2010-11-06 07:08:09

回答

37

這是一個known issue in Bundler。解決方法是:

  • 在與您的生產環境相似的系統上生成Gemfile.lock,以獲得與生產平臺匹配的結果。實際上,這意味着如果生產系統是Windows,則只能在Windows上生成Gemfile.lock文件。
  • 根本不提交Gemfile.lock文件,並在部署時確定生產計算機上的依賴關係(不包括--deploy)。雖然通常不推薦,但這是一個經常使用的解決方法,直到bug修復。例如,這是Heroku提供的推薦解決方案。
  • 切換到JRuby,它將在Windows和Linux上具有相同的平臺字符串(java)。我不推薦這麼認真,但我相信它能解決這個問題。
  • 修復Bundler源代碼中的問題,即幫助Bundler團隊修復該錯誤。 :)
+1

這是最好的答案,提供了幾種解決方法。所以我接受它。對我而言,我在提交之前手動將Gemfile.lock更改爲我想要的內容。儘管如此,您必須避免錯誤地檢查Gemfile.lock。 – 2010-11-08 13:07:02

+0

也給'rvm'一個嘗試,這是值得的。 – 2010-11-09 12:40:48

+0

我沒有看到它,所以我會寫我的解決方案,我遇到了類似的問題,我與ruby-oci8(也是一個痛苦的脖子):我在本地安裝gem(下載mswin32寶石版本,因爲我' m在我的64位Windows 7上使用cygwin),然後我在平臺下的Gemfile中聲明它的版本:mswin,mingw block。它是捆綁和運行的。 – ChuckE 2013-07-18 08:02:48

1

不要犯Gemfile.lock和你的寶石生產。您必須在生產中再次運行bundler install

+6

那麼,我們建議把''Gemgile.lock''放到版本控制中。當使用--deploy標誌時,bundler需要這個文件。 – 2010-09-06 13:40:46

+0

提交'Gemfile.lock'會將你鎖定到'Gemfile.lock'中列出的寶石。 'Gemfile'本身就足以定義你的應用所需的寶石。 – 2010-09-07 00:14:15

+9

沒有Gemfile.lock的Gemfile只有足夠好,直到你在依賴的寶石樹下發生衝突。如果你使用的不僅僅是幾個寶石,那麼遲早你可能會有衝突。另外,如果你沒有檢查你的Gemfile.lock,你不能確定你在每臺機器上都使用了完全相同的gem(除非你只在Gemfile中聲明瞭嚴格的依賴關係,這使得它很難維護)。基本上,通過不檢查Gemfile.lock,你拋棄了使用捆綁器的兩個主要原因,而不是像批處理文件那樣安裝一堆寶石。 – 2010-10-01 19:47:30

1

你可以做這樣的事情:

platforms :ruby do 
    gem "sqlite3-ruby", :require => "sqlite3", :group => [:development, :test] 
end 

platforms :jruby do 
    gem 'activerecord-jdbc-adapter', :require => false 
    gem "jdbc-sqlite3", :require => false 
end 

順便說一句,你應該把你Gemfile.lock的到版本控制,因爲這樣一來所有的機器將運行具有相同的寶石版本的應用程序。

+2

我不能。平臺指令將無濟於事,因爲我必須指定相同的gems(mysql和nokogiri)用於這兩個plaftorms。在Gemfile.lock中,這些寶石將在DEPENDENCIES下列出,並且不會被捆綁器需要或安裝。 – 2010-11-05 12:17:52

+0

請參閱[Gemfile聯機幫助頁](http://gembundler.com/man/gemfile.5.html#PLATFORMS-platforms-)。你可以像這樣聲明特定於平臺的gem:'gem'jdbc-sqlite3',:platforms =>:jruby' – nil 2011-03-31 01:42:11

2

我認爲問題是,MySQL的寶石沒有正確發現所需的標題。您可以通過轉向使用mysql2 gem來解決此問題,您只需更新database.yml中用於ActiveRecord集成的數據庫適配器。

bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config

此外,您可以在絕對必要建立標誌到C擴展寶石。

+1

謝謝你的提示,但是這又不是問題本身的解決方案。看到我對brady8的回答的評論。 – 2010-11-05 12:13:08

+1

自從近5個小時以來,我一直在使用谷歌搜索這個解決方案! – 2011-01-25 19:58:57

2

我以前遇到過這個問題,並且使用mysql2寶石確實可以解決問題。我知道這不是你要找的答案,但是把它和Diego的答案結合起來,你就是金。

+0

正如您在答案中已經提到的,更改爲mysql2不會解決問題,而是一個症狀。還有其他的寶石,如nokogiri,暴露相同的問題。 – 2010-11-05 12:11:04

2

您是否嘗試過使用rvmlink here)?它可以安裝獨立的Ruby虛擬機和Gemset,因此您可以使用更類似於生產環境的環境。我真的不知道它是否能解決你的問題,但它值得一試。

無論如何,我知道這不是你想聽到的答案,但恕我直言,Windows不是在Rails中開發時最好的平臺。我最近買了一臺MacBook來開發Rails應用程序,它可以幫你避免許多麻煩。您也可以在您的開發機器上安裝Linux並使用它,這比使用Windows端口或Cygwin更好。

7

我有一個類似的問題。我想能夠在我的Gemfile中寫下如下內容:

platforms :ruby do      # linux 
    gem 'nokogiri', "1.5.0.beta.2" 
end 

platforms :mswin do 
    gem 'nokogiri', "1.4.4.1" 
end 

但是,bundler告訴我我不允許。所以,我的解決辦法,在這種特殊情況下的工作原理是指出某個範圍的版本:

gem 'nokogiri', ">= 1.4.4.1", "<=1.5.0.beta.2" 

哪些 - 此刻 - 給1.4.4.1版本我的Windows電腦和1.5.0.beta上。 2在我的linux電腦上。也許你可能會寫一個類似醜陋的解決方法;-)

+0

感謝您的提示!我已經將我的開發環境遷移到Linux,所以我不再受到這個問題的困擾。但是,這仍然是Windows上的開發者的一個問題,所以您的建議是值得歡迎的。 – 2010-12-08 06:55:43

5

我們在Engine Yard的工程師已經向Bundler提交了一個補丁來解決這個問題,並且在不同平臺上解凍寶石。在運行RailsInstaller演示教程之後,我們遇到了許多Windows試圖部署的相同問題。我們已經找到了最好的解決方法是執行以下操作:

  1. bundle install像正常的開發機器
  2. 去上通過Gemfile.lock,如果有任何線,-x86-mingw32,刪除該部分。
    • bcrypt-ruby (3.0.1-x86-mingw32)成爲bcrypt-ruby (3.0.1)
  3. 添加ruby下的「平臺」一節中的Gemfile.lock
  4. 確保與平臺標誌明確指定Gemfile所需的寶石。 (不知道這是否需要,但它並沒有傷害)
    • Gemfile:`gem'bcrypt-ruby','〜> 3。0' ,:平臺=> '紅寶石'
  5. bundle install再次將保持bcrypt-ruby (3.0.1)線和bcrypt-ruby (3.0.1-x86-mingw32)再次添加。

如果你好奇,所述捆綁補丁,你可以在https://github.com/carlhuda/bundler/pull/1451

希望這有助於人仍在尋找答案,獲得通知。

相關問題