我该如何为我的Ruby Gem命令行服务进行架构设计?

4
我正在编写一个Ruby宝石,用户可以安装并使用命令行Ruby工具与服务进行交互。您可以启动和停止服务(它将生成子进程)。
我已经进行了很多关于编写网络服务的最佳实践的研究,例如ØMQ / EventMachine,并且知道如何创建一个Ruby宝石,以便在命令行中安装二进制文件,但我在设置良好的代码结构方面遇到了困难。
我的命令行实用程序将采用各种参数(我将使用Trollop),然后使用各种类来完成任务,并使用各种其他Ruby宝石。
我不确定应该把我的类文件放在哪里,以及如何在我的二进制文件中要求它们,以使路径正确。
3个回答

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来操作加载路径,但这被认为是不好的做法。
如果你正在使用bundler,最简单的方法是使用bundle exec在本地运行你的应用程序,例如:bundle exec bin/myapp。你也可以使用RUBYLIB环境变量,例如:RUBYLIB=lib bin/myapp,这将把lib放在加载路径中。

4
你可以使用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

安装你的 Gem。
$ rake install

运行你的脚本

$ mycommand
Executing mycommand

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

$ rake release

更多关于该网站的文档


0

由于所有的 gem 都是开源的,所以您可以随时查看一些更好的 gem 作为示例。使用像 jewelerhoe 这样的 gem 构建工具也会在组织结构方面为您提供一些基本的结构。


3
“源代码可用”可能是一个更好的术语。仅仅因为你可以看到源代码并不意味着它是通常意义下的“开源”软件。 - Andrew Marshall
谢谢,我会看一下的!我白天不是 Ruby 开发人员,所以我很难找到一个好的起点。 - tarnfeld
我的意思更多是“开源”,因为我不知道有哪些是故意混淆的。这就是“开源”和“自由开源”的区别。尽管如此,绝大多数宝石都是以某种形式的开源许可证发布的。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接