中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

Python、Ruby和Golang:命令行應(yīng)用程序比較

發(fā)布于:2021-01-21 09:08:42

0

465

0

python Ruby Golang

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è)

注冊(cè)邏輯如下:

  1. 如果用戶要求--append讀取.[py|ru|go]mr文件(如果存在)。

  2. 將現(xiàn)有標(biāo)記與給定標(biāo)記合并。

  3. 用新標(biāo)記編寫一個(gè)新的.[...]mr文件。

這將分解為我們可以執(zhí)行的幾個(gè)小任務(wù)比較每種語言:

  • 搜索和讀取文件。

  • 合并兩個(gè)項(xiàng)目(只保留唯一的集合)

  • 編寫文件

運(yùn)行(命令執(zhí)行)

運(yùn)行邏輯如下:

  1. 從給定的基本路徑中遞歸地搜索.[...]mr文件

  2. 加載找到的文件,然后查看給定標(biāo)簽是否在其中

  3. 在匹配文件的目錄中調(diào)用給定命令。

這分為幾個(gè)小任務(wù),我們可以用每種語言進(jìn)行比較:

  • 遞歸目錄搜索

  • 字符串比較

  • 調(diào)用Shell命令

最終決定

由于打包和遞歸目錄搜索偏好,我選擇Ruby作為這個(gè)應(yīng)用程序的工具。然而,偏好上的差異非常小,Python也非常適合。然而,Golang并不是這里的正確工具。