【问题标题】:Ruby Script to Command Line ToolRuby 脚本到命令行工具
【发布时间】:2014-07-12 23:10:53
【问题描述】:

我正在尝试制作一个命令行工具。我已经有一个 ruby​​ 脚本(一个文件)。但我想将其投影为普通的命令行命令。

现在我必须进入脚本所在的目录并键入 ruby​​ script.rb 以使其运行,但我想从目录中发出诸如 script [option] 之类的命令,它应该处理脚本。

我需要为此制作一个独立的红宝石吗?我读过一些像雷神和指挥官这样的宝石,但我无法正确使用它们。

如何制作这个命令行工具?

PS:一个例子可以是 twitter gem 和一个命令行工具 't',它也是一个 gem。

【问题讨论】:

  • 您为什么不向我们展示您的代码的最小示例。这将使我们更容易向您展示它是如何工作的,而不是期望我们猜测您做了什么。 Ruby 是一种通用的编程语言,这使得编写 CLI 脚本变得非常容易。

标签: ruby ruby-on-rails-4 terminal thor command-line-tool


【解决方案1】:

Ruby,因为它是一种通用编程语言,所以很容易创建命令行脚本。这是您可以构建的基本脚本:

#!/usr/bin/env ruby

require 'optparse'

args = {}
OptionParser.new do |opt|
  opt.on('-i', '--input FILE', 'File to read') { |o| args[:file_in] = o }
  opt.on('-o', '--output FILE', 'File to write') { |o| args[:file_out] = o }
end.parse!

abort "Missing input or output file" unless (args[:file_in] && args[:file_out])

File.write(args[:file_out], File.read(args[:file_in]))

这是发生了什么:

  • #!/usr/bin/env ruby 通常被称为“爆炸线”。 shell 将在文件顶部查找这一行,以确定哪个应用程序可以读取文件并执行/解释它。 env 是一个应用程序,它将查看用户的 PATH 环境变量并返回找到的第一个 Ruby 作为执行脚本的 Ruby。使用它可以使脚本在正常的 /usr/bin、/usr/local/bin 或由 rbenv 或 RVM 管理时与 Rubies 一起工作。
  • require 'opt parse' 引入了 Ruby 的命令行解析器类 OptionParser,这使得设置传统标志(如 -i path/to/file/to/read-o path/to/file/to/write)或长参数(如 --input--output)变得容易。它还自动提供-h--help 标志以返回脚本的格式化帮助文本。 OptionParser 有点像学习曲线,所以使用complete example,你会弄明白的。

其余的应该是不言自明的。

传统上,系统安装的可执行文件位于/usr/bin。我们编写或添加的可执行文件进入/usr/local/bin,我强烈建议坚持使用。

某些操作系统不会自动在 PATH 中为 /usr/local/bin 提供条目,因此您可能需要修改 ~/.bashrc、~/.bash_profile 或 ~/.profile 中的 PATH 设置以允许shell 来定位脚本。

可执行脚本需要设置其可执行标志:chmod +x /path/to/executable 是基本命令。请参阅man chmod 了解更多信息。

我倾向于保留脚本的扩展名; Ruby 脚本是“foo.rb”,Python 是“bar.py”,等等。我这样做是因为我更喜欢将该扩展名作为其编写语言的提示,但 YMMV。扩展不是必需的,所以选择适合你的。

除此之外,您可能还想提供日志输出,或输出到系统的 syslog。在第一种情况下使用 Ruby 的内置 Logger 类,或者在第二种情况下使用 Syslog 类。

【讨论】:

    【解决方案2】:

    实际上,Ruby 中有两个很棒的命令行应用程序。

    首先是methadone,用于更简单的命令行应用程序。

    另一个是gli,适用于具有多个命令的应用程序,例如捆绑程序。

    如果您想了解更多信息,可以查看这些 gems 的作者关于创建命令行应用程序在 ruby​​ 中构建出色的命令行应用程序的书。

    【讨论】:

      【解决方案3】:

      你不需要把它变成宝石,以下就足够了:

      • 将其名称从 script.rb 更改为 script
      • 添加#!/usr/bin/env ruby作为script的第一行
      • 把它放在 PATH 中的某个地方(例如$HOME/bin,确保它在 PATH 中),或者通过明确给出路径来执行,例如$HOME/myscriptdir/script

      【讨论】:

      • 不必通过删除扩展名来更改脚本的名称。扩展与脚本是否在命令行下工作无关。
      • @theTinMan:当然。但它必须以script.rb 的形式调用,而不是像OP 所写的script
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      相关资源
      最近更新 更多