自定义cli快速创建项目结构

研究院性质的公司要求快速地实现从想法到Demo的验证,每次做demo时都需要重新建立项目骨架,不复杂但是繁琐,所以想到可不可以自定义cli来完成这些繁琐的工作。

这篇文章会随着cli的功能的丰富持续更新。。。

一. npm init新建nodejs项目

cli是使用nodejs来写的,使用npm init来新建package.json文件。

// package.json
{
  "name": "createprojectcli",
  "version": "1.0.0",
  "description": "this is cli for creating project template",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "wangting",
  "license": "ISC"
}

二.添加bin字段

安装npm包时,有一些命令是可以在命令行中直接执行的,实现原理就是在package.json添加bin字段

// package.json
{
  "name": "createprojectcli",
  "version": "1.0.0",
  "description": zdu"this is cli for creating project template",
  "main": "index.js",
    // 这里添加了bin字段
  "bin": {
    // 这里的key就是命令的名称,value是可执行文件的地址
    "create-project-template": "index.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "wangting",
  "license": "ISC"
}

三.添加可执行文件index.js

// index.js

#! node

// 文件执行环境解释
// #! node是声明这个文件需要使用node来打开,这是window系统的写法。
// #!/usr/bin/env node 或者 #!/usr/bin/node 是linux系统的写法。

console.log('test');

 

 这里的可执行文件有一点特殊,严格意义上应该算是特定情况下的可执行文件,这里的特定情况就是必须在package.json中的bin里运行。否则,运行这个文件就只能使用 node index.js

四.挂载项目到本地全局中

现在的目录结构如下:

 

 在当前目录下执行npm link 或者 npm install -g,就当前的node项目挂载到全局。

 

 五.运行bin中定义的命令

挂载完成之后,就可以在全局的任何地方来调用bin中定义的命令了

 

 这里的create-project-template就是在package.json中定义的bin字段的key。

---------------------------------------------------------------这是一段不知道是什么的分割线----------------------------------------------------------------------------------

至此,一个简单的cli已经完成,用户直接输入命令得到结果,这是最基本的功能,后面会添加用户可以设置命令行参数的功能。

---------------------------------------------------------------这是一段不知道是什么的分割线----------------------------------------------------------------------------------

六.项目骨架的模板

在项目中添加项目骨架的模板。暂时的思路是当用户想要快速新建项目骨架时,直接copy模板到目标目录。

现在的目录结构:

 

 可以看到,模板中包含了frontend和backend,第一个版本直接copy模板,后面会让用户输入项目的名称,比如,这里的文件夹名称是projectname-frontend,后面会让用户输入project name.

七.复制模板到当前目录

这里有2个思路,nodejs的fs模块和使用shell脚本直接copy,在处理多文件时,shell脚本会快速的多。这里使用shell脚本进行copy。

 这里用到可以在nodejs中执行shell脚本的库shelljs.

# index.js

// 导入shelljs
const shell = require('shelljs');
const path = require('path');

// 使用shelljs的cp命令,需要获取到template的绝对路径才能copy,'.'代表当前路径
const res = shell.cp('-R',  path.join(__dirname, 'template/*'), '.')

console.log('create successfully.');

 

八.尝试

在其他路径中直接执行 create-project-template(第四步中已经就脚本挂载到全局了)。

 

 可以看到,模板自动生成了。

-------------------------------------------------分割线----------------------------

cli基本上制作完成,下面我们来使用cli来自动安装依赖包

-------------------------------------------------分割线----------------------------

 九.自动安装依赖包

想要实现的效果是项目结构生成之后,自动调用npm install来安装依赖包。

这里需要注意的是,我们的工程目录中包含前端和后端,所以不能在cli启动的cmd中显示安装的信息,这里做的处理是弹出2个新的cmd窗口,自动执行npm install.

// index.js
// cd到前端文件夹内
res = shell.cd(frontendProjectPath);

// 执行start命令,新建一个新的cmd窗口,执行npm install命令。
// 这里想要同时执行前端和后端的npm install,所以是异步的
res = shell.exec('start npm install', {async: true});

// cd到后端文件夹内
res = shell.cd('..');
res = shell.cd(backendProjectPath);
// 执行start命令,新建一个新的cmd窗口,执行npm install命令。
res = shell.exec('start npm install', {async: true});

 

posted @ 2020-12-09 10:25  JasonWangTing  阅读(596)  评论(0编辑  收藏  举报