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

bea*_*akr 2 ruby shell command-line command

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

例如:

$ cow moo
Run Code Online (Sandbox Code Playgroud)

将使用cow命令的脚本获取一个cow gem,并在Ruby gem中执行'moo'功能.

如果可以,我还想支持shell中常见的"选项"格式:

$ cow -t moo
Run Code Online (Sandbox Code Playgroud)

以上示例将采用一个选项并在Ruby中应用脚本来处理它(在此示例-t中将打印'moo'两次).

如果有人能帮助我们,这将是一个很大的帮助.谢谢!

Mat*_*ira 5

您可以创建一个名为contains的常规可执行Ruby文件cow:

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

Cow.say ARGV.first
Run Code Online (Sandbox Code Playgroud)

注意第一行,即shebang行.它告诉你的shell使用哪个程序来解释脚本.这允许用户简单地调用cow而不是ruby $(which cow).

将您的脚本放在bin目录中:

cow/
  bin/
    cow  <- your executable file
  lib/
    cow.rb
    cow/
      say.rb
  cow.gemspec
Run Code Online (Sandbox Code Playgroud)

现在,您需要做的就是将它放在您的gem规范中:

Gem::Specification.new 'cow' do |gem|
  gem.executables = %w(bin/cow)
end
Run Code Online (Sandbox Code Playgroud)

在安装过程中,Rubygems会将gem的二进制文件安装在用户路径的某个位置,以确保找到它们.

至于选项解析,标准库包括optparse,但也有许多可用的宝石.

我创建了自己的选项解析器,称为Acclaim,我在自己的实用程序中使用它.这是一个示例:

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
Run Code Online (Sandbox Code Playgroud)

为了测试您的应用程序,您只需执行您的脚本:

$ pwd
~/projects/cow
$ ./bin/cow moo
# output here...
Run Code Online (Sandbox Code Playgroud)

但是,这需要您从规范构建gem并在每次要测试更改时在本地安装它:

ruby -I ./lib -r cow -e 'puts Cow.version'
0.0.1
gem build cow.gemspec && gem install cow-0.0.1.gem
Run Code Online (Sandbox Code Playgroud)

Bundler通过自动将代码插入加载路径,使生活更轻松.您只需通过Bundler运行您的可执行文件:

$ bundle exec ./bin/cow moo
# output here...
Run Code Online (Sandbox Code Playgroud)