Ruby 如何用 Ruby 开发命令行工具呢?

maxchen · 2018年09月20日 · 最后由 msg7086 回复于 2018年09月25日 · 5409 次阅读

想开发一个命令行工具

在使用 Ruby 的过程中我们发现很多实用的命令行工具,比如 rails new abc 会新建一个 rails 项目;gem install mina 会按照名为 mina 的 gem;mina deploy 会自动部署 rails 项目。

我想开发一个命令行工具,比如 max file.txt 可以获得 file.txt 文件中的最大的数字。

OK,下面是我的几个问题:

  1. 能用纯 Ruby 语言开发这样的命令行工具吗?一定需要 c 写扩展吗?如果不一定需要 c 写扩展是否要引入什么标准库吗?
  2. 我注意到 mina 命令行工具用到了 rake,但是 gem 命令行工具似乎没用用到 rake
  3. 有谁可以推荐下类似的教程吗?

其实我的问题很简单,就是一个编写命令行工具的一个接口如何实现呢?

  1. 可以开发命令行工具,和 C 没什么关系,除非你的功能依赖了 C 的库
  2. 和 rake 也没什么关系
  3. 这个教程其实就是如何建立 gem 的教程。https://guides.rubygems.org/make-your-own-gem/
happybai #1 回复

不是,我想问的不是如何建立 gem,是如何开发一个命令行工具

#!/usr/bin/env ruby                                                                        
# max.rb 文件内容
fn=ARGV[0]
puts "file: #{fn} "
n=open(ARGV[0]).read.scan(/[\.\d]+/im).map{|x| x.to_f}.sort[-1]
puts "max val is: #{n} "

编辑 max.rb,把 max.rb 复制到操作系统的 PATH 目录,文件名改为 max, 后缀去掉,就可以用命令行执行 max . 其实 gem 也是一个 ruby 脚本:

type gem
gem 已被录入哈希表 (/usr/bin/gem)
kkar4 -bash   kk /tmp/RDP  15:51:05 
▶ file /usr/bin/gem
/usr/bin/gem: Ruby script, ASCII text executable
kkar4 -bash   kk /tmp/RDP  15:51:09 
▶ head /usr/bin/gem
#!/usr/bin/env ruby
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require 'rubygems'
require 'rubygems/gem_runner'
require 'rubygems/exceptions'chmod +x max.rb
kkar4 -bash   kk /tmp/RDP  15:59:31 
▶ cp max.rb max
kkar4 -bash   kk /tmp/RDP  15:59:34 
▶ PATH=$PATH:`pwd`
kkar4 -bash   kk /tmp/RDP  15:59:59 
▶ max file.txt 
file: file.txt 
max val is: 9999999999999999 

maxchen #2 回复

但你举得例子,rails, mina, rake 这都是 gem。在 gem 里,配置 executables 就可以命令行执行了。 https://guides.rubygems.org/specification-reference/#executables

默认可能会生成像这样 spec.executables = spec.files.grep(%r{^bin/*}) { |f| File.basename(f) } ,也就是说,你写到 bin 目录下的文件就可以执行了

sevk #3 回复

就是要手动复制到操作系统的 PATH 路径?gem 不是放在了 ruby 的 bin 目录下吗?

“魔法”只有两点:

  1. 在 rb 文件前加#!/usr/bin/env ruby
  2. `ln -s your_cli.rb your_cli

然后把你的文件路径加入终端的 PATH 中,或者复制到可执行的路径下面,如~/.bin 或者/usr/local/bin

DONE

在 windows 系统下还需要给批处理文件?

任何语言都可以用来写命令行工具;Ruby 当然也可以;编译型语言的命令行一般是可执行的二进制文件;Shell、Perl、Python、Ruby 等语言基本就是可执行的脚本文件了。

Rails 的命令多是使用 Thor 这个 gem 实现的:https://github.com/erikhuda/thor。具体可以看它的 wiki。

至于手动写一个带有可执行命令的 gem,可以见 https://guides.rubygems.org/make-your-own-gem/#adding-an-executable。可以参考的例子非常多,比如这个:https://github.com/beijingrb/mdopen

如果只是运行一个脚本,不管什么系统,关键是把脚本路径加到 PATH 环境里。对于 Windows 应该要让执行程序和脚本扩展名做好关联,否则就得用 ruby + 脚本名称 的方式来运行。

gingerhot #10 回复

👏 明白了 解释得很清楚 谢谢了😊

头上加 shebang,权限开执行,放进 PATH 目录里,就可以跑了。这和所有的脚本语言是一样的。

C:\Users\Administrator>where gem
e:\Ruby23\bin\gem.cmd
e:\Ruby23\bin\gem
e:\Ruby23\bin\gem.bat


C:\Users\Administrator>head e:\Ruby23\bin\gem.bat
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe" "e:/Ruby23/bin/gem" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"ruby.exe" "%~dpn0" %*


C:\Users\Administrator>head e:\Ruby23\bin\pry.bat
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"e:\Ruby23\bin\ruby.exe" "e:/Ruby23/bin/pry" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"e:\Ruby23\bin\ruby.exe" "%~dpn0" %*

这 2 个 bat 文件内容差不多

msg7086 #12 回复

权限开执行是什么意思?

sevk #13 回复

在 windows 除了加入 PATH 路径外,这个文件也是必须的吧?

gingerhot #10 回复

“对于 Windows 应该要让执行程序和脚本扩展名做好关联”是不是指还要编写一个.bat 文件?

rocLv #8 回复

如果在 windows 下应该还要写个.bat 文件吧?

maxchen #17 回复

这个只在 *nix系统下有效,windows 下可以试试这个rb2exe

已经不用 windows 很多年了。。。

其实就是一系列脚本

maxchen #15 回复

是的,windows 下面要有后缀才能打命令。

maxchen #14 回复

chmod +x

如果你说的是 Windows 的话,是的需要用 bat 或者 cmd 写一个引导文件。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号