Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何构造我的RubyGem命令行服务?_Ruby_Rubygems_Command Line Interface_Network Service - Fatal编程技术网

我应该如何构造我的RubyGem命令行服务?

我应该如何构造我的RubyGem命令行服务?,ruby,rubygems,command-line-interface,network-service,Ruby,Rubygems,Command Line Interface,Network Service,我正在编写一个RubyGem,用户可以安装并使用命令行ruby工具与服务交互。您可以启动和停止服务(它将派生出一个子进程) 我已经对编写网络服务的最佳方法做了大量研究,例如ØMQ/EventMachine,我了解了如何创建一个Ruby gem,它将安装一个可以在命令行中使用的二进制文件,但我正在努力设置一个好的代码结构 我的命令行实用程序将采用各种参数(我将使用),它将使用各种类来执行操作,并使用各种其他ruby gems 我不确定我应该把我的类文件放在哪里,以及如何在二进制文件中要求它们,以便

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

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

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


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

因为所有gem本质上都是开源的,所以你可以看看一些更好的例子。使用像
jeweler
hoe
这样的宝石制造者也会为你建立一些基本的组织结构。

大体上,RubyGems会为你解决这个问题。您需要将可执行文件包括在
文件
列表中,并将其放入gempec中的
可执行文件
。将可执行文件放入目录中的
bin
是很常见的,例如:

$ ls
bin/   myapp.gemspec  lib/    Rakefile
$ ls bin
bin/myapp
然后,您的gempec将看起来像:

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\u path
操纵加载路径,但这被认为是不好的形式


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

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

简而言之:

安装捆绑程序

$ gem install bundler
使用Bundler生成gem项目

$ bundle gem myapp
$ cd myapp
$ mycommand
Executing mycommand
添加可执行文件

$ mkdir bin
$ cat > bin/mycommand << EOSCRIPT
  #!/usr/bin/env ruby

  require 'myapp'

  puts "Executing myapp"
  EOSCRIPT
$ chmod +x bin/mycommand
运行脚本

$ bundle gem myapp
$ cd myapp
$ mycommand
Executing mycommand
在rubygems.org上共享您的实用程序

$ rake release

更多关于

的文档,“源代码可用”可能是一个更好的术语。仅仅因为你能看到源代码并不意味着它是通常意义上的“开源”软件。谢谢,我来看看这些!我现在还不是一个ruby开发者,所以我正在努力找到一个好的立足点。我指的是更多的“开源”,比如,我不知道有哪个是故意混淆的。这就是“开源”和“免费开源”的不同之处。尽管如此,绝大多数gem都是通过某种开源许可证发布的。