Ruby脚本到命令行工具

时间:2014-07-12 23:10:54

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

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

现在我必须进入脚本所在的目录并键入ruby script.rb才能使其正常运行,但我想从目录中创建一个命令,如脚本[option],它应该处理所需的选项。脚本。

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

如何制作此命令行工具?

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

3 个答案:

答案 0 :(得分:2)

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通常被称为" bang line"。 shell将在文件顶部查找此行,以确定哪个应用程序可以读取文件并执行/解释它。 env是一个应用程序,它将查看用户的PATH环境变量,并返回第一个发现为Ruby的Ruby来执行脚本。使用此命令可使脚本在正常的/ usr / bin,/ usr / local / bin中使用Rubies,或者在由rbenv或RVM管理时使用。
  • 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类。

答案 1 :(得分:2)

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

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

另一个是gli,适用于具有多个命令的应用,例如bundler。

如果您想了解更多信息,可以查看有关使用这些宝石的作者创建命令行应用在ruby中构建强大的命令行应用的书籍。

答案 2 :(得分:0)

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

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