6

Gemfile.lockのトラックを解除しないようにアドバイスされましたが、問題が発生しました。

私は自分のWindowsマシンで開発し、Linux(ubuntu)サーバーにプッシュします。問題はx86-mingw32、バージョン番号の後に次のように追加することで、Bundlerが一部のgemのWindowsバージョンをロックすることです。これにより問題が発生します。

GEM
  remote: http://rubygems.org/
  specs:
    actionmailer (3.2.1)
    ...
    mysql2 (0.3.11-x86-mingw32)
    ...

  PLATFORMS
    x86-mingw32

Capistranoを使用してデプロイしましたが、次のエラーが発生します。

mysqlアダプターをインストールしてください:gem install activerecord-mysql-adapter(mysqlはバンドルの一部ではありません。Gemfileに追加してください。)

私のgemfileは次のようなものですが:

...
gem 'mysql2'
...

これは、RailsがGemfile.lockにあるWindowsバージョンのmysql2を使用しようとしているためだと思います。

これを解決するためのアイデアはありますか?

4

2 に答える 2

6

次のようなものをGemfileに追加してから、更新をバンドルします(現在のmysql2 gemリストを明らかに置き換えます)

  
if RUBY_PLATFORM =~ /win32/
  gem "mysql2", :platform => [:mswin, :mingw]
else
  gem "mysql2", :platform => :ruby
end
  

これが意味するのは、プラットフォームが「win32」(Windows)の場合、Windowsバージョンをインストールするか、すべてのUnixシステムに「ruby」である通常バージョンをインストールすることです。少なくとも、それが機能しないUnixシステム(Mac OS X、Linux、Solaris、* BSD)は知りません。

更新:もう少し情報を得ました。問題は、-deploymentフラグがロックファイルのみを参照することです。それ以外の場合は、-deploymentを省略し、gemをGemfile自体の特定のバージョンにロックしてから、バンドル更新を実行してGemfileを強制的に再評価し、セレクターを強制することができます。問題は、バンドルは--deploymentフラグを使用する場合にのみロックファイルを評価するため、必要な機能を実行できないことです。これは、どのプラットフォーム上にあるかを再評価する方法がないことを意味します。それは厳密にロックファイルにあるものに依存します。これが、唯一の実際の解決策が、メインのGemfileでgemバージョンをロックしてから、更新をバンドルして再評価を強制することである理由です。

おそらく--deploymentを忘れて、ただ使用することができます

  
    bundle update && bundle install --without=development,test,any_other_groups --path=./vendor/bundle
  

これは、バンドラーの動作方法が原因で、展開しているプラ​​ットフォームとはまったく異なるプラットフォームで開発する場合に必要です。上記のコマンドは、-deploymentが行うことを正確に複製する必要があります。これらはすべて.bundle/configにも記録されます。

于 2012-11-13T11:31:24.137 に答える
1

Windowsのコマンドプロンプトでこれを入力すると、RUBY_PLATFORMを確認できます。

ruby -e 'puts RUBY_PLATFORM'

たとえば、このGemfileは、WindowsラップトップとLinuxサーバーで共有できます。

if RUBY_PLATFORM =~ /(win32)|(i386-mingw32)/
  gem 'mongrel','1.2.0.pre2'
else
  gem 'unicorn'
end
于 2013-11-07T05:43:37.747 に答える