我编写了一个简单的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
当我尝试使用它时
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)
答案 0 :(得分:2)
潜在地有两个问题。第一个是您启动Ruby的方式,第二个是您需要模块的方式。
首先,如果您通过运行ruby password_reset.rb
启动Ruby,那么您将忽略Gemfile
。 Gemfile
仅在使用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
一切正常,因为: