Python、Ruby和Golang:命令行应用程序比较

python Ruby Golang
2021-01-21 09:08:42
103 8 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",
           },
       },
   },
}

注册

注册逻辑如下:

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

  2. 将现有标记与给定标记合并。

  3. 用新标记编写一个新的.[...]mr文件。

这将分解为我们可以执行的几个小任务比较每种语言:

  • 搜索和读取文件。

  • 合并两个项目(只保留唯一的集合)

  • 编写文件

运行(命令执行)

运行逻辑如下:

  1. 从给定的基本路径中递归地搜索.[...]mr文件

  2. 加载找到的文件,然后查看给定标签是否在其中

  3. 在匹配文件的目录中调用给定命令。

这分为几个小任务,我们可以用每种语言进行比较:

  • 递归目录搜索

  • 字符串比较

  • 调用Shell命令

最终决定

由于打包和递归目录搜索偏好,我选择Ruby作为这个应用程序的工具。然而,偏好上的差异非常小,Python也非常适合。然而,Golang并不是这里的正确工具。


作者介绍

用微信扫一扫

收藏