我应该如何构建我的ruby gem命令行服务?

时间:2012-03-09 21:11:21

标签: ruby rubygems command-line-interface network-service

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

我已经对用于编写网络服务的最佳方法进行了大量研究,例如ØMQ/ EventMachine,我得到了如何创建一个Ruby gem,它将安装一个可以在命令行中使用的二进制文件,但我正在努力设置一个好的代码结构。

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

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

3 个答案:

答案 0 :(得分:9)

很大程度上,RubyGems会为您解决这个问题。您需要在files列表中包含可执行文件,并将其放入gemspec中的executables。将您的可执行文件放在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并让您的应用运行。某些开发人员通过$:$LOAD_PATH操纵加载路径,但这被视为不良形式。

如果您使用的是捆绑广告,最简单的方法就是使用bundle exec在本地运行您的应用,例如bundle exec bin/myapp。您也可以使用RUBYLIB环境变量,例如RUBYLIB=lib bin/myapp,将lib置于加载路径中。

答案 1 :(得分:4)

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

简言之:

安装Bundler

$ 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

安装宝石

$ rake install

运行您的脚本

$ mycommand
Executing mycommand

在rubygems.org上分享您的实用程序

$ rake release

the website

上的更多文档

答案 2 :(得分:0)

由于所有宝石本质上都是开源的,因此您可以随时查看一些更好的宝石作为示例。使用像jewelerhoe这样的宝石制作工具也可以为您提供一些组织上的基本结构。