Ruby - невозможно использовать локально установленный гем - PullRequest
0 голосов
/ 08 октября 2018

Я написал простой гем PasswordGenerator, который у меня есть на ~/workspace/gems/password_generator, и у меня есть приложение на ~/workspace/rubysamples/app, где я хочу его использовать.У меня есть Gemfile, его содержание таково:

gem 'password_generator', path: '~/workspace/gems/password_generator'

Я установил его локально, например:

bundle install --local
Resolving dependencies...
Using bundler 1.16.5
Using password_generator 0.1.0 from source at `~/workspace/gems/password_generator`
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

Похоже, он установлен локально:

bundle info password_generator
  * password_generator (0.1.0)
    Summary: Simple password generator
    Homepage: https://github.com/jedrekdomanski/password_generator
    Path: /home/jedrek/workspace/gems/password_generator

Когда я пытаюсь его использовать

~ / workspace / rubysamples / app / password_reset.rb

PasswordGenerator.generate

Я получаю сообщение об ошибке

uninitialized constant PasswordGenerator (NameError)

Что я делаю неправильно?Я что-то упускаю?

Вот мой репозиторий: https://github.com/jedrekdomanski/password_generator

Я также попытался указать на мой репо и ветку в Gemfile

gem 'password_generator', git: 'git@github.com:jedrekdomanski/password_generator.git', branch: 'master'

, но я получилто же сообщение об ошибке uninitialized constant PasswordGenerator (NameError)

1 Ответ

0 голосов
/ 10 октября 2018

Возможны две проблемы.Во-первых, как вы запускаете Ruby, а во-вторых, как вам требуется ваш модуль.

Во-первых, если вы запускаете Ruby с помощью ruby password_reset.rb, тогда вы игнорируете Gemfile.Gemfile используется только тогда, когда вы используете bundler, поэтому вы хотите убедиться, что запускаете Ruby, запустив bundle exec ruby password_reset.rb.Это заставляет компоновщик читать ваш Gemfile и запускать Ruby в этом контексте.

Во-вторых, вы неправильно включили свой модуль в свой файл Ruby.То, что вы добавили гем в свой Gemfile и запустили Ruby с помощью bundler, не означает, что процесс Ruby знает, что вы собираетесь использовать модуль этого гема;он просто делает модуль доступным для использования.Вы можете спросить: «Почему я не должен делать это в Rails?»Поскольку Rails делает это для вас автоматически через config/application.rb.

Учитывая эти две проблемы, правильный способ достижения вашей цели - настроить приложение следующим образом:

Во-первых, создайте Gemfile:

# Gemfile
gem 'password_generator', path: '~/workspace/gems/password_generator'

Во-вторых, создайте файл password_reset.rb:

# password_reset.rb
# Manually require any libraries that this app will use, even if defined in Gemfile
require 'password_generator'
# Call `puts` so something is printed to the console when this app runs
puts PasswordGenerator.generate

В-третьих, запустите bundle install, чтобы убедиться, что ваш Gemfile правильно отформатировани для генерации Gemfile.lock:

⇒  bundle install
Using bundler 1.16.5
Using password_generator 0.1.0 from source at `../../gems/password_generator`
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

В-четвертых, запустите bundle exec ruby password_reset.rb и просмотрите результат:

⇒  bundle exec ruby password_reset.rb
kpiDfyTxtdAsKmYuZqmK

Все работает, потому что:

  1. Ruby запускается с Bundler
  2. Bundler читает ваш Gemfile и делает гем доступным для Ruby
  3. Ваше приложение требует модуль из гема, прежде чем пытаться использовать модуль
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...