如何创建支持Ruby的shell命令?

如何创建支持Ruby的shell命令?,ruby,shell,command-line,command,Ruby,Shell,Command Line,Command,我正在创建一个gem,在其中我希望能够生成一个shell命令来执行gem中的函数。在一个更简单的上下文中,我需要创建一个shell脚本,当shell命令被触发时,该脚本将执行带有选项的Ruby函数。最简单的方法是什么 例如: $ cow moo 将使用cow命令的脚本获取cow gem,并在Ruby gem中执行“moo”函数 如果可以,我还希望在shell中支持常见的“选项”格式: $ cow -t moo 上面的示例将采用一个选项并应用Ruby中的脚本来处理它(在本例中,-t将打印两次“

我正在创建一个gem,在其中我希望能够生成一个shell命令来执行gem中的函数。在一个更简单的上下文中,我需要创建一个shell脚本,当shell命令被触发时,该脚本将执行带有选项的Ruby函数。最简单的方法是什么

例如:

$ cow moo
将使用cow命令的脚本获取cow gem,并在Ruby gem中执行“moo”函数

如果可以,我还希望在shell中支持常见的“选项”格式:

$ cow -t moo
上面的示例将采用一个选项并应用Ruby中的脚本来处理它(在本例中,
-t
将打印两次“moo”)


如果有人能在这方面帮助我们,那将是一个很大的帮助。谢谢

您可以创建一个名为
cow
的常规可执行Ruby文件,其中包含:

#!/usr/bin/env ruby
require 'cow'

Cow.say ARGV.first
请注意第一行,即。它告诉shell要使用哪个程序来解释脚本。这允许用户简单地调用
cow
,而不是
ruby$(哪个cow)

将脚本放入
bin
目录:

cow/
  bin/
    cow  <- your executable file
  lib/
    cow.rb
    cow/
      say.rb
  cow.gemspec
在安装过程中,Rubygems将在用户路径的某个位置安装gem的二进制文件,确保可以找到它们

至于选项解析,标准库包括,但也有可用的

我创建了,我在自己的实用程序中使用它。以下是一个示例:

class Cow::Command < Acclaim::Command
  option :all_caps, '-A', '--all-caps'

  when_called do |options, args|
    text = args.first.to_s
    text.upcase! if options.all_caps?
    Cow.say text
  end
end
但是,这要求您根据规范构建gem,并在每次测试更改时在本地安装:

ruby -I ./lib -r cow -e 'puts Cow.version'
0.0.1
gem build cow.gemspec && gem install cow-0.0.1.gem
通过将代码自动插入加载路径,使工作更轻松。您只需通过Bundler运行可执行文件:

$ bundle exec ./bin/cow moo
# output here...
使用如何?以前从未用过。但它是一块宝石,可以让开发命令行应用程序变得更容易:)为您带来繁重的负担


这里还有很多:

没有,正如我所说的,我对他们没有经验。但我认为这是可能的。也许可以检查gem的源代码,看看他们是如何编写测试来测试框架的。@biker,您可以构建和安装gem,而无需将其推送到rubygems,或者只需使用Bundler。详细阅读我的答案。
ruby -I ./lib -r cow -e 'puts Cow.version'
0.0.1
gem build cow.gemspec && gem install cow-0.0.1.gem
$ bundle exec ./bin/cow moo
# output here...