发布于:2021-01-21 09:08:42
0
428
0
2014年末,我构建了一个名为pymr的工具。最近我觉得有必要学习golang并更新我的ruby知识,所以我决定重新考虑pymr的概念并用多种语言构建它。在这篇文章中,我将分解“mr”(merr)应用程序(pymr、gomr、rumr),并介绍每种语言的具体实现。最后,我将提供一个总体的个人偏好,但将由您来比较各个作品。
应用程序结构
此应用程序的基本思想是,您有一组相关的目录,希望在这些目录上执行单个命令。“mr”工具提供了注册目录的方法,以及在已注册目录组上运行命令的方法。该应用程序具有以下组件:
命令行界面
注册命令(用给定的标记写入文件)
运行命令(在已注册的目录上运行给定的命令)
用于“mr”工具的命令行界面是:
$ pymr --help
Usage: pymr [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
register register a directory
run run a given command in matching...
要比较构建命令行界面,让我们看一下每种语言的register命令。
Python(pymr)
要用Python构建命令行界面,我选择使用Python点击包。
@pymr.command()
@click.option('--directory', '-d', default='./')
@click.option('--tag', '-t', multiple=True)
@click.option('--append', is_flag=True)
def register(directory, tag, append):
...
Ruby(rumr)
在Ruby中构建命令行界面我选择使用thor gem。
desc 'register', 'Register a directory'
method_option :directory,
aliases: '-d',
type: :string,
default: './',
desc: 'Directory to register'
method_option :tag,
aliases: '-t',
type: :array,
default: 'default',
desc: 'Tag/s to register'
method_option :append,
type: :boolean,
desc: 'Append given tags to any existing tags?'
def register
...
Golang(gomr)
在Golang中构建命令行界面我选择使用命令行包装。
app.Commands = []cli.Command{
{
Name: "register",
Usage: "register a directory",
Action: register,
Flags: []cli.Flag{
cli.StringFlag{
Name: "directory, d",
Value: "./",
Usage: "directory to tag",
},
cli.StringFlag{
Name: "tag, t",
Value: "default",
Usage: "tag to add for directory",
},
cli.BoolFlag{
Name: "append",
Usage: "append the tag to an existing registered directory",
},
},
},
}
注册逻辑如下:
如果用户要求--append
读取.[py|ru|go]mr
文件(如果存在)。
将现有标记与给定标记合并。
用新标记编写一个新的.[...]mr
文件。
这将分解为我们可以执行的几个小任务比较每种语言:
搜索和读取文件。
合并两个项目(只保留唯一的集合)
编写文件
运行(命令执行)
运行逻辑如下:
从给定的基本路径中递归地搜索.[...]mr文件
加载找到的文件,然后查看给定标签是否在其中
在匹配文件的目录中调用给定命令。
这分为几个小任务,我们可以用每种语言进行比较:
递归目录搜索
字符串比较
调用Shell命令
最终决定
由于打包和递归目录搜索偏好,我选择Ruby作为这个应用程序的工具。然而,偏好上的差异非常小,Python也非常适合。然而,Golang并不是这里的正确工具。
作者介绍