ruby - 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 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
一切正常,因为:
- Ruby 是从 Bundler 开始的
- Bundler 读取您的 Gemfile 并使 gem 可用于 Ruby
- 在尝试使用模块之前,您的应用需要 gem 中的模块
推荐阅读
- html - 输入框值不应超过 100,但它正在使用且不在表单中
- node.js - 从服务器超时发出nodejs请求
- node.js - 在 Visual Studio 中构建 Cordova 项目时出错
- stackdriver - 用于 OracleDB 的 Google Stackdriver 数据库代理?
- c# - 如何在 GetResponse 中检查 HttpStatusCode.OK
- javascript - Safari 调用 decodeAudioData 错误,在 Chrome 工作的地方出现 null
- ios - Apple 说“您的 iOS 分发证书即将到期”我需要做什么
- angular - 添加推送通知的 Ionic 3 问题
- javascript - 在谷歌地图javascript api中的两个特定标记上放置标签
- asp.net-mvc - 从 ZipCode 中检索 Lat Long