为什么在Gemfile中包含一个gem可以解决rails问题,即使这个gem已经包含在Gemfile.lock中了?&l



我想弄明白为什么我一直纠结的问题现在神奇地解决了。

我正在构建一个使用Spotify OAuth的Rails应用程序(通过rspotifygem),并在这里描述的确切问题上卡住了。在转圈之后,我终于看到了这个评论,建议我明确地将omniauth宝石添加到我的Gemfile中。

现在,这个omniauthgem已经是Gemfile.lockomniauth-oauth2的一个依赖项。正如链接的评论所建议的,我在我的Gemfile中包含了omniauth,现在我的问题似乎解决了,但我真的不知道为什么。

  • 在这种情况下,为什么在Gemfile中包含gem解决railtie问题?
  • 如果一个gem已经作为一个依赖项安装(根据Gemfile.lock),这不是一个给定的gem已经安装的证据吗?例如,如果gem_fooGemfile.lock中被列为依赖项,而我在Gemfile中添加了gem_foo,然后运行Bundler,那么Rails如何解释这一变化?

这与绑定器加载gems的方式有关。Bundler.require需要Gemfile中列出的gems,但不需要它的依赖。这取决于库是否需要/加载其依赖项。

上述问题发生在omniauth没有显式添加到Gemfile时,因此捆绑器不需要它。

但是由于omniauth-rails_csrf_protection假设ominauth已经是必需的,当用户只添加omniauth-rails_csrf_protection而不添加omniauth到Gemfile时,它会出错。

我已经创建了一个可能的修复问题https://github.com/cookpad/omniauth-rails_csrf_protection/pull/13

更新:该修复已被合并到gem仓库。

相关内容

最新更新