准备了两年的 Semo,今天正式跟大家见面

1,242 阅读6分钟

每隔一段时间都能看见新的讨论命令行工具的文章,大家都在探索怎么用 Node 开发一个命令行工具,并热情的分享 npm 社区若干优秀的和命令行开发有关的 npm 包。从学习的角度当然也不错,但我一直觉得怎么开发命令行工具不是最重要的,而是开发具体有用的命令行工具才是最重要的。

我在3年前开始从事 Node.js 开发,去了一个不把 Node 当做胶水而是全 Node 后台架构的公司,对于微服务架构来说,那后端的小项目就多了去了,每个项目,甚至一个项目里不同的开发者写的命令行工具(还有一次性脚本和计划任务)可能都是一套自己的设计,我当时想做一个简单易用,侵入小的方案,统一微服务架构下各个项目实现命令,脚本,计划任务等的实现规范。最终形成了 Semo 这个项目,我打算写一系列的文章跟大家分享 Semo 的原理和用法。

至于为什么要藏起来两年多才拿出来,主要是一直觉得做的还不够好,事实上这两年也确实改动很大,最近还在做结构的调整和重大特性的添加。

Semo 是基于 yargs 这个命令行相关的库开发的,当然还有很多其他选择,但是我使用过几个以后,觉得 yargs 最灵活,凡是 yargs 提供的功能用就好了,我的工作是在外围在加一些规范和约束,使得用起来更方便。

说了这么多废话,还是直接给大家看货吧,今天不涉及原理,只是一个简单介绍,如果大家感兴趣可以装装试试,再给点意见和建议。后面会把 Semo 的方方面面好好跟大家说说。

安装

和一些开发框架自带的命令行工具不一样的是,Semo 的命令行工具默认装上以后不会有什么直接的好处,想用的爽还需要安装或者开发自己的插件才可以。

npm i -g @semo/cli
semo help

打印的结果是:

 $ semo help
semo

Commands:
  semo completion                     Generate completion script
  semo config <op>                    Manage rc config                                                    [aliases: cfg]
  semo create <name> [repo] [branch]  Create a new project from specific repo                               [aliases: c]
  semo generate <component>           Generate component sample code                                        [aliases: g]
  semo init                           Init basic config file and directories                                [aliases: i]
  semo repl                           Play with REPL                                              [default] [aliases: r]
  semo run <PLUGIN> [COMMAND...]      Run any plugin command directly
  semo status                         Show environment status info                                         [aliases: st]

Options:
  --version   Show version number                                                                              [boolean]
  --hook      If or not load all plugins repl hook
  --prompt    Prompt for input.                                                                        [default: ">>> "]
  -h, --help  Show help                                                                                        [boolean]

Find more information at https://semo.js.org

运行

$ semo
>>> 

直接输入 semo 敲回车,会跟 Node 一样,进入一个 REPL 环境,表面上这个 REPL 环境只比 Node 的 REPL 环境多了一个 Semo 对象。实际上,这说明我们可以通过某种方式往里面放东西,另外,这个环境里还可以使用 await 运行 Promise 函数。

Hello world

为了给大家留个好的第一印象,我开发了一个 Semo 的 hello world 插件,特别的是,这个插件的体验不需要通过 npm install 来安装

semo run hello-world

首次运行会有下载动作,之后就不会了,是不是感觉有点熟悉(好吧,灵感来自于 Deno 以及 npm init 和 yarn create)

你会看到一个输出:

你好,xxx 同学:

今天是2020年6月13日, 现在是下午1点51分, 祝你今天一天都有好心情!看看下面一句话是否对你有所启发:

智者说:我曾听一位大师说过,诚信是财富,正法是第一坦道,实语是第一妙昧,智慧是第一生命。

是不是很有爱呀,这里的文案模板支持中英文,并且会自动检测系统语言,里面的鸡汤可以换口味的。

# it: IT 语录
# cn: 中文鸡汤
# en: 英文鸡汤
# poison: 中文毒鸡汤
# rule: 各种法则定律
semo run hello-world --inspirationType it

每次运行都需要指定选项太麻烦了,可以把选项给我配置固化下来嘛?当然可以,通过把配置写到全局配置文件即可。

semo config set $plugin.hello-world.inpirationType it -g

配置文件在 ~/.semo/.semorc.yml

关于如何实现这个插件,推荐大家看看插件的源码,等大家学会了 Semo 的扩展方法以后,还可以自定义自己的鸡汤,用这个插件来背单词,被 API 语法也不是梦哦!

插件管理

都说没有插件系统的那啥不是好那啥,我们这里当然要支持插件系统啦,那么都有哪些插件可以用呢?

semo run plugin --remote

这条命令可以告诉你答案,你可以装几个插件玩玩,插件可以装在几个位置

  • 跟 semo 一样装在 npm 的全局环境
  • semo 在 home 目录放了一个目录,目的也是存放全局插件,主要是为了有权限写。
  • 最后在项当前目录,当然就更可以啦。

这里以 home 的全局插件为例,核心提供了一个插件管理命令,不过需要先安装一下:

semo run plugin plugin install --PLUGIN plugin

这样,你就会发现全局已经有了 semo plugin 命令,我们用这个插件真正的把我们的 hello-world 插件装下来吧:

semo plugin install hello-world

这样,你就可以这样运行 hello-world 插件定义的 hello-world 命令了:

semo hello-world

再说说内置命令

有了前面的 hello-world 打基础,现在给大家说说默认安装后内置的几个命令的功能:

semo completion

这个命令用来提供自动补全,把输出粘到 ~/.zshrc 或者 ~/.bashrc 即可。

semo config

这个命令可以用来管理本地和全局的 .semorc.yml 配置。

semo create

这个命令用来创建新项目,给新项目提供模板,支持 Git 仓库地址,或者预置模板:

semo create PROJECT --template

核心预置了两套模板,一个用于开发插件,一个是用于简单的 typescript 项目解构,都是例子,实际是为了告诉大家,大家可以把自己优秀的项目脚手架,starter 给放进来,这样就可以一键使用自己的模板创建项目了。

semo generate

这个命令用来生成代码,核心经常用的是添加新命令时的命令模板代码(支持 js 和 ts)。

semo init

这个命令用于初始化当前目录,为任意 Node 项目初始化Semo 配置文件和所需目录。

semo repl

这是一个 REPL 环境,以后可以用他来帮助我们开发,调试和验证项目逻辑。

semo run

这个命令用于临时运行一个没安装过的插件里的命令(实际还是需要下载,只不过只有 run 命令才会去识别)

semo status

可以看一些环境信息,支持扩展。

小结

今天要跟大家分享的就是这些,还不够详细,只是给大家留一个第一印象,大家可以试试看,由于 semo 的原则是核心保持干净,不提供任何具体的功能,并且扩展起来非常容易,比较适合大家随意发挥,不一定非得用在工作上,这一点从目前我提供的一些插件上就可见一斑了哈。

求点赞,求STAR

仓库地址:github.com/semojs/semo,如果大家喜欢,欢迎大家给个 Star 哈。

技术支持

目前写了一些文档,可能还不是很详细,大家可以先看着: semo.js.org

非常欢迎大家帮我纠错,以及编写自己的插件作品,:)

后面会写一些具体的原理和扩展方法的介绍文章,大家如果真的已经深入到需要自己写扩展时可能会遇到技术问题,可以扫码加钉钉群,大家一起交流哈。