我应该如何构建我的 ruby gem 命令行服务?
-
10-12-2019 - |
题
我正在编写一个 ruby gem,用户可以安装它并使用命令行 ruby 工具与服务交互。您可以启动和停止该服务(它将生成一个子进程)。
我对用于编写网络服务的最佳工具(例如 ØMQ/EventMachine)进行了大量研究,并且了解了如何创建 Ruby gem 来安装可以在命令行中使用的二进制文件,但我'我正在努力制定一个好的代码结构。
我的命令行实用程序将采用各种参数(我将使用 特罗洛普)并且它将使用各种类来执行操作,并使用各种其他 ruby gem。
我不确定应该将类文件放在哪里,以及如何在二进制文件中要求它们,以便路径正确。
解决方案
很大程度上,RubyGems 会为您解决这个问题。您需要将可执行文件包含在 files
列表,并将其放入 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
在加载路径中。
其他提示
因为所有宝石都是自然的开源,你可以始终看看一些更好的例子。使用像gemanodicetagcode或jeweler
等宝石生成器也将您与一些基本结构组织语言的结构设置。