项目每个模块都有一些相同的内容,比如:index
controller
等等,以前的操作方式是每次开一个新模块把原来的模块复制一份,在改改名称,就可以使用了。
但是这有点花时间, 重复的工作可以交给程序去做,我们只负责创造就可以了 , 所以我开发了个npm包来做这个事情。
我的初衷是写一个脚手架,但是项目可能不会移植(只是我们部门使用,以后有需求在开发),所以就只开发了新建模块功能。
首先,初始化项目,我取名叫bird-cli
,名字比较小众化。
在github上面新建仓库bird-cli
,在本地化初始化,就可以开发了。
1 | npm init |
实现的原理其实很简单,就是有一份模版文件,调用相应的命令就拷贝一份,再更改文件相应的信息即可。 围绕这个主题思想,实现我们需要的功能。
实现之前还需要命令行交互,获取用户的输入,需要用户输入新建模块的名称、开发人员、模块描述、模块新建时间等信息,我选择了inquirer
插件来做这个事情。
在目录下新建bin
文件夹,在bin
文件夹新建index.js
,这是我们项目入口文件。
index.js代码如下:1
2
3#! /usr/bin/env node
console.log(1);
在命令行执行 node bin/index.js
,可以看到打印出相应的数字。
但是,我们不是需要这种效果,我们希望直接执行bird
,就可运行程序。
其实可以通过改造package.json
来实现这个功能。在package.json
中添加bin
字段,如下所示。
1 | "bin": { |
命令行输入bird
,即可执行index.js
文件。
下一步,收集用户输入信息,安装inquirer
插件
1 | npm install inquirer --save |
在index.js
中引用inquirer
插件,收集相应的信息。
1 |
|
这样已经可以收集到用户的信息了,但是我需要bird init
才触发新建模块,因为以后可能会扩充 bird remove
、 bird add
等命令,处理不同的需求,我们需要把他们区分开来。
这里句需要大名鼎鼎的commander
插件,(我似乎不太会用这个插件^_^)。
安装npm install commander --save
,
在index.js
中引用插件,index.js改造如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
let program = require('commander');
let inquirer = require('inquirer');
const questions = [
{
type: "input",
name: "name",
message: "模块名称",
default: '例如:login',
format: function (input, answers) {
console.log(input, answers);
}
},
{
type: "input",
name: "description",
message: "模块描述",
default: "例如:登录模块"
},
{
type: "input",
name: "author",
message: "开发者姓名",
default: "例如:Veiss"
},
{
type: 'confirm',
message: '你是否确定。',
name: 'cm'
}
];
program
.version(require('../package.json').version)
.option('-init, --init', 'Init Modele')
.usage('[options] [init]')
.parse(process.argv);
program.parse(process.argv);
var pname = program.args[0];
if (!pname) {
program.help();
} else if (pname != "init") {
program.help();
} else {
inquirer.prompt(questions).then(function (answers) {
console.log(answers);
})
}
在命令行输入,bird init
,就会按照正常程序走,而输入其他则会显示--help
信息。
做到这里程序已经开发一半了,下面就是拷贝模版文件和替换相应的关键字信息即可完成,在此之前我们还需要收集到用户的操作时间,这个不能让用户输入,只好通过程序去收集,默认就是现在的时间。
新建lib
目录,这是放程序的模块文件,lib
目录下新建date.js
,代码如下所示:
1 | /** |
在index.js
中引入date
模块,改造如下所示。
1 | let date = require('../lib/date'); |
需要用户输入的所有信息我们都拿到了,下一步就是拷贝模版。
再次之前我们需要安装bluebird
和fs-extra
插件。
1 | npm install bluebird fs-extra --save |
在lib
目录下新建generateStructure.js
文件,文件内容如下:
1 | let promise = require("bluebird"), |
我们需要把generateStructure.js
引入到index.js
中。 index.js
改造如下:
1 | //引入代码 |
最终index.js
代码如下:
1 |
|
做到这里,代码开发工作就已经完成了。
最后一步,就是写README.md
文件发布包。
1 | //登录npm,如果没有账号需要注册一个 |
代码提交到github仓库!1
2
3git add .
git commit -m '提交描述'
git push origin master
通过npm install bird-cli -g
安装即可使用,大功告成!(^_^)。