6

我使用 RVM 来管理 Ruby 版本。
在我的项目中,我使用 Bundler 来管理项目的 gem。

RVM 也有 gemsets。
gemset 中的 Gem 与 Bundler 的 gem 没有联系。← 这是正确的吗?
我得出这个结论是因为 gem 文件存储在不同的位置:
RVM gemset:~/.rvm/gems/ruby-2.0.0-p247@myApp
Bundler:[my_app_dir]/vendor/bundle/gems
所以应用程序使用 Bundler gems,而不是 RVM gemset gems。

但是当我将 gem 添加到我的 Gemfile 时,RubyMine IDE 向我显示警告,这个 gem 不在 RVM gemset 中。所以我也将这个 gem 添加到 RVM gemset 中(只是为了摆脱这个警告)。

所以问题是:

  1. 是否有充分的理由在两个地方(RVM Gemset 和 Gemfile)添加 gem?
  2. 如果不是,那么为什么 RubyMine 会警告我呢?
4

4 回答 4

7
  1. 是否有充分的理由在两个地方(RVM Gemset 和 Gemfile)添加 gem?

gemset 是附带的,Gemfile 绝对是声明依赖项的地方。您将这些宝石存储在哪里取决于您。

听起来 Bundler 被配置为将它们存储在项目本地路径中,但您希望它们位于 gemset 中。Bundler 通过bundle install --path vendor/bundle/gems在某个时候运行来获得该配置。它将该配置存储在其项目配置文件中project_dir/.bundle/config

BUNDLE_PATH: vendor/bundle/gems

我不熟悉 Rubymine,但如果您使用 Bundler (ie bundle exec rails server) 运行 Rails 服务器,您可以忽略该警告。Bundler 将正确加载 Gemfile 中列出的 gem。

如果您想使用 gemset而不是Bundler 缓存,您只需从 Bundler 配置文件中删除该行并使用bundle install.

  1. 如果不是,那么为什么 RubyMine 会警告我呢?

我的猜测是 Rubymine 没有读取 Bundler 项目配置(在 中project_path/.bundle/config)并且不了解 gem 的安装位置。

于 2013-07-28T14:57:37.880 回答
2

你(或者如果你在一个团队中工作,你的团队中的某个人)曾经做过一个bundle install并指定了一个安装文件夹。在你的情况下vendor/bundle/gems。Bundle 会记住此设置,并且 bundle 命令的所有下一次调用都将使用相同的路径。

这样做是有充分理由的:您的应用程序文件夹将包含所有需求,并且更容易重新分发(例如)。

现在,如果您希望该捆绑包将您的 gem 安装在正常位置,您可以执行以下操作:

  • 运行bundle install --system将使用默认位置
  • 或者:bundle 将它的设置存储在一个配置文件中,我认为.bundle/config你也可以检查那个。通常不需要它,因为bundle install --system会再次正确设置。
  • 然后您可以安全地删除该vendor/bundle/gems文件夹
于 2013-07-28T14:58:59.790 回答
1

不,出了点问题,您不应该在供应商/捆绑包下有任何东西,它应该都在 ~/.rvm/gems/ruby-2.0.0-p247@myApp 下,也许在 ~/.rvm/gems/ruby-2.0 下。 0-p247@global 假设您的 .rvmrc (or.ruby-version) 设置正确。

“宝石环境”是什么样的?还有“捆绑环境”?

于 2013-07-28T14:38:58.527 回答
1

所以这只花了我 3 天的时间,因为我在这里找到的其他任何东西都没有帮助。我还通过 RubyMine 同时运行多个项目(以及不同的版本),因此设置我的 GEM_PATH 并从命令行启动对我来说不起作用。我使用带有 RM 插件的 IntelliJ,这应该可以在 RM 上独立运行。

Bundler 似乎将自定义 gem 或自定义 repos 中的 gem 安装在与 ruby​​gems 或 github 中的 gem 不同的目录中。

/Users/YOURUSER/.rvm/environments/ruby-{版本}\@yourgemset/bundler/gems

我无法修复的一件事是在 GEMFILE 中,我有一些自定义 git_sources,而 ruby​​mine 会突出显示这些并警告我它无法在我的包中找到 gem(您可以忽略此警告;除非 gem 没有t 安装):

gem 'somegem', custom_git:'gituser/repo'

突出显示并且警告是“在 SDK 中找不到 Gem x...”

但是 Bundler 安装了它,并且 ruby​​ 能够加载它。

# TLDR: 让 RUBYMine 找到额外的 gem,并显示在外部库中的步骤

  1. vim ~/.rvm/environments/ruby-{your-verion-here}\@{your-gemset}
  2. 将捆绑器 gems 路径添加到 GEM_PATH 条目

    export GEM_PATH='/Users/YOURUSER/.rvm/gems/ruby-{version}@yourgemset/bundler/gems:{其余}'

  3. 保存文件
  4. 重启 RubyMine/IntelliJ,重新打开你的项目(如果没有自动打开)
  5. 打开Project Structure对话框 > Platform SDKs> 选择您正在使用的 GEMSET
  6. 添加/Users/YOURUSER/.rvm/environments/ruby-{version}\@yourgemset/bundler/gems到您的类路径
  7. 点击确定,然后重新打开Project Structure对话框 > Project Settings>Project
  8. 您的项目可能没有 SDK所以请再次选择您正在使用的 SDK,然后点击 OKAY
  9. RM/IJ 现在将重新索引文件
  10. 大功告成,现在应该修复任何损坏/丢失的检查链接。你应该能够反省你的宝石。

在上述说明中,当您运行捆绑安装(从终端或 RM)时,它可以成功运行,并且您已正确设置 RVM,并且已创建 gemset


我希望这有帮助!让我知道我是否应该澄清任何事情(新年快乐)

于 2014-12-31T21:45:11.080 回答