基于lerna搭建脚手架框架
learn项目步骤
一、脚手架项目初始化
主要包含:
初始化
npm
项目 安装
lerna
lerna init
初始化项目
-
创建文件夹
yh-imooc-clic-dev
,并npm init -y
初始化 -
安装
lerna
,这是一个开发依赖npm i -D lerna
-
(可选)建议全局也装一个
lerna
npm i -g lerna
-
lerna初始化
lerna init
package.json
变为:{ "packages": [ "packages/*" //所有的子包都会放置在这个packages下 ], "version": "1.0.0" }
packages
目录:所有的子包都会放置在这个packages下version
目录:版本号初始为0.0.0
,应该修改为1.0.0
得到的目录结构为:
-node_modules/ -packages/ #所有的子包都会放置在这个packages下 -lerna.json -package.json
二、创建package
主要包含:
lerna create
创建Package
lerna add
安装依赖
lerna link
链接依赖
-
创建两个package
创建两个package:core和utils,其中core主要包含脚手架的bin文件,utils主要是工具类项目
-
lerna create
创建lerna管理的包
- 使用方法:
lerna create <name> [loc] Positionals: name pacakge的名称 必选 loc package的安装路径 可选
-
项目中:
lerna create core #会自动在package目录下创建core子包 # 这时候会让你填写package name package name: (core) @yh-imooc-cli-dev/core # 输入package name为 @yh-imooc-cli-dev/core version: (1.0.0) description: yh-imooc-cli-dev core keywords: homepage: license: (ISC) entry point: (lib/core.js) # 这样就为package/core子包创建了package.json # 同理,再创建一个package/utils,这里过程同上,不再赘述 lerna create utils
-
-
安装依赖
-
lerna add
对指定的package安装依赖
-
使用方法:
lerna add <package>[@version] [--dev] [--exact] [--peer] # 特别注意 lerna add 包A # 这样会在所有的package中安装包A lerna add 包A 路径A # 这样会在路径A(相对绝对都可)包中安装包A
-
注意:lerna add安装某个包,需要package.json中没有写这个包,如果写了,则会出警告说无需安装
-
-
lernae clean
删除依赖清空所有包的所有
node_modules
,也就是删除掉所有包的node_modules
文件夹,package.json
中的依赖不会删除同
npm uninstall
- 使用
lerna add
的时候,会经常出无法安装
的警告:lerna WARN No packages found where @imooc-cli/utils can be added.
,就是因为package.json
中没有删除依赖
- 使用
-
lerna bootstrap
安装依赖根据
package.json
安装依赖,并创建软链接。- 注意:这里创建的软链接,是链接到你安装的远程依赖中的,不是本地的(我们本地调试的时候,部分包是需要本地的,所以部分包不能这样安装)
-
lerna link
软链接依赖帮助我们本地的包进行相互依赖
-
首先在包A的
package.json
中添加要link的包和版本"dependencies": { "@yh-imooc-cli-dev/utils": "^1.0.0" }
-
进入包A目录,执行
lerna link
这样就把包A的
package.json
中的依赖都link到本地的开发包了可以进入node_module/包A,执行
ls -al
查看软链接指向到了本地的开发包
-
-
三、脚手架开发和测试
主要包含:
lerna exec
执行shell
脚本
lerna run
执行npm
命令
lerna clean
清空(上面已经说明)
lerna bootstrap
安装依赖(上面已经说明)
-
lerna exec
在所有的或指定的 package 下执行命令
-
使用方法
lerna exec [--scope <package包名(package.json中的name)>] -- <command> [..args] # 使用举例 lerna exec -- rm -rf node_modules # 删除所有package下的node_modules lerna exec --scope @yh-imooc-cli-dev/core -- rm -rf node_modules # 碰到scope,说明定位到@yh-imooc-cli-dev/cor包下(注意:--scope后面写的是包名),然后删除当前子包下的node_modules
-
-
lerna run
执行npm命令
npm
替换成lerna
使用-
使用方法
lerna run <scrip> -- [..args] # 使用举例 lerna run test lerna run build lerna run build --npm-client=yarn lerna run build --npm-client=npm # 默认npm客户端是npm,也可以像上面那样换成yarn lerna run --parallel watch
-
注意事项:
- 在根目录执行,则是执行所有packages下的所有包的script中的对应命令
- 在某个package下执行,则是执行当前包的script中的对应命令
-
四、脚手架发布上线流程
主要包含:
lerna version
:用于bump version
,也就是增加版本号
lerna changed
lerna diff
lerna publish
-
lerna version
用来升级版本号
- 注意事项:
- 要先
commit
,然后才能是要用该命令
- 要先
- 注意事项:
-
lerna changed
自上个版本以来,有哪些package做了变更
-
lerna diff
用来查看当前本地文件与上一次
commit
之间的diff
-
lerna publish
发布版本
-
注意事项:
-
在调用这个命令的时候,会自动
git add
所有package下的package-lock.json
和package.json
,所以在.gitignore
中不要添加这两个文件,不然会报错 -
发布时,如果为私有包,则需要登录,执行
npm login
-
发布时,默认为私有包,如果设为共有(共有不需要登录),则应在
package.json
中添加:"publishConfig": { "access": "public" }
-
发布时,需要有一个
LICENSE.md
-
先提交,再publish
-
lerna
每一次publish
,会给仓库创建一个tag
,无论publish
是否成功
-
-
last、细节易忘知识
lerna create <name> [loc]
中<>
表示必选,[]
标识可选- 在
lerna create core
时,自动会在package
目录下创建core
文件夹(包) - 在
lerna create core
时,会让你确认package name
,你输入@yh-imooc-cli-dev/core
这种两级的名称:- 第一级
@yh-imooc-cli-dev
:表示organization
组织的名称(npm
上可以创建组织,创建组织为了防止包重复,所以这个组织应该在npm提前创建好) - 第二级
core
表示该库的名称
- 第一级
- 在
lerna create core
时,会让你确认entry point
,也就是入口文件。如果当前库是lib
类的或SDK
,则需要指定入口文件,其他可以不指定,比如core
是脚手架
类型的,其实就可以不指定,而utils
是lib
类的,则需要指定。