我目前正在为Ruby宝石CocoaPods开发一项功能。有一个现有的命令可以接受许多选项。我想添加一个额外的选项,使用户可以通过打开默认文本编辑器来输入自定义消息,当用户保存并退出编辑器时,消息会被提供给执行的命令。
我想复制的是如何将-m
添加到git commit
命令中,以便输入提交消息。我在创建命令行工具方面没有什么经验,所以非常感谢您的帮助。
目标是执行一个特定的命令command --message
,打开编辑器,让用户输入一条自定义消息,并将该自定义消息作为存储在argv
中的参数之一来执行该命令。
常见的工作流程是:
- 调用方应用程序创建临时文件
- 确定默认编辑器(对于基于Debian的编辑器,它将是
/usr/bin/editor
,对于其他linuces——shell变量$EDITOR
的内容,等等) - 在带有
Kernel#system
的子shell中运行shell命令(不带backticks!) - 等待它退出
- 确定退出代码,如果不是
0
,则跳过后面的代码 - 读取在步骤1中创建的临时文件的内容并删除此文件
在ruby中,这就像:
▶ f = Tempfile.new 'cocoapods'
#⇒ #<File:/tmp/am/cocoapods20151120-6901-u2lubx>
-rw------- 1 am am 0 nov 20 15:03 /tmp/am/cocoapods20151120-6901-u2lubx
▶ path = f.path
#⇒ "/tmp/am/cocoapods20151120-6901-u2lubx"
▶ f.puts 'This content is already presented in file'
#⇒ nil
▶ f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE...
#⇒ nil
▶ system "editor #{path}"
#⇒ Vim: Warning: Output is not to a terminal
如果您在控制台中进行测试,只需键入任何内容,然后键入Esc:121。在现实生活中,会有正常的vim
(或者默认编辑器是什么)打开。
▶ File.read path
#⇒ "GGGGGGGGGThis content is already presented in filen"
总之:
#!/usr/bin/env ruby
require 'tempfile'
f = Tempfile.new 'cocoapods'
path = f.path
f.puts 'This content is already presented in file'
f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE...
system "editor #{path}"
puts File.read path