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