使捆绑器为不同的平台使用不同的宝石

Dan*_*son 46 ruby-on-rails bundler

我正在努力将我们的一个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
Run Code Online (Sandbox Code Playgroud)

如您所见,mysql指定了gem.但是,在部署时,bundler会忽略它.为什么?原因是Bundler生成以下内容Gemfile.lock(仅包含相关部分):

....
mime-types (1.16)
mysql (2.8.1-x86-mingw32)
net-ldap (0.1.1)
....
Run Code Online (Sandbox Code Playgroud)

请注意,它包含特定于平台的gem.这显然不是我想要它做的,因为在Linux下运行时,gem不适合(并且显然被忽略).

那么,Bundler是否有办法解决这些问题?或者我必须记得Gemfile.lock每次在我的开发机器上运行bundle install时手动更改生成的mysql gem版本?

先感谢您!

更新

捆绑团队似乎意识到了这个问题.

wup*_*tah 37

这是Bundler中的一个已知问题.解决方法是:

  • 在类似于生产环境的系统上生成Gemfile.lock,以获得与生产平台匹配的结果.实际上,这意味着如果您的生产系统是Windows,则只能在Windows上生成Gemfile.lock文件.
  • 根本不提交Gemfile.lock文件,并在部署时确定生产计算机上的依赖关系(bundle install--deploy).虽然一般不推荐,但在修复错误之前,这是一种经常使用的解决方法.例如,这是Heroku提供的推荐解决方案.
  • 切换到JRuby,它将在Windows和Linux上具有相同的平台字符串(java).我不认真对待这个,但我相信它会解决这个问题.
  • 修复Bundler源代码中的问题,即帮助Bundler团队修复bug.:)


Ste*_*son 8

我有一个类似的问题.我希望能够在我的Gemfile中写出这样的东西:

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

platforms :mswin do
  gem 'nokogiri', "1.4.4.1" 
end
Run Code Online (Sandbox Code Playgroud)

但是,捆绑者告诉我,我不被允许.因此,我的解决方法,在这个特定情况下工作是指出一系列版本:

gem 'nokogiri', ">= 1.4.4.1", "<=1.5.0.beta.2" 
Run Code Online (Sandbox Code Playgroud)

目前 - 在我的Windows计算机上提供1.4.4.1版本,在我的Linux计算机上提供1.5.0.beta.2.也许你有可能写一个类似的丑陋的解决方法;-)


Eva*_*nic 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使用platform标志显式指定所需的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获取通知

希望这有助于任何仍在寻找答案的人.