我想弄明白为什么我一直纠结的问题现在神奇地解决了。
我正在构建一个使用Spotify OAuth的Rails应用程序(通过rspotify
gem),并在这里描述的确切问题上卡住了。在转圈之后,我终于看到了这个评论,建议我明确地将omniauth
宝石添加到我的Gemfile
中。
现在,这个omniauth
gem已经是Gemfile.lock
中omniauth-oauth2
的一个依赖项。正如链接的评论所建议的,我在我的Gemfile中包含了omniauth
,现在我的问题似乎解决了,但我真的不知道为什么。
- 在这种情况下,为什么在
Gemfile
中包含gem解决railtie问题? - 如果一个gem已经作为一个依赖项安装(根据
Gemfile.lock
),这不是一个给定的gem已经安装的证据吗?例如,如果gem_foo
在Gemfile.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仓库。