【问题标题】:Can bundler constrain a gem installation to a certain operating system?bundler 可以将 gem 安装限制在某个操作系统上吗?
【发布时间】:2011-08-19 06:04:36
【问题描述】:

我正在开发 Rails 3.1,并且正在使用默认的 uglifier 资产 gem。该 gem 依赖于 execjs,它需要 JavaScript 运行时。我在 Mac OSX 上开发,所以我从来没有遇到过麻烦。另一位开发人员使用 Linux,默认情况下它没有 JavaScript 运行时。因此,使用嵌入在 Ruby 中的 JavaScript 运行时 therubyracer 工作得很好,但我希望 Bundler 仅在系统是 Linux 时安装它。我可以在 Gemfile 中指定它以便它只安装在 Linux 而不是 Mac 中吗?

【问题讨论】:

    标签: ruby-on-rails bundler gemfile


    【解决方案1】:

    你可以的;

    gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i
    

    根据您的情况将 gem 和平台替换为适当的。

    【讨论】:

    • 这仍然会安装 gem,不是吗?如果不是 Linux,我正在寻找一种在 bundle install 期间跳过它的方法。
    • @rubish 是的,它仍然会安装它。 :require => false 仅用于防止捆绑程序在运行时需要该库,即您在自己的代码中手动需要它。
    【解决方案2】:

    这种方法的问题在于,如果 OS X 系统更新 Gemfile.lock,gem 将被包含在内。如果其他开发人员更新 gemfile 中的任何 gem,这将成为问题,因为 bundler 在计算依赖项时不会包含 gem。

    我解决此类问题的方法是手动安装我想要的 gem,然后同时需要:

    begin
      require 'os-x-gem'
    rescue LoadError
    end
    begin
      require 'linux-gem'
    rescue LoadError
    end
    

    【讨论】:

    • 但是,如果用户在 linux 上,这将失败,因为 require "os-x-gem" 将失败,导致加载错误,并且永远不需要 linux gem。两种宝石都需要自己的开始救援块。
    • 好点,我错过了。我已更新示例以纠正此问题。
    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多