繁体   English   中英

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

[英]How should I structure my ruby gem command line service?

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

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

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

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

很大程度上,RubyGems将为您解决这个问题。 您需要将可执行files包含在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操纵加载路径,但这被认为是不好的形式。

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

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

简述:

安装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

网站更多文档

由于所有宝石本质上都是开源的,因此您可以随时查看一些更好的宝石。 使用像jewelerhoe这样的宝石建造者也可以让你在组织上讲一些基本结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM