![](/img/trans.png)
[英]How do I compile a C program to use with my ruby gem via the C program's command line interface?
[英]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
由于所有宝石本质上都是开源的,因此您可以随时查看一些更好的宝石。 使用像jeweler
或hoe
这样的宝石建造者也可以让你在组织上讲一些基本结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.