关于lerna
,只是使用lerna
发布项目、创建包的命令
关于 monorepo
有三个解决方案
npm link
orfile
yarn workspace
npm workspace
第一个方案,会导致项目整体会特别大,每一个项目的package.json
都会下载一遍
不同项目之间的引用 通过 npm link
和 file
的方式,这种方式只能手动操作
第二个方案
在实践过程中 yarn
对于 package.json
中的 name
属性的值要求特别严格, 对于后期模版项目,name
通过 ejs
动态加载,处理比较麻烦
第一版使用yarn workspace
方案
所以此次重构 使用 npm workspace,踩一下 npm workspace 的坑
使用这种方式�无法删除node_modules
中的依赖包
暂时采用yarn workspace
方案 😂
npm workspace
的使用方式与yarn workspace
类似
根目录下 配置 workspace
目录
"workspaces": [
"./packages/*"
],
安装 package
例如在 @sickle/cli
下安装 axios
,则需要执行命令npm i axios --workspace @sickle/cli
配置 package.json
{
"private": true,
"workspaces": ["workspace-a", "workspace-b"]
}
安装依赖
yarn workspace package名 (add or remove) 依赖名
yarn workspace @sickle/cli add axios
默认 执行add
时会去npm上下载,此时安装的不是当前本地的版本,那么可以通过加版本号来更新本地版本
安装全部依赖
yarn install
如果想要在根目录安装包,需要使用 -W
的方式
yarn add package名 -W
常用命令
- lerna create 包名
- lerna version
- lerna publish
使用lerna create
命令时,可以传入创建package目录地址,默认不写地址,会lerna.json
中的packages
中的第一个作为默认地址
项目分为四个主目录
- commands
- core
- models
- utils
将脚手架所需要的命令逻辑放到commands文件夹下 现在存在的命令有
init
命令
脚手架主要逻辑都放到了core目录下
- cli 脚手架命令执行目录
- exec 动态加载npm包
把有些统一的功能封装成一个models,使用类的方式,来服用这些功能
Package 提供一下几个方法
安装Pakcage的功能主要是通过npminstall来实现
- 获取到最新版本号
- 判断最新版本号对应的路径是否存在
- 不存在安装
- 首先获取package.json所在目录 这里可以使用pkg-dir这个包来查找
- 读取package.json main目录
- 输出目录
在使用Package时需要传入
这个是执行 init 逻辑目录
如果没有安装过 init 命令 那么需要将 init 逻辑 缓存到本地的一个路径下
用于下载 package
用于下载 packageVersion
command类提供一下几个方法
脚手架封装了一下utils方法,放到utils目录下
现在封装的方法有
- get-npm-info 获取npm包信息、版本等
- log 用于打印日志
脚手架最低支持的node版本为v12.0.0
,如果低于这个版本,将会报错
这里处理判断版本采用semver
如果用户使用 root 账号来创建项目,会导致项目开发遇到问题,那么在用户使用root账户创建项目时,要对root账号进行降级,以满足创建的项目可以被修改
在mac环境下,使用process.geteuid()
,普通用户的uid
是501,root用户为0
可以使用root-check
获取用户主目录的主要原因是,后期会对项目和项目模版做缓存,缓存的地址为用户主目录
可以使用Node.js原生方法os.homedir()
会讲一部分信息储存到环境变量中,读取环境变量,使用dotenv来获取
在执行脚手架业务逻辑之前,需要对脚手架的版本进行判断,如果有新版本发布,那么需要提示用户更新脚手架版本
具体流程
- 获取package
- 通过npm api 获取package信息
- 借助semver,将package的version 与npm最新版本比较
- 提示或继续执行后续流程
脚手架命令部分,使用commander
这个包来开发
除了commander
提供的-V
输出版本号、-h
输出帮助信息外,我们自定义了
- -d debug选项,用于debug,这里debug不会有实质的操作,只是用于打印信息用
对于配有配备到的命令,我们采用输出帮助信息的方式做一个提示
init
命令,代码统一在commands/init
目录下
init
命令后面可以跟一个项目名称,例如 init testProject
init
命令,有一个-f, --force
的选项,这个选项主要用处是清空当前命令执行目录文件,可能安装脚手架目录存在其他文件,此时使用-f
,将会强制清楚当前目录
-tp, --targetPath
这个选项用于执行本地代码的路径, 用于调试
项目后端服务