【问题标题】:bundler: specify ruby version based on platformbundler:根据平台指定 ruby​​ 版本
【发布时间】:2015-04-30 18:52:02
【问题描述】:

我们正在为我们编写的微服务在 MRI 和 JRuby 上进行一些 A/B 测试。

我需要我的服务器或任何本地开发人员使用指定版本的 JRuby 或 MRI。

我已经阅读了Bundler's docs,并认为我理解了如何使用 ruby​​ 引擎:

platforms :jruby do
  ruby '1.9.3', engine: :jruby, engine_version: '1.7.19'
  gem 'bson'
end

platforms :ruby do
  ruby '2.2.0', engine: :ruby, engine_version: '2.2.0'
  gem 'bson_ext'
end

但是,如果我执行 $which ruby 我得到:.rvm/rubies/jruby-1.7.19/bin/ruby 然后运行 ​​bundle install 我得到:

Your Ruby engine is jruby, but your Gemfile specified ruby

如何使用带有平台的捆绑程序来指定特定于用户/服务器正在运行的平台的 ruby​​ 版本?

【问题讨论】:

    标签: ruby bundler jruby


    【解决方案1】:

    截至目前的Bundler 你不能这样做,因为:platforms 只适用于gem 声明......你能得到的最接近的是一个“运行时”决策逻辑,基于 Ruby 加载 宝石文件

    if defined? JRUBY_VERSION
      ruby '1.9.3', engine: :jruby, engine_version: '1.7.19'
    else
      ruby '2.2.0', engine: :ruby, engine_version: '2.2.0'
    end
    
    platforms :jruby do
      gem 'bson'
    end
    
    platforms :ruby do
      gem 'bson_ext'
    end
    

    【讨论】:

    • 谢谢@kares。当我使用 MRI 和您的更改运行 bundle install 时,我得到 Your Ruby engine is ruby, but your Gemfile specified ruby。如果我切换到 jruby,我会得到 Your Ruby engine is jruby, but your Gemfile specified jruby
    • 是的......正如所说,这是你得到的最接近的 - 如果你主要使用一个 Ruby 但比其他人使用另一个 Ruby 并且 Gemfile.lock 未提交,这将是最好的。
    • 只使用捆绑器 DSL,从不使用 Gemfiles 中的 Ruby 条件:它会破坏 bundle package --all 之类的东西,因为它写入的 Gemfile.lock 将根据哪个平台 bundle install 首先出现不确定性错误。
    • Bundler 如果不具备平台意识,则历史悠久 -> 尽管platform: 声明 .lock 在一个 Ruby 中创建,但并不总是在另一个 Ruby 中工作。希望它现在可以工作(不确定 - 如果是这样的话,最好知道哪个版本)。因此(工作)诸如此类的“黑客”存在(编辑)......由于 Bundler 在相当长的一段时间内不太关心多 Ruby 商店。
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多