# 快速上手
# 全局安装
Zignis
命令行工具同时也是一个辅助工程师日常开发,运维和调试的命令行工具,建议你在本地环境全局安装,具体的使用说明可以参考这里。
$ npm i -g zignis
$ zignis help
zignis [命令]
命令:
zignis application Application command namespace. [aliases: app]
zignis hook Show hook info
zignis init Init basic config file and directories [aliases: i]
zignis make <component> Generate component sample code [aliases: generate, g]
zignis new <name> [repo] [branch] Create a new project from specific repo [aliases: n]
zignis repl Play with REPL [aliases: r]
zignis script [file] Execute a script [aliases: scr]
zignis shell Quick shell [aliases: sh]
zignis status Show environment status info [aliases: st]
zignis completion Generate completion script
选项:
--version 显示版本号 [布尔]
-h, --help 显示帮助信息 [布尔]
Find more information at https://zignis.js.org
可以看到里面有很多的内置命令,但是,需要注意的是,这些命令都是有使用场景的,在不配合任何插件和具体的业务项目时对大家的帮助不会很大,因为 Zignis
核心在开发过程中,主要放在定义扩展规范,具体的业务逻辑需要自己去实现,而只有配合具体的业务逻辑进去才能进一步体现 Zignis
的作用和价值。
# 项目集成
Zignis
的主要使用场景就是为一个已经存在的业务项目添加命令行机制,如果没有 Zignis
,各个业务项目当然也是可以开发出自己的命令行的,但是这部分基本都属于重复投入,而且不同的团队实现的方案肯定是有差异的,这种差异带来的是维护成本的增加,而企业级开发,降低成本就是提高利润。
cd YOUR_PROJECT
npm install zignis
zignis init
业务项目集成 Zignis 必须要将 Zignis
添加为项目依赖,但是具体放到 devDependencies
还是 dependencies
,需要根据实际情况而定,在业务项目使用 Zignis
的时候有几种使用模式:
- 业务项目服务核心逻辑依赖
Zignis
,这种侵入式的,必须添加到dependencies
。 - 业务项目服务核心逻辑不依赖
Zignis
,但是有使用 Zignis 来定义命令行或者脚本,而脚本需要在线上执行:这种是非侵入式的,但是由于要在线上执行,也需要添加到dependencies
。 - 业务项目服务核心逻辑不依赖
Zignis
,也没有使用Zignis
来定义命令行或脚本,仅仅是用了 REPL 的扩展机制,将项目的公共类和函数放到REPL
环境来协助开发调试,这种也是非侵入的,而且不需要在线上执行,所以可以放到devDependencies
。
# 添加一个项目命令
这里要考虑的是未来项目命令行工具的规划,如果很多,最好划分一下层次,另外,第一层子命令是一些核心命令,如果我们的命令都放到第一层,会容易混淆和误用。
定义一个一级子命令
zignis make command test
zignis test # 执行刚刚添加的命令
定义一个二级子命令
zignis make command application/test --extend=zignis
zignis application test
为了让项目命令和核心以及插件定义的命令隔离,这里推荐的是将项目命令用上面第二种方式添加,同时如果是复杂的项目,还可以继续分层次。当然这样造成了一个问题就是命令的层次增加导致的记忆负担,以及要多输入很多前面的命令才能找到要执行的命令。所以一般,我们在项目里还需要为运行环境的 bashrc
增加几个 alias
:
假设线上环境是用 Docker 容器部署的
// Dockerfile
RUN echo 'alias zignis="npx zignis"' >> /home/node/.bashrc
RUN echo 'alias app="npx zignis app"' >> /home/node/.bashrc
这面的命令演示了缩减命令长度的方法,在实际使用过程中,如果命令分层特别深,这里可以多定义一些 alias
。
# 开发插件
如果不是在项目中使用 Zignis
,仅仅是要快速实现一些脚本命令,帮助自己提高工作效率,这时你可以使用 Zignis
快速开始。
cd ~/.zignis/node_modules # 这个目录下定义的插件会全局加载
zignis new zignis-plugin-xxx --select=plugin # 选择插件模板
cd zignis-plugin-xxx
zignis hi # # 默认里面有一个示例命令
code . # 用 Vscode 开始开发
yarn watch # 基于 `Typescript` 开发,需要实时编译
如果你对插件很满意,想和其他人分享,你直接将你的代码发布到 npm
。
git remove add origin GIT_REPO_URL
git add .
git commit -m 'init'
npm login
npm version patch && npm publish
WARNING
注意,Zignis
不保证每个插件定义命令的隔离性,所以如果插件安装的多了,可能会有些命令因重名而相互覆盖,但是日常使用中很少有这种情况发生,为了简单,这里没有做特殊的设计。
# 安装别人开发的插件
如果打开 package.json,你会发现在插件模板里,zignis
放在了 peerDependencies
,也就是所有的插件如果要生效,需要和 zignis
一起安装。
npm i -g zignis zignis-plugin-xxx
如果别人的插件仅仅是定义了一些你需要的命令,则你可以把命令安装在全局,如果别人的插件在业务项目中要用,则要放到项目依赖当中。
cd YOUR_PROJECT
npm install zignis-plugin-xxx
yarn add zignis-plugin-xxx // 或
由于 Zignis
的插件同时也是一个 Node
模块,因此,我们也可以在插件中定义一些库函数,被别人在项目中引入
import lib from 'zignis-plugin-xxx'
利用 Zignis
提供的钩子机制,也可以使用另一种风格来使用插件提供的业务逻辑支持。
import { Utils } from 'zignis'
const { xxx } = await Utils.invokeHook('components')
可以看到,在后面这种方式中,不需要显示引入包,只需要安装了即可,这种方式是使用的目录扫描的方式,性能是比较差的,而且没有IDE自动提示的支持,但是对命令行这个场景来说,代码风格简单统一也不错。