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

tar*_*eld 4 ruby rubygems command-line-interface network-service

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

我已经做了很多关于编写网络服务的最佳方法的研究,比如ØMQ/ EventMachine,我得到了如何创建一个Ruby gem,它将安装一个你可以在命令行中使用的二进制文件,但我'努力建立一个良好的代码结构.

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

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

dav*_*000 9

很大程度上,RubyGems将为您解决这个问题.您需要在files列表中包含可执行文件,并将其放在executablesgemspec中.将可执行文件放在bin目录中是很常见的,例如:

$ ls
bin/   myapp.gemspec  lib/    Rakefile
$ ls bin
bin/myapp
Run Code Online (Sandbox Code Playgroud)

您的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
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env ruby

require 'myapp'
# whatever other requires
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,在开发过程中,您不能只执行bin/myapp并运行您的应用程序.有些开发人员通过$:或操纵负载路径$LOAD_PATH,但这被认为是不好的形式.

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