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

我对用于编写网络服务的最佳工具(例如 ØMQ/EventMachine)进行了大量研究,并且了解了如何创建 Ruby gem 来安装可以在命令行中使用的二进制文件,但我'我正在努力制定一个好的代码结构。

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

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

有帮助吗?

解决方案

很大程度上,RubyGems 会为您解决这个问题。您需要将可执行文件包含在 files 列表,并将其放入 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 在加载路径中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top