前置知识
- npm link
- 终端如何识别指令?
npm link
- 使用场景:开发npm包时将包(模块)链接到全局,或者链接到项目.
- 优点:npm link能够避免重复且繁琐的打包发布操作
- 使用:例如开发公共组件commonA,在项目Project中使用,只有当发布到npm之后,在项目Project执行npm install commonA才可以使用,如果想解决频繁打包,发包问题,分两步操作:
- cd到commonA目录下执行npm link(此步骤是将当前包链接到全局包路径下)
- cd到Project目录下执行npm link CommonA(此步骤是生成一个从全局包指向当前目录node_modules/下对应包的链接),此时项目Project就等同于安装了commonA这个包
终端如何识别自定义指令?
package.json 文件中的bin属性可以,用来定义自定义指令,例如安装commonA包,其package.json为:
{
"name": "cli",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"ljz": "index.js"
}
}
如果全局安装npm会将该文件符号链接到前缀/bin中(全局安装),可输入该指令执行对应的文件,如果局部项目安装,项目/node_modules/.bin/中有对应的可执行指令,输入执行指向对应的文件
如何自定指令?
a.创建项目cli;b.初始化package.json;c.创建入口文件index.js;d.在index.js 中头部定义执行脚本 #!/usr/bin/env node(查找系统中node,执行后续代码);e.安装插件npm install commander
f. 自定义指令:
项目目录结构:
index.js 文件代码:
#!/usr/bin/env node
const { program } = require("commander");
const { helpOptions } = require("./lib/core/help");
// 查看版本号
program.version(require("./package.json").version);
// 帮助和可选信息
helpOptions();
program.parse(process.argv);
help.js 文件代码(抽离出来的一些自定义指令):
const { program } = require("commander");
const helpOptions = () => {
// 增加自定义option
program.option("-l --ljz", "ljz cli");
program.option("-d --dest <dest>", "a destination folder, 例如: -d /cli/src/components");
program.on("--help", function () {
console.log("others:");
console.log("我是一些其他帮助描述");
});
program.parse(process.argv);
console.log(program.opts().dest);
};
module.exports = {
helpOptions,
};
指令调用展示:
如何通过自定义指令xxx create demo,创建项目模板
- 自定义create命令
program
.command("create <project> [others...]")
.description("clone a repository into a folder")
.action(createProjectActions);
- 克隆项目
- 安装:
npm install download-git-repo库 - 指定clone地址:
const webpackRepo = "direct:https://github.com/zhuzi002/webpack.git"; - 克隆项目:
await download(webpackRepo,project,{clone:true});
- npm install
- 开启新的进程
const {exec,spawn} = require('child_process'); - 封装执行终端命令方法
const commandSpawn = (...args) => {
spawn(...args);
};
- 主进程打印子进程终端输出信息
childProcess.stdout.pipe(process.stdout);
childProcess.stderr.pipe(process.stderr);
- 执行npm install
const command = process.platform === "win32" ? "npm.cmd" : "npm";
await commandSpawn(command, ["install"], { cwd: `./${project}` });
- 运行项目
await commandSpawn(command, ["run", "serve"], { cwd: `./${project}` });
项目git传送门:gitee.com/liujiazhu/l…