私はRails 2.3.8アプリをRails 3にアップグレードしようとしていますが、バンドルとデプロイで厄介な問題に遭遇しました。 Windowsマシン上のアプリケーションですが、実稼働環境ではUbuntu Linuxが実行されています。今、私の問題は、Bundlerが実稼働環境でmysql
gemを無視し、Passengerが吐き出すことです: "!!! 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
gemが指定されています。ただし、デプロイ時に、Bundlerはそれを無視します。どうして?理由は、Bundlerが次のGemfile.lock
(関連する部分のみが含まれる)を生成するためです。
....
mime-types (1.16)
mysql (2.8.1-x86-mingw32)
net-ldap (0.1.1)
....
プラットフォーム固有のgemが含まれていることに注意してください。 Linuxで実行する場合、gemは適切ではない(そして明らかに無視される)ので、これは明らかに私がやりたいことではありません。
では、Bundlerにはこれらの問題に対処する方法がありますか?または、開発マシンでバンドルインストールを実行するたびに、生成されたGemfile.lock
のmysql gemバージョンを手動で変更することを忘れないでください。
前もって感謝します!
更新
バンドラーチームはこれを認識しているようです issue 。
これは Bundlerの既知の問題 です。回避策は次のいずれかです。
bundle install
なし--deploy
)。一般的に推奨されていませんが、これはバグが修正されるまで頻繁に使用される回避策です。たとえば、これはHerokuが提供する推奨ソリューションです。Java
)が使用されます。私はこれを真剣にはお勧めしませんが、問題を解決すると信じています。同様の問題があります。 Gemfileに次のようなものを書きたいと思います。
platforms :Ruby do # linux
gem 'nokogiri', "1.5.0.beta.2"
end
platforms :mswin do
gem 'nokogiri', "1.4.4.1"
end
しかし、バンドラーは私が許可されていないことを教えてくれます。したがって、この特定のケースで機能する私の回避策は、さまざまなバージョンを指摘することです:
gem 'nokogiri', ">= 1.4.4.1", "<=1.5.0.beta.2"
現時点では、Windowsコンピューターではバージョン1.4.4.1、Linuxコンピューターでは1.5.0.beta.2を提供しています。たぶん似たようない回避策を書くことは可能です;-)
Engine Yardのエンジニアは、この問題に対処し、異なるプラットフォーム上にある場合はGemを解凍するために、Bundlerにパッチを提出しました。 RailsInstallerデモチュートリアルを実行した後、多くのWindowsをデプロイしようとすると、同じ問題が発生します。私たちが見つけた最良の修正は、以下を実行することです:
bundle install
_開発マシンの通常のようにGemfile.lock
_を調べて、_-x86-mingw32
_の行があれば、その部分を削除します。bcrypt-Ruby (3.0.1-x86-mingw32)
はbcrypt-Ruby (3.0.1)
になりますGemfile.lock
_の「プラットフォーム」セクションの下にRuby
を追加しますGemfile
に必要なgemを明示的に指定してください。 (これが必要かどうかはわかりませんが、害はありません)Gemfile
: `gem 'bcrypt-Ruby'、 '〜> 3.0'、:platform => 'Ruby'bundle install
_再びbcrypt-Ruby (3.0.1)
行を保持し、bcrypt-Ruby (3.0.1-x86-mingw32)
を再度追加します。Bundlerパッチに興味がある場合は、 https://github.com/carlhuda/bundler/pull/1451 で通知を受け取ることができます。
これがまだ答えを探している人を助けることを願っています。
rvm
( リンクはこちら )を使用してみましたか?分離されたRuby Virtual Machines and Gemsetsをインストールできるため、実稼働環境に近い環境で作業できます。問題を解決できるかどうかは正直わかりませんが、試してみる価値。
とにかく、私はこれがあなたが聞きたい答えではないことを知っていますが、私見WindowsはRailsで開発するときの最良のプラットフォーム使用ではありません。最近、主にRailsアプリケーションを開発するためにMacBookを購入しました。これにより多くの頭痛から解放されます。開発マシンにLinuxをインストールして使用することもできます。 Cygwin。
問題は、mysql gemが必要なヘッダーを適切に検出しないことだと思います。これを修正するには、 mysql2 gem を使用するように移行します。ActiveRecord統合のためにdatabase.yml
のデータベースアダプターを更新するだけです。
さらに、can絶対に必要な場合は、C拡張ジェムにビルドフラグを渡すことができます。
bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
。
Gemfile.lock
とgemを本番にコミットしないでください。本番環境でbundler install
を再度実行する必要があります。
次のようなことができます:
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
ところで、すべてのマシンが同じgemバージョンでアプリケーションを実行するため、Gemfile.lockをバージョン管理に入れる必要があります。
私はこの問題に出くわし、この苦痛な作業のためにスクリプトを書くことになりました。 http://gouravtiwari.blogspot.com/2011/03/development-on-windows-deploying-to.html