首页 > 解决方案 > Ruby - 无法使用本地安装的 gem

问题描述

我已经编写了一个简单的 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/rubysamples/app/password_reset.rb

PasswordGenerator.generate

我收到一个错误

uninitialized constant PasswordGenerator (NameError)

我究竟做错了什么?我错过了什么吗?

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

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

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

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

标签: ruby

解决方案


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

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

其次,您没有正确地将模块包含在 Ruby 文件中。仅仅因为您已将 gem 添加到 Gemfile 并使用 bundler 启动 Ruby 并不意味着 Ruby 进程知道您打算使用该 gem 的模块。它只是使模块可供使用。您可能想知道,“为什么我不必在 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 并使 gem 可用于 Ruby
  3. 在尝试使用模块之前,您的应用需要 gem 中的模块

推荐阅读