web-dev-qa-db-ja.com

さまざまなプラットフォーム用にバンドラーが異なるgemを使用するようにする

私は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

46

これは Bundlerの既知の問題 です。回避策は次のいずれかです。

  • 実稼働環境に十分に類似したシステムでGemfile.lockを生成し、実稼働プラットフォームに一致する結果を取得します。つまり、実稼働システムがWindowsの場合、WindowsでのみGemfile.lockファイルを生成できます。
  • Gemfile.lockファイルをまったくコミットせず、デプロイ時に実稼働マシンへの依存関係を判断します(bundle installなし--deploy)。一般的に推奨されていませんが、これはバグが修正されるまで頻繁に使用される回避策です。たとえば、これはHerokuが提供する推奨ソリューションです。
  • JRubyに切り替えると、WindowsとLinuxの両方で同じプラットフォーム文字列(Java)が使用されます。私はこれを真剣にはお勧めしませんが、問題を解決すると信じています。
  • Bundlerソースコードの問題を修正します。つまり、Bundlerチームがバグを修正するのを助けます。 :)
37
wuputah

同様の問題があります。 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を提供しています。たぶん似たようない回避策を書くことは可能です;-)

8

Engine Yardのエンジニアは、この問題に対処し、異なるプラットフォーム上にある場合はGemを解凍するために、Bundlerにパッチを提出しました。 RailsInstallerデモチュートリアルを実行した後、多くのWindowsをデプロイしようとすると、同じ問題が発生します。私たちが見つけた最良の修正は、以下を実行することです:

  1. _bundle install_開発マシンの通常のように
  2. _Gemfile.lock_を調べて、_-x86-mingw32_の行があれば、その部分を削除します。
    • bcrypt-Ruby (3.0.1-x86-mingw32)bcrypt-Ruby (3.0.1)になります
  3. _Gemfile.lock_の「プラットフォーム」セクションの下にRubyを追加します
  4. Platformフラグを使用して、Gemfileに必要なgemを明示的に指定してください。 (これが必要かどうかはわかりませんが、害はありません)
    • Gemfile: `gem 'bcrypt-Ruby'、 '〜> 3.0'、:platform => 'Ruby'
  5. _bundle install_再びbcrypt-Ruby (3.0.1)行を保持し、bcrypt-Ruby (3.0.1-x86-mingw32)を再度追加します。

Bundlerパッチに興味がある場合は、 https://github.com/carlhuda/bundler/pull/1451 で通知を受け取ることができます。

これがまだ答えを探している人を助けることを願っています。

5
Evan Machnic

以前にこの問題に遭遇したことがありますが、 mysql2 gemを使用することで実際に問題が解決します。私はそれがあなたが探している答えではないことを知っていますが、それを Diego の答えと組み合わせて、あなたは黄金です。

2
bouchard

rvmリンクはこちら )を使用してみましたか?分離されたRuby Virtual Machines and Gemsetsをインストールできるため、実稼働環境に近い環境で作業できます。問題を解決できるかどうかは正直わかりませんが、試してみる価値。

とにかく、私はこれがあなたが聞きたい答えではないことを知っていますが、私見WindowsはRailsで開発するときの最良のプラットフォーム使用ではありません。最近、主にRailsアプリケーションを開発するためにMacBookを購入しました。これにより多くの頭痛から解放されます。開発マシンにLinuxをインストールして使用することもできます。 Cygwin。

2
Fábio Batista

問題は、mysql gemが必要なヘッダーを適切に検出しないことだと思います。これを修正するには、 mysql2 gem を使用するように移行します。ActiveRecord統合のためにdatabase.ymlのデータベースアダプターを更新するだけです。

さらに、can絶対に必要な場合は、C拡張ジェムにビルドフラグを渡すことができます。

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

2
Daniel Mendel

Gemfile.lockとgemを本番にコミットしないでください。本番環境でbundler installを再度実行する必要があります。

1
Joshua Partogi

次のようなことができます:

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をバージョン管理に入れる必要があります。

1
Diego Carrion

私はこの問題に出くわし、この苦痛な作業のためにスクリプトを書くことになりました。 http://gouravtiwari.blogspot.com/2011/03/development-on-windows-deploying-to.html

0
gouravtiwari21