4

我正在编写一个 ruby​​ gem,用户可以安装它并使用命令行 ruby​​ 工具与服务进行交互。您可以启动和停止服务(它将产生一个子进程)。

我已经对用于编写网络服务的最佳方法(例如 ØMQ/EventMachine)进行了大量研究,并且我了解了如何创建一个 Ruby gem 来安装可以在命令行中使用的二进制文件,但是我m 努力制定一个好的代码结构。

我的命令行实用程序将采用各种参数(我将使用Trollop),它将使用各种类来做事,并使用各种其他 ruby​​ gem。

我不确定我应该把我的类文件放在哪里,以及如何在我的二进制文件中要求它们以便路径正确。

4

3 回答 3

9

大部分情况下,RubyGems 会为您解决这个问题。您需要将您的可执行文件包含在files列表中,并将其放入executables您的 gemspec 中。将您的可执行文件放在bin您的目录中是很常见的,例如:

$ ls
bin/   myapp.gemspec  lib/    Rakefile
$ ls bin
bin/myapp

然后,您的 gemspec 将如下所示:

Gem::Specification.new do |s|
  s.name = 'myapp'

  # whatever else is in your gemspec

  s.files = ["bin/myapp","lib/myapp.rb"]  # or whatever other files you want
  s.executables = ["bin/todo"] 
end

此时,当用户通过 RubyGems 安装您的应用程序时,myapp将在他们的路径中,并将lib在您的应用程序的加载路径中,因此您的可执行文件可以简单地开始:

#!/usr/bin/env ruby

require 'myapp'
# whatever other requires

唯一的问题是,在开发过程中,您不能只做bin/myapp并让您的应用程序运行。$:一些开发人员通过or操作加载路径$LOAD_PATH,但这被认为是错误的形式。

如果您使用的是 bundler,最简单的方法是在本地运行您的应用程序bundle exec,例如bundle exec bin/myapp. 您可以交替使用RUBYLIB环境变量,例如RUBYLIB=lib bin/myapp,它将放入lib加载路径。

于 2012-03-09T23:23:35.767 回答
4

您可以使用Bundler生成 gem 项目结构。

简要地:

安装捆绑器

$ gem install bundler

使用Bundler生成gem项目

$ bundle gem myapp
$ cd myapp

添加可执行文件

$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
  #!/usr/bin/env ruby

  require 'myapp'

  puts "Executing myapp"
  EOSCRIPT
$ chmod +x bin/mycommand

安装您的 Gem

$ rake install

运行你的脚本

$ mycommand
Executing mycommand

在 ruby​​gems.org 上分享您的实用程序

$ rake release

网站上的更多文档

于 2013-04-14T07:37:01.277 回答
0

由于所有 gem 本质上都是开源的,因此您总是可以查看一些更好的示例。从组织上讲,使用类似jewelerhoe这样的 gem builder 也会为您设置一些基本结构。

于 2012-03-09T21:24:27.710 回答