發(fā)布于:2021-01-21 09:08:42
0
465
0
2014年末,我構(gòu)建了一個(gè)名為pymr的工具。最近我覺得有必要學(xué)習(xí)golang并更新我的ruby知識(shí),所以我決定重新考慮pymr的概念并用多種語言構(gòu)建它。在這篇文章中,我將分解“mr”(merr)應(yīng)用程序(pymr、gomr、rumr),并介紹每種語言的具體實(shí)現(xiàn)。最后,我將提供一個(gè)總體的個(gè)人偏好,但將由您來比較各個(gè)作品。
應(yīng)用程序結(jié)構(gòu)
此應(yīng)用程序的基本思想是,您有一組相關(guān)的目錄,希望在這些目錄上執(zhí)行單個(gè)命令?!癿r”工具提供了注冊(cè)目錄的方法,以及在已注冊(cè)目錄組上運(yùn)行命令的方法。該應(yīng)用程序具有以下組件:
命令行界面
注冊(cè)命令(用給定的標(biāo)記寫入文件)
運(yùn)行命令(在已注冊(cè)的目錄上運(yùn)行給定的命令)
用于“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...
要比較構(gòu)建命令行界面,讓我們看一下每種語言的register命令。
Python(pymr)
要用Python構(gòu)建命令行界面,我選擇使用Python點(diǎn)擊包。
@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中構(gòu)建命令行界面我選擇使用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中構(gòu)建命令行界面我選擇使用命令行包裝。
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",
},
},
},
}
注冊(cè)邏輯如下:
如果用戶要求--append
讀取.[py|ru|go]mr
文件(如果存在)。
將現(xiàn)有標(biāo)記與給定標(biāo)記合并。
用新標(biāo)記編寫一個(gè)新的.[...]mr
文件。
這將分解為我們可以執(zhí)行的幾個(gè)小任務(wù)比較每種語言:
搜索和讀取文件。
合并兩個(gè)項(xiàng)目(只保留唯一的集合)
編寫文件
運(yùn)行(命令執(zhí)行)
運(yùn)行邏輯如下:
從給定的基本路徑中遞歸地搜索.[...]mr文件
加載找到的文件,然后查看給定標(biāo)簽是否在其中
在匹配文件的目錄中調(diào)用給定命令。
這分為幾個(gè)小任務(wù),我們可以用每種語言進(jìn)行比較:
遞歸目錄搜索
字符串比較
調(diào)用Shell命令
最終決定
由于打包和遞歸目錄搜索偏好,我選擇Ruby作為這個(gè)應(yīng)用程序的工具。然而,偏好上的差異非常小,Python也非常適合。然而,Golang并不是這里的正確工具。
作者介紹
熱門博客推薦