我正在编写一个ruby gem,用户可以安装并使用命令行ruby工具与服务进行交互。您可以启动和停止服务(它将产生子进程)。
我已经对用于编写网络服务的最佳方法进行了大量研究,例如ØMQ/ EventMachine,我得到了如何创建一个Ruby gem,它将安装一个可以在命令行中使用的二进制文件,但我正在努力设置一个好的代码结构。
我的命令行实用程序将采用各种参数(我将使用Trollop)并且它将使用各种类来执行操作,并使用各种其他ruby gem。
我不确定我应该在哪里放置我的类文件,以及如何在我的二进制文件中要求它们以便路径正确。
答案 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
上的更多文档
答案 2 :(得分:0)
由于所有宝石本质上都是开源的,因此您可以随时查看一些更好的宝石作为示例。使用像jeweler
或hoe
这样的宝石制作工具也可以为您提供一些组织上的基本结构。