【问题标题】:How to create a shell command supporting Ruby?如何创建支持 Ruby 的 shell 命令?
【发布时间】:2012-03-31 09:45:27
【问题描述】:

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

例如:

$ cow moo

将使用带有 cow 命令脚本的牛 gem,并在 Ruby gem 中执行“moo”功能。

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

$ cow -t moo

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

如果有人可以帮助我们,那将是一个很大的帮助。谢谢!

【问题讨论】:

    标签: ruby shell command-line command


    【解决方案1】:

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

    #!/usr/bin/env ruby
    require 'cow'
    
    Cow.say ARGV.first
    

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

    把你的脚本放到bin目录下:

    cow/
      bin/
        cow  <- your executable file
      lib/
        cow.rb
        cow/
          say.rb
      cow.gemspec
    

    现在,您只需将其放入您的 gem 规范中:

    Gem::Specification.new 'cow' do |gem|
      gem.executables = %w(bin/cow)
    end
    

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

    关于选项解析,标准库包含optparse,但也有many gems可用。

    我创建了my own option parser, called 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
    

    为了测试您的应用程序,您可以简单地执行您的脚本:

    $ pwd
    ~/projects/cow
    $ ./bin/cow moo
    # output here...
    

    但是,这要求您在每次要测试更改时根据规范构建 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 通过自动将代码插入加载路径,让生活更轻松。你只需要通过 Bundler 运行你的可执行文件:

    $ bundle exec ./bin/cow moo
    # output here...
    

    【讨论】:

      【解决方案2】:

      使用http://visionmedia.github.com/commander/怎么样?以前从未使用过它。但它是一个让开发命令行应用程序更容易的宝石 :) 为您完成繁重的工作。

      这里还有很多:https://www.ruby-toolbox.com/categories/CLI_Option_Parsers

      【讨论】:

      • 不,正如我所说,我对他们没有经验。但我认为这是可能的。也许检查 gem 的源代码,看看他们如何编写测试来测试框架。
      • @Beakr,您可以构建和安装您的 gem,而无需将其推送到 ruby​​gems,或者只使用 Bundler。详细阅读我的回答。
      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多