我有一个使用LinkedIn gem的应用,但我需要转向使用different gem中的LinkedIn OAuth2实现。
我需要在现有用户的初始gem中支持oAuth1上的请求,但我需要为新用户提供支持OAuth2。
问题是,这两个宝石都使用LinkedIn
命名空间作为其模块名称,并且根据我在Gemfile中包含它们的顺序,一个就破坏了另一个。
我尝试将require: false
添加到gemfile中,如下所示:
gem 'linkedin', require: false
gem 'linkedin-oauth2', require: false
但奇怪的是,当我进入我的控制台时,第一个仍然需要,而第二个不是:
irb(main):001:0> require 'linkedin'
=> false
irb(main):002:0> require 'linkedin-oauth2'
=> true
这与需求如何有关吗?是否可以在单独的lib文件中加载这些宝石中的一个,而不会互相破坏?
修改
我发现我在我的一个规范文件中要求linkedin
,这导致它被自动加载,但这仍然无法解决被破坏的问题。
当我安装了两个宝石并运行时:
irb(main):001:0> require 'linkedin'
=> true
irb(main):002:0> ::LinkedIn::Client.new
NameError: uninitialized constant Api::QueryHelpers
from /Users/me/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/linkedin-1.1.0/lib/linked_in/client.rb:8:in `<class:Client>'
irb(main):004:0> require 'linkedin-oauth2'
=> true
但是如果我从我的gemfile中卸载linkedin-oauth2
它就可以了:
irb(main):002:0> require 'linkedin'
=> true
irb(main):004:0> ::LinkedIn::Client.new
=> #<LinkedIn::Client:0x007f9eef6d72a8 @consumer_token=nil, @consumer_secret=nil, @consumer_options={}>
为什么会这样,尤其是在第一个示例中不需要linkedin-oauth2
,但是会发生错误。可能是因为linkedin
宝石中的require supporting files如何?似乎仍然不应该影响它。
答案 0 :(得分:1)
我不建议这样做,因为它可能会产生一些奇怪的副作用,例如,如果linkedin-oauth2使用::LinkedIn
引用自身,但重新定义ruby常量的方法显示在{{3 }}
我会稍微更改一下,以防止重命名警告...... Object.send(:remove_const, :Stripe)
而不是答案中显示的Stripe = Module.new
。因此,一个例子(未经测试)将是:
require 'linkedin-oauth2'
LinkedInOauth2 = LinkedIn
Object.send(:remove_const, :LinkedIn)
require 'linkedin'