在开发期间运行RubyGem CLI

时间:2014-04-29 13:01:16

标签: ruby rubygems

我正在开始一个需要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

3 个答案:

答案 0 :(得分:2)

通常,当您从gem运行可执行文件时,Rubygems会为您设置LOAD_PATH,以便它包含您的gems的lib目录。显然,当你在开发中运行脚本时,Rubygems没有机会为你设置,所以你需要自己动手。

执行此操作的一种方法是在脚本文件中。例如,HamlRedcarpet宝石执行此操作。在可执行文件顶部附近的某处,您可能会遇到以下情况:

$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'