【问题标题】:Bundler misses gems on MacBundler 错过了 Mac 上的 gem
【发布时间】:2017-09-20 08:30:43
【问题描述】:

我在使用 bundler 加载 gem 时遇到问题。仅在我的 mac 环境中发生。无法通过捆绑程序找到 gem,但是当我通过 gem install #{gem} 全局安装 gem 时,它可以工作。

我想这是特定于环境的东西,但我不确定如何调试它。我在 Ubuntu 机器上安装了相同版本的 ruby​​、ruby-install 和 chruby 和 bundler,但它工作得很好。

到目前为止,我在使用 gems spring-comands-rspec 和 rack-cors 时遇到了这个问题。

损坏的环境(Mac):

OS: Darwin nb-mjacobus2 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
Bundler: 1.15.4
ruby-install: 0.6.1
chruby: 0.3.9
ruby: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]

暴露错误:

宝石文件

group :development do
  # ...
  gem 'spring-commands-rspec'
  # ...
end

运行测试

./bin/rspec spec/controller/some_controller_spec.rb:8
/$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- spring-commands-rspec (LoadError)
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.spring.rb:2:in `<top (required)>'
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/lib/spring/commands.rb:29:in `<module:Spring>'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/lib/spring/commands.rb:4:in `<top (required)>'
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/lib/spring/server.rb:9:in `<top (required)>'
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/lib/spring/client/server.rb:9:in `call'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
        from /$HOME/.gem/ruby/2.4.1/gems/spring-2.0.2/bin/spring:49:in `<main>'

手动安装gem可以解决问题....

gem install spring-commands-rspec
Fetching: spring-commands-rspec-1.0.4.gem (100%)
Successfully installed spring-commands-rspec-1.0.4
Parsing documentation for spring-commands-rspec-1.0.4
Installing ri documentation for spring-commands-rspec-1.0.4
Done installing documentation for spring-commands-rspec after 0 seconds
1 gem installed

...但我收到以下警告:

./bin/rspec spec/pattern_library_controller_spec.rb
WARN: Unresolved specs during Gem::Specification.reset:
      minitest (~> 5.1)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
WARN: Unresolved specs during Gem::Specification.reset:
      minitest (~> 5.1)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
Running via Spring preloader in process 53164
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}

Randomized with seed 5284

SomeController
  should respond with a success status code (2xx)

Finished in 0.13193 seconds (files took 0.66951 seconds to load)
1 example, 0 failures

Randomized with seed 5284

知道可能是什么问题吗?

【问题讨论】:

    标签: ruby rubygems bundler


    【解决方案1】:

    由于某种原因,gem 安装在 vendor/bundle 内部,但不是全部。删除rm -rf .bundle vendor/bundle &amp;&amp; bundle install 做到了。

    .bundle/config 的内容是:

    ---
    BUNDLE_WITHOUT: "development:related"
    

    【讨论】:

      【解决方案2】:

      TL;DR;尝试将spring-commands-rspec 移动到Gemfile 中的test 组:

      group :development
        # ...
        # ...
      end
      group :test do
      # ...
        gem 'spring-commands-rspec'
      end
      

      或者 group :development, :test do 如果您需要 gem 不仅用于测试。

      简而言之:有Environment 概念,当您在Rails 中运行某些东西时。加载的宝石也依赖于它,通过Gemfile - Bundler 加载来自相应组的常见宝石和宝石。 默认环境是development,但rspec使用test一个。因此,如果来自组 development 的 gem 也未列在组 test 中,则在运行 rspec ... 时不会加载它们。

      更新: 您似乎已将您的应用设置为服务器模式(可能是您从部署脚本获取安装命令)。因为在 staging/production 服务器上部署 Rails 应用程序(即 gem 随应用程序在本地安装)时,具有 .bundle dir 和 vendor/bundle 是很典型的。
      但在这种情况下,您的.bundle/config 至少应该包含BUNDLE_PATH

      BUNDLE_FROZEN: "1"
      BUNDLE_PATH: "./vendor/bundle"
      BUNDLE_WITHOUT: "development:test"
      BUNDLE_DISABLE_SHARED_GEMS: "true"
      

      【讨论】:

      • 感谢您的回答。它实际上是捆绑配置(正如我在上面回答的那样)。宝石在正确的组中。事实上,我也尝试过在团体之外使用 rack-cors。
      • @Marcelo 在帖子中回复。
      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 2011-04-14
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多