Nano Hash - криптовалюты, майнинг, программирование

Используйте два гема в одном пространстве имен в Rails

У меня есть приложение, которое использует гем LinkedIn, но мне нужно перейти к использованию реализации LinkedIn OAuth2, которая поставляется в другом геме.

Мне нужно поддерживать запросы на 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

Это как-то связано с тем, как работает require? Можно ли загрузить только один из этих драгоценных камней в отдельных файлах 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

Но если я удалю linkedin-oauth2 из моего gemfile, он будет работать нормально:

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? Вроде все же не должно влиять.


  • Вы можете либо переместить все, чтобы использовать гем linkedin-oauth2, либо повозиться с самими модулями гем, чтобы первый просто расширял второй (однако это не рекомендуется, потому что все равно будут забиты методы с одинаковыми именами). 01.03.2018
  • первый все еще требуется – вы уверены, что не используете его require где-то еще? 01.03.2018
  • @Стефан, ты прав. Я все еще требовал этого в одной из своих спецификаций. Итак, я исправил это, но теперь, когда я делаю require 'linkedin', похоже, требуется драгоценный камень linkedin-oauth2. 02.03.2018
  • @Stefan Я отредактировал вопрос и добавил более подробную информацию о проблеме, которую я вижу. 02.03.2018

Ответы:


1

Я бы не рекомендовал делать это, так как это может иметь некоторые странные побочные эффекты, например, если linkedin-oauth2 ссылается на себя с помощью ::LinkedIn, но метод переопределения константы ruby ​​показан в этот ответ.

Я бы немного изменил его, чтобы предотвратить переименование постоянного предупреждения... Object.send(:remove_const, :Stripe) вместо Stripe = Module.new, как показано в ответе. Итак, пример (не проверенный):

require 'linkedin-oauth2'
LinkedInOauth2 = LinkedIn

Object.send(:remove_const, :LinkedIn)

require 'linkedin'
07.03.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..