我正在开始一个需要CLI的新项目。
我使用
创建了一个新的RubyGem项目 bundle gem roar
所以我有结构。
要让CLI创建一个'bin'文件夹,并添加一个包含以下内容的'roar'文件。
require 'roar'
test = Test::Talk.new
test.say_hello
我现在想要运行我创建的'roar'bin文件,但如果我运行以下
ruby bin/roar
我收到一条错误,指出ruby无法找到宝石'咆哮'。我假设这是因为我不在'环境'中所以它不知道如何找到我的库。那么如何运行它以便我可以执行我正在编写的脚本呢?
我有一种感觉,我可以创建一个帮助脚本用于IRB,但我无法弄清楚如何做到这一点。感谢任何建议。
(我不是试图绕过测试的需要,我试图绕过CLI,我不想通过安装gem和执行周期。)
非常感谢,
罗素
更新:
根据要求,我的项目布局如下:
├── Gemfile
├── Gemfile.lock
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│ └── roar
├── lib
│ ├── roar
│ │ └── version.rb
│ └── roar.rb
├── roar.gemspec
├── spec
│ ├── roar_spec.rb
│ └── spec_helper.rb
└── tmp
答案 0 :(得分:2)
通常,当您从gem运行可执行文件时,Rubygems会为您设置LOAD_PATH
,以便它包含您的gems的lib目录。显然,当你在开发中运行脚本时,Rubygems没有机会为你设置,所以你需要自己动手。
执行此操作的一种方法是在脚本文件中。例如,Haml和Redcarpet宝石执行此操作。在可执行文件顶部附近的某处,您可能会遇到以下情况:
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
(假设一个相当典型的目录布局)。
另一种方法是,如果要避免在代码中操纵加载路径,可以在命令行中添加lib目录。 -I
命令的ruby
选项允许您执行此操作,因此您可以运行:
$ ruby -Ilib/ bin/roar
来自宝石的顶层。
或者,您可以使用RUBYLIB
环境变量:
$ RUBYLIB=lib ruby bin/roar
或者甚至(如果bin/roar
有一个shebang行并且是可执行的):
$ RUBYLIB=lib ./bin/roar
您甚至可以导出RUBYLIB
,因此您不需要每次都指定它,但如果您这样做,则需要小心保留它。
答案 1 :(得分:0)
你可以分享你的目录树来澄清一些事情吗?我好奇你的lib是什么样的。
但是如果您正在尝试使用自己的宝石,最简单的答案是您需要在您正在制作它的目录中安装宝石。它可能会破坏,因为您无法使用它。需要你自己的宝石没有安装。尝试在顶层roar /的命令行中运行gem install roar
。运行gem install roar
后,只需致电roar
即可。令人讨厌的部分是,如果它在其他地方中断,则每次更改某些内容时都必须重新安装gem。
这里是我刚刚创建的一个简单gem的github页面,它可以帮助你看到正确的布局,https://github.com/TSiege/nytimes-top-story-gem。它的自述文件可能有助于阐明如何使用自己制作的宝石。
答案 2 :(得分:0)
如果您正在开发gem,我建议在Gemfile中使用bundler's:path选项并指向解压缩的库。这将允许您在运行脚本时处理Gem。
我建议将路径直接指向本地解压缩的rubygem库。然后运行bundle install以确保它指向正确的路径。此外,您需要重新加载任何正在运行的进程以从解压缩的gem库中获取更改。
建议通过bundler.io:
gem 'roar', :path => './vendor/extracted_library'