gpt4 book ai didi

ruby-on-rails - 在 Rails 的同一个命名空间中使用两个 gem

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:58 25 4
gpt4 key购买 nike

我有一个使用 LinkedIn 的应用程序gem,但我需要转向使用 different gem 中的 LinkedIn OAuth2 实现.

我需要在现有用户的初始 gem 中支持对 oAuth1 的请求,但我需要为 future 的新用户支持 OAuth2。

问题是,这两个 gem 都使用 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

这与 require 的工作方式有关吗?是否可以在单独的 lib 文件中仅加载这些 gem 中的一个而不会相互破坏?

编辑

我发现我在我的一个规范文件中需要 linkedin,这导致它被自动加载,但这仍然没有解决被破坏的问题。

当我安装了两个 gem 并运行时:

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,但错误发生了。难道是因为他们如何require supporting fileslinkedin gem 中?似乎仍然不应该影响它。

最佳答案

我不建议这样做,因为它可能会产生一些奇怪的副作用,例如 linkedin-oauth2 使用 ::LinkedIn 引用自身,但重新定义 ruby​​ 常量的方法显示在this answer .

我会稍微更改它以防止重命名常量警告... Object.send(:remove_const, :Stripe) 而不是 Stripe = Module.new 如答案所示。因此,一个示例(未测试)是:

require 'linkedin-oauth2'
LinkedInOauth2 = LinkedIn

Object.send(:remove_const, :LinkedIn)

require 'linkedin'

关于ruby-on-rails - 在 Rails 的同一个命名空间中使用两个 gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49053379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com