Используйте Pry в драгоценных камнях без изменения Gemfile или используя `require`

Я пытаюсь отладить жемчужину, используемую приложением Rails.

Я клонировал Gem локально, чтобы поглядывать (а также позволяет мне делать приятные вещи, такие как git bisect и т.д.)

# Gemfile
gem "active_admin", path: "~/dev-forks/active_admin"

Тем не менее, я часто застрял в добавлении Pry в Gemfile где-нибудь, чтобы иметь возможность использовать его, или вызывать require "pry" в реальном времени в коде, хотя я не хочу его там. Например, я иногда забуду об этом, исправлю ошибку и затем передам проект с помощью Pry в Gemfile.

Если я этого не сделаю, появится LoadError, cannot load such file -- pry (LoadError).

Мне нужно администрировать. Я немного потерялся между разными контекстами (проект Rails, Gem, локальный Ruby) и фактические драгоценные камни (Gemfile, require, installed).

Как я могу использовать binding.pry в Gem внутри Rails без вмешательства Gemfiles?

Ответ 1

Джон из прошлого! Как вы знаете, у меня есть ответы на почти все ваши проблемы.

В этом случае вы фактически описываете две проблемы: (a) вы не можете require 'pry', когда Pry не находится в Gemfile, (b) вы не можете использовать Pry, если вы не require он.

Что делает Бундлер, как Конрад Ирвин пишет:

Bundler - потрясающий камень, который дает вам хорошую уверенность в том, что "если он работает в разработке, он работает в производстве". Он может сделать это, будучи порочным в отношении зависимостей драгоценных камней: если это не в Gemfile, это не требуется. Это также гарантирует, что каждая среда разработки идентична, больше не работает "на моей машине", сокращая ее как оправдание.

Есть обстоятельства, когда эта догматическая преданность делу может мешать. В частности, все хорошие разработчики настроили свою среду разработки очень лично. Очевидно, что не важно, что мои локальные инструменты работают на производстве, и это положительно плохо для производительности, если каждый вынужден иметь идентичную разработку.

Итак, делая все хорошие вещи, которые Bundler делает для разработчиков Ruby, он приходит по дизайну с предостережением: "то, что вне пакета /Gemfile (например, системные драгоценности) больше не существует". Как это происходит, переопределив процесс require и изменив ваш PATH так, чтобы он только видел, что в пакете.

Это означает, что вы не можете использовать Pry вообще, не загрязняя Gemfile, вы говорите, правильно? Не так быстро. Конрад Ирвин был умным маленьким печеньем, которым он является, придумал решение и сделал Pry Debundle, драгоценный камень, который временно меняет патчи Bundler, сделанные для наши требования.

Итак, все, что вам нужно сделать, это просто require 'pry-debundle', тогда, правильно? О... подождите. Да, Debundle, вероятно, не в Gemfile.

Исправление обезьяны - это скопировать источник pry-debundle.rb в ~/debundle.rb, а затем load. (На данный момент вам понадобится Pry, загруженный для запуска этого исходного файла, но вы можете запустить только метод debundle!, чтобы добраться туда, потребовать Pry и покрутиться. Небольшая парализованная привязка необходима, но я работаю над PR.)

Ответ 2

если вы хотите использовать и отлаживать драгоценный камень в своем приложении rails, тогда он должен быть в группе разработки и тестирования Gemfile в вашем приложении.

вы можете использовать такие инструменты, как pry-debugger https://github.com/nixme/pry-debugger, чтобы установить точки останова в сеансе pry break SomeClass#run.

Я думаю, что это правильно, чтобы добавить pry в каждый проект, который fork исправить ошибку или внести свой вклад. просто не помещайте его в файлы .gemspec.

если вы нажимаете binding.pry на свое репо, вы должны добавить фиксации фиксации, как указал Джим. я не думаю, что это проблема, связанная с pry, она зависит от того, насколько тщательно вы будете относиться к рассмотрению вашего diff, прежде чем выталкивать его.