代码之家  ›  专栏  ›  技术社区  ›  Daniel Abrahamsson

让bundler为不同的平台使用不同的gems

  •  46
  • Daniel Abrahamsson  · 技术社区  · 15 年前

    mysql 生产环境中的宝石,乘客吐出: "!!! 错过了mysql宝石。将其添加到gem文件: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
    

    如你所见 指定了gem。然而,在部署时,bundler会忽略它。为什么?原因是Bundler生成了以下代码 Gemfile.lock (仅包括相关部分):

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

    请注意,它包括特定于平台的gem。这显然不是我想要它做的,因为在Linux下运行gem是不合适的(而且似乎被忽略了)。

    Gemfile.lock文件 每次我在我的开发机器上运行bundle install时?

    更新

    看来bundler团队已经意识到了这一点 issue .

    9 回复  |  直到 15 年前
        1
  •  37
  •   awendt    15 年前

    这是一个 known issue in Bundler

    • 生成Gemfile.lock文件在一个与您的生产环境足够相似的系统上,您可以得到与您的生产平台相匹配的结果。实际上,这意味着您只能生成Gemfile.lock文件如果您的生产系统是Windows,则在Windows上创建文件。
    • bundle install 没有 --deploy ). 虽然一般不建议这样做,但在修复错误之前,这是一种常用的解决方法。例如,这是Heroku推荐的解决方案。
    • java ). 我不建议这么做,但我相信它能解决问题。
        2
  •  8
  •   Stefan Pettersson    15 年前

    我也有同样的问题。我希望能够在我的文件中写入这样的内容:

    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" 
    

        3
  •  5
  •   Evan Machnic    14 年前

    我们在Engine Yard的工程师已经向Bundler提交了一个补丁来解决这个问题,如果在不同的平台上,可以解冻宝石。在运行了RailsInstaller演示教程之后,我们遇到了许多试图部署的窗口的相同问题。我们找到的最佳解决方案是执行以下操作:

    1. bundle install 就像在你的开发机器上一样
    2. 通过 Gemfile.lock -x86-mingw32 ,删除该部分。
      • bcrypt-ruby (3.0.1-x86-mingw32) 变成 bcrypt-ruby (3.0.1)
    3. 添加 ruby
    4. 请确保在中显式指定所需的gem Gemfile 带着站台旗。(不确定是否需要,但不会造成伤害)
      • Gemfile公司 :`gem'bcrypt ruby','~>3.0',:platform=>'ruby'
    5. 捆绑安装 又一次,这将保持 bcrypt红宝石(3.0.1) bcrypt ruby(3.0.1-x86-mingw32)

    如果您对Bundler补丁程序感兴趣,可以在 https://github.com/carlhuda/bundler/pull/1451

    希望这能帮助那些还在寻找答案的人。

        4
  •  2
  •   Daniel Mendel    15 年前

    mysql2 gem database.yml

    另外,你 如果绝对必要,将构建标志传递给C扩展gems:

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

        5
  •  2
  •   Community Mohan Dere    9 年前

    我以前遇到过这个问题,使用 mysql2 gem确实解决了这个问题。我知道这不是你要找的答案,但把它和 Diego 你的回答是金色的。

        6
  •  2
  •   Fábio Batista Raza Ahmed    15 年前

    你用过吗 rvm ( link here )? 它可以安装独立的Ruby虚拟机和gemset,因此您可以使用更像生产环境的环境。我真的不知道这是否能解决你的问题,但值得一试。

    不管怎样,我知道这不是你想听到的答案,但是在Rails中开发时imhowindows并不是最好的平台。我最近买了一台MacBook,主要是为了开发Rails应用程序,它帮你省去了很多麻烦。您还可以在开发机器上安装Linux并使用它,这比使用Windows端口或Cygwin要好得多。

        7
  •  1
  •   Joshua Partogi    15 年前

    Gemfile.lock bundler install

        8
  •  1
  •   Diego Carrion    15 年前

    你可以这样做:

    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文件因为这样所有的机器都将使用相同的gems版本运行应用程序。

        9
  •  0
  •   gouravtiwari21    15 年前

    我遇到了这个问题,然后为这个痛苦的任务写了剧本。 http://gouravtiwari.blogspot.com/2011/03/development-on-windows-deploying-to.html

        10
  •  0
  •   Taylored Web Sites    5 年前

    我将部署到Linux以供开发人员使用,部署到Windows以供生产和用户使用。因此,我需要一个.lock文件来处理这两个文件(生产和转移只使用.lock文件,并且我要确保我使用的是保存在.lock文件中的开发人员使用的gem版本)。

    将这两个.lock文件都放入repo需要额外的一轮提交。因此,如果我必须在windows pull请求之后在Mac上进行捆绑安装,我会将预先存在的.lock文件复制为windows版本,并将新的.lock文件复制为linux版本。然后我执行一个pull请求来更新锁文件。

    部署时,我覆盖Gemfile.lock文件使用正确的版本。

        11
  •  0
  •   Santiago Bosio    5 年前

    我找到的最好的解决方案是始终使用 ruby Gemfile.lock .

    您可以通过将Bundler config值设置为

    bundle config set --global force_ruby_platform 'true'
    

    这样,包将始终默认安装ruby平台gems。但这意味着所有需要在特定平台上进行本机扩展的gem都必须编译,因此您需要确保在本地和生产机器上都安装了所需的工具和库。