【问题标题】:Using RVM Gemsets & Bundler & RubyMine使用 RVM Gemsets & Bundler & RubyMine
【发布时间】:2013-07-28 14:31:58
【问题描述】:

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

RVM 也有 gemsets。
gemset 中的 Gem 与 Bundler 的 gem 没有联系。 ←这是正确的吗?
我得出这个结论是因为 gem 文件存储在不同的位置:
RVM 宝石集:~/.rvm/gems/ruby-2.0.0-p247@myApp
打包者:[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 会警告我呢?

【问题讨论】:

    标签: ruby-on-rails rvm bundler gemset


    【解决方案1】:
    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(即bundle exec rails server)运行 Rails 服务器,则可以忽略该警告。 Bundler 将正确加载 Gemfile 中列出的 gem。

    如果您想使用 gemset 而不是 Bundler 缓存,您只需从 Bundler 配置文件中删除该行并使用 bundle install 重新安装您的 gem。

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

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

    【讨论】:

    • 已删除 BUNDLE_PATH: vendor/bundle/gems。现在 gems 安装在正确的目录中。谢谢!
    • 我们需要 gemsets 和 bundler 来管理 gems 吗?
    • @AnkitDhingra 不,管理宝石不需要宝石集。只要您在任何命令之前使用bundle exec,Bundler 就会为您加载正确的依赖项。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • bundle install --system 仍将其安装在 vendor/bundle/gems 中,但从 .bundle/config 中删除 BUNDLE_PATH: vendor/bundle/gems 会有所帮助。谢谢!
    【解决方案3】:

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

    “gem env”是什么样的?也是“捆绑环境”?

    【讨论】:

    • 好吧,这很奇怪,Bundler 显示了正确的 gempath (/Users/Alex/.rvm/gems/ruby-2.0.0-p247@myBlog:/Users/Alex/.rvm/gems/ruby -2.0.0-p247@global)。有没有机会在设置 rvm 之前运行 bundle ?否则它看起来很好。
    • 另外,RubyMine 显示为 gem env(工具 -> 显示 gem 环境)是什么?
    • 也许吧。我不记得了,这是我的第一个应用)
    【解决方案4】:

    所以这只花了我 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 根本没有安装):

    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:{the rest}'

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

    在上述说明中,当您运行 bundle install(从终端或 RM)时,它会成功运行,并且您已正确设置 RVM,并且已创建 gemset


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      相关资源
      最近更新 更多