Ruby-无法使用本地安装的gem

时间:2018-10-08 17:08:23

标签: ruby

我编写了一个简单的PasswordGenerator gem,我在~/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 / ruby​​samples / app / password_reset.rb

PasswordGenerator.generate

我遇到错误

uninitialized constant PasswordGenerator (NameError)

我在做什么错?我想念什么吗?

这是我的宝石仓库:https://github.com/jedrekdomanski/password_generator

我还尝试指向我的仓库中的仓库和分支

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

但我收到相同的错误消息uninitialized constant PasswordGenerator (NameError)

1 个答案:

答案 0 :(得分:2)

潜在地有两个问题。第一个是您启动Ruby的方式,第二个是您需要模块的方式。

首先,如果您通过运行ruby password_reset.rb启动Ruby,那么您将忽略GemfileGemfile仅在使用bundler时使用,因此您要确保通过运行bundle exec ruby password_reset.rb启动Ruby。这将使捆绑程序读取您的Gemfile并在该上下文中执行Ruby。

第二,您未正确将模块包含在Ruby文件中。仅仅因为您已将gem添加到Gemfile中并使用bundler启动了Ruby,并不意味着Ruby进程知道您打算使用该gem的模块。它只是使模块可用可用。您可能会想,“为什么我不必在Rails中这样做?”因为Rails does that for you automatically via 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. 您的应用需要使用gem中的模块,然后才能尝试使用该模块