【问题标题】:Cannot switch gem versions in an rbenv environment无法在 rbenv 环境中切换 gem 版本
【发布时间】:2019-04-30 18:05:37
【问题描述】:

我在我的 macOS 10.14.4 上通过 Homebrew 安装了 rbenv 1.1.2。

我无法在与最新可用版本不同的版本上运行 gem。

例如,我安装了三个版本的 xcodeproj gem(1.8.2、1.8.1、1.8.0、1.5.7)。

如果我运行xcodeproj --version,我会按预期看到 1.8.2。

但是,如果我运行 xcodeproj _1.5.7_ --version,我也会看到 1.8.2,而预期是 1.5.7。

请注意,传递版本会有所作为 - 如果我传递无效版本(例如 1.5.0),我会收到“找不到 gem xcodeproj (= 1.5.0)”错误正如预期的那样。

如何才能运行以前的版本?

【问题讨论】:

  • gemfile 怎么样?您可以在那里指定特定版本。还是我错过了什么?
  • 就像@MrRoth 在他们的回答中所说,我可以使用 Gemfile 和捆绑器,但据我所知,这将在我想使用 gem 的任何地方使用捆绑器。虽然这对 Rails 有意义,但对于我使用的 CococaPods 等命令行工具来说意义不大。我想真正的问题是这是否是一个特别是 rbenv 的错误。当通过 rbenv 安装 gem 时,它们在 ls ~/.rbenv/shims 中存根,并通过 /usr/local/Cellar/rbenv/1.1.2/libexec/rbenv 执行。是不是表示rbenv没有正确理解version指令?
  • rbenv 将解析为 ~/.rbenv/versions/2.3.7/bin/xcodeproj ,其中包含以下行: load Gem.bin_path('xcodeproj', 'xcodeproj', version) 版本确实正确传递,因此运行“xcodeproj 1.5.7 --version”会导致 Gem.bin_path() 返回“~/.gem/ruby/2.3.0/gems/xcodeproj-1.5.7 /bin/xcodeproj”。尚不清楚为什么这不起作用。

标签: ruby macos rubygems homebrew rbenv


【解决方案1】:

您应该使用bundler 来管理 Gemfile 中指定的 ruby​​gems 依赖项。例如:

$ cat Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

gem "xcodeproj", "1.5.7"

使用捆绑器安装它们

$ bundle install --path gems
Fetching gem metadata from https://rubygems.org/...............
Resolving dependencies...
Fetching CFPropertyList 3.0.0
Installing CFPropertyList 3.0.0
Fetching atomos 0.1.3
Installing atomos 0.1.3
Using bundler 1.17.2
Fetching claide 1.0.2
Installing claide 1.0.2
Fetching colored2 3.1.2
Installing colored2 3.1.2
Fetching nanaimo 0.2.6
Installing nanaimo 0.2.6
Fetching xcodeproj 1.5.7
Installing xcodeproj 1.5.7
Bundle complete! 1 Gemfile dependency, 7 gems now installed.
Bundled gems are installed into `./gems`

然后使用 bundler 执行你的 ruby​​gem

$ bundle exec xcodeproj --version
1.5.7

请注意,当您使用 rbenv 并希望在没有捆绑器管理的情况下执行 ruby​​gem 时,您必须确保为每个 rbenv 版本安装您最喜欢的 gem。例如,如果您使用 2 个不同的 ruby​​ 版本并且您喜欢 pry ruby​​gem,那么您必须为每个 ruby​​ 版本安装 pry。

【讨论】:

  • 谢谢,这行得通。但是,它相当笨拙——我使用许多 gem 作为命令行工具(最常见的是 CocoaPods),如果我理解正确,我需要在“当前包”的上下文中运行 bundle exec,这意味着我需要在我想要运行该工具的每个目录中创建一个 Gemfile。例如,我使用 CocoaPods 为 Xcode 项目获取库。通常,我需要的只是每个 Xcode 项目目录中的 Podfile。使用捆绑器方法,我还需要为每个 Xcode 项目创建一个 Gemfile。我的理解正确吗?
  • @DavidAirapetyan:首先,如果这解决了您帖子中的问题,请接受我的回答。对于您的另一个问题,理论上您是正确的,尽管它可以被“黑客攻击”。我也更新了我的答案。
  • 它并不能完全解决我的问题,但我想它确实回答了它所说的问题。感觉就像我遇到了 rbenv 的限制/错误 - 有证据表明我正在尝试做的事情实际上适用于 RVM。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多