npm从7版本开始支持workspace特性, 在此之前, 我们一般使用lerna或yarn. workspace特性可以使我们很容易管理多个项目. 下面我们通过简单的demo演示workspace特性的基本使用.
一、在npm创建organization
在npm创建一个一个organization, 用来承载多个子项目. 如创建的一个名为npm-workspace-test的organization
二、初始化项目
- 使用
npm init -y命令初始化一个npm项目, 添加workspaces字段. - 在根目录下创建
packages目录, 子项目创建在该目录下. - 我们将会在
packages下创建三个项目, 分别是项目a、项目b和项目cil,a项目和b项目会被cli项目引用,cli项目会实现一个自定义命令行命令.
- 3.1 使用workspace命令初始化
abcli这几个子项目
npm init --workspace ./packages/a --workspace ./packages/b --workspace ./packages/cli
- 3.2 给各个子项目的名字加上organization前缀, 已确保可以正确发布到npm上.
- 3.3 创建项目
a和项目b的入口文件index.mjs, 并把package.json的main改成index.mjs(改成.mjs后缀不是必须的, 这里改成.mjs是因为没有使用 babel 而又想使用 esmodule 的特性)
- 3.4 因为我们要实现一个自定义的cli命令, 因此我们需要在
cli项目下添加bin字段. 如图所示, 我们定义的自定义命令为my-demo-cli, 这个命令会指向bin/index.mjs
三、编写业务代码
分别编写项目a b cli的业务代码
- 项目
a使用chalk打印一句红色字体的话术 可以使用--workspace选项单独给a项目安装chalk依赖
npm install chalk --workspace ./packages/a
2. 项目
b 使用 ora 模拟 loading 效果
npm install ora -ws ./packages/b
3. 在项目
cli 中使用 a 和 b
cli项目安装a和b
npm i @npm-workspace-test/a -w ./packages/cli @npm-workspace-test/b -w ./packages/cli
- 使用
- 执行 cli.mjs, 看运行是否符合预期
node ./packages/cli/bin/cli.mjs
四、把 a b cli 这三个项目发布到npm
使用 npm publish --workspaces 命令把这三个项目发布到npm.
五、全局安装
发布成功后, 我们可以全局安装cli
npm install @npm-workspace-test/cli -g
安装成功后, 可运行 my-demo-cli 看效果