快速上手
全局安装
Semo
命令行工具同时也是一个辅助工程师日常开发,运维和调试的命令行工具,建议你在本地环境全局安装,具体的使用说明可以参考这里。
$ npm i -g @semo/cli
$ semo help
semo
Execute a Semo style command file
Commands:
semo Execute a Semo style command file [default]
semo cleanup [type] Cleanup internal caches. [aliases: clean]
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 [aliases: r]
semo run [plugin] Run any plugin command directly
semo status Show environment status info [aliases: st]
semo version Show version number
Options:
-h, --help Show help [boolean]
-v, --version Show version number [boolean]
Examples:
semo run hello-world Run a remote plugin command.
semo run --with project-templates — create PROJECT_NAME -T Clone project template as a starter.
semo repl --require lodash:_ Start Semo repl and inject lodash object to _.
semo generate command test Generate command template.
semo clean all Clean all cache files and installed npm packages.
Find more information at https://semo.js.org
可以看到里面有很多的内置命令,但是,需要注意的是,这些命令都是有使用场景的,在不配合任何插件和具体的业务项目时对大家的帮助不会很大,因为 Semo
核心在开发过程中,主要放在定义扩展规范,具体的业务逻辑需要自己去实现,而只有配合具体的业务逻辑进去才能进一步体现 Semo
的作用和价值。
项目集成
Semo
的主要使用场景就是为一个已经存在的业务项目添加命令行机制,如果没有 Semo
,各个业务项目当然也是可以开发出自己的命令行的,但是这部分基本都属于重复投入,而且不同的团队实现的方案肯定是有差异的,这种差异带来的是维护成本的增加,而企业级开发,降低成本就是提高利润。
cd YOUR_PROJECT
semo init
如果仅仅使用 Semo 的插件调度方式,那么不需要安装 @semo/core
, 如果想要使用 @semo/core
里的方法,则业务项目要将 @semo/core
添加为项目依赖,但是具体放到 devDependencies
还是 dependencies
,需要根据实际情况而定,在业务项目使用 @semo/core
的时候有几种使用模式:
- 业务项目服务核心逻辑依赖
@semo/core
,这种侵入式的,必须添加到dependencies
。 - 业务项目服务核心逻辑不依赖
@semo/core
,但是有使用 @semo/core 来定义命令行或者脚本,而脚本需要在线上执行:这种是非侵入式的,但是由于要在线上执行,也需要添加到dependencies
。 - 业务项目服务核心逻辑不依赖
@semo/core
,也没有使用@semo/core
来定义命令行或脚本,仅仅是用了 REPL 的扩展机制,将项目的公共类和函数放到REPL
环境来协助开发调试,这种也是非侵入的,而且不需要在线上执行,所以可以放到devDependencies
。 - 如果容器环境本身没有安装
Semo
, 也可以在项目依赖中添加@semo/cli
, 然后通过npx semo
来调度。
添加一个项目命令
这里要考虑的是未来项目命令行工具的规划,如果很多,最好划分一下层次,另外,第一层子命令是一些核心命令,如果我们的命令都放到第一层,会容易混淆和误用。
定义一个一级子命令
semo generate command test
semo test # 执行刚刚添加的命令
定义一个二级子命令
npm install semo-plugin-application
semo generate command application/test --extend=application
semo application test
为了让项目命令和核心以及插件定义的命令隔离,这里推荐的是将项目命令用上面第二种方式添加,同时如果是复杂的项目,还可以继续分层次。当然这样造成了一个问题就是命令的层次增加导致的记忆负担,以及要多输入很多前面的命令才能找到要执行的命令。所以一般,我们在项目里还需要为运行环境的 bashrc
增加几个 alias
:
假设线上环境是用 Docker 容器部署的
// Dockerfile
RUN echo 'alias semo="npx semo"' >> /home/node/.bashrc
RUN echo 'alias app="npx semo app"' >> /home/node/.bashrc
这面的命令演示了缩减命令长度的方法,在实际使用过程中,如果命令分层特别深,这里可以多定义一些 alias
。
开发插件
如果不是在项目中使用 Semo
,仅仅是要快速实现一些脚本命令,帮助自己提高工作效率,这时你可以使用 Semo
快速开始。
cd ~/.semo/node_modules # 这个目录下定义的插件会全局加载
semo create semo-plugin-xxx --template=plugin # 选择插件模板
cd semo-plugin-xxx
semo 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
注意,Semo
不保证每个插件定义命令的隔离性,所以如果插件安装的多了,可能会有些命令因重名而相互覆盖,但是日常使用中很少有这种情况发生,为了简单,这里没有做特殊的设计。
安装别人开发的插件
npm i -g @semo/cli semo-plugin-xxx
如果别人的插件仅仅是定义了一些你需要的命令,则你可以把命令安装在全局,如果别人的插件在业务项目中要用,则要放到项目依赖当中。
cd YOUR_PROJECT
npm install semo-plugin-xxx
yarn add semo-plugin-xxx // 或
由于 Semo
的插件同时也是一个 Node
模块,因此,我们也可以在插件中定义一些库函数,被别人在项目中引入
import lib from 'semo-plugin-xxx'
利用 Semo
提供的钩子机制,也可以使用另一种风格来使用插件提供的业务逻辑支持。
import { Utils } from '@semo/core'
const { xxx } = await Utils.invokeHook('semo:component')
可以看到,在后面这种方式中,不需要显示引入包,只需要安装了即可,这种方式是使用的目录扫描的方式,性能是比较差的,而且没有IDE自动提示的支持,但是对命令行这个场景来说,代码风格简单统一也不错。