【问题标题】:How to manage multiple Ruby apps with conflicting gem versions?如何管理具有冲突 gem 版本的多个 Ruby 应用程序?
【发布时间】:2014-08-06 00:28:14
【问题描述】:

我有两个 Sinatra 应用程序,每个应用程序都使用一组不同的 gem,其中一些有相互冲突的版本,例如应用 A 使用 Nokogiri 1.6.3,应用 B 使用 Nokogiri 1.5.5。

如何在同一台 OSX 机器上管理这两个环境并能够在它们之间切换而不会发生冲突?

我可以只使用 Bundler,还是还需要 RVM?具体如何?

【问题讨论】:

    标签: ruby-on-rails ruby gem rubygems sinatra


    【解决方案1】:

    Bundler 处理系统上的多个 Gem 版本

    Bundler 可以很好地处理这个用例。您的明确 gem 依赖项进入您的 Gemfile,然后包中的所有 gem 版本都存储在 Gemfile.lock 文件中。

    作为一般规则,您的 gem 将安装在 GEM_HOME 中。可以同时安装一个 gem 的多个版本,require bundler/setup 负责确保您的 Ruby 应用程序可以使用正确的版本(在您的 Gemfile.lock 中指定)。

    但是,除非您使用 binstub、gemset 或 <gem> _<version>_ [args] 等特殊调用,否则您需要从命令行运行 bundle exec <gem> 才能使用您的包指定的正确版本。

    【讨论】:

    • 谢谢。我更喜欢使用 Bundler。因此,如果我的两个应用程序使用同一个 Gem 的不同版本 - 它们会单独安装和存储在我的系统上吗?你知道在哪里(即文件路径)吗?
    • @NightOwl 看起来好像有人刚刚问了你一个问题stackoverflow.com/questions/25143714/… :)
    • @Mandeep 我会扩展该答案并制作命令bundle install --binstub --path vendor/bundles,获取所有项目本地内容。
    【解决方案2】:

    管理系统上多个应用程序的最佳方式是使用像RMV(Ruby 版本管理器)这样的管理器。

    RVM 具有gemset 的概念,您可以使用它为不同的应用程序创建不同的 gem 集。它是您问题的解决方案。您将需要为这两个应用程序创建不同的 gemset。像这样,你的 gem 版本不会冲突。

    【讨论】:

    • 但是 RVM 不是为不同的 ruby 版本而不是 gem 版本制作的吗?
    • 它使用gemset的概念。这实际上为不同的应用程序创建了不同的集合。它是您问题的解决方案。
    • @RAJ... 你确定它来自 rvm 而不是来自标准 ruby​​ 语言安装?
    • @Mandeep 是的,它自带rvm
    • @Mandeep 哦,你问的是这个功能,我以为你问的是gemsets
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多