1 | #!/usr/bin/env node
|
2 |
|
3 | const program = require('commander');
|
4 | const chalk = require('chalk');
|
5 | const rm = require('rimraf');
|
6 | const log = require('../lib/log').log;
|
7 | const downloadFromGit = require('download-git-repo');
|
8 | // const ghdownload = require('github-download');
|
9 | const inquirer = require('inquirer');
|
10 | const ora = require('ora');
|
11 | const path = require('path');
|
12 | const fs = require('fs');
|
13 | const cp = require('child_process');
|
14 | const checkVersion = require('../lib/check-version');
|
15 | const writeIgnore = require('../lib/write-ignore.js');
|
16 | const writeLog = require('../lib/write-logo.js');
|
17 |
|
18 | let config; // 存放用户输入的配置
|
19 |
|
20 | program
|
21 | // .option('-i, --intranet', '使用内网地址')
|
22 | .option('-g, --git', '初始化git')
|
23 | .parse(process.argv);
|
24 |
|
25 | /**
|
26 | * 初始化git
|
27 | */
|
28 | const initGit = () => {
|
29 | cp.execSync('git init', {
|
30 | cwd: config.pathName
|
31 | })
|
32 | cp.execSync(`git remote add origin ${config.gitPath}`, {
|
33 | cwd: config.pathName
|
34 | });
|
35 | }
|
36 |
|
37 | /**
|
38 | * 下载之后做的事情
|
39 | * @param {String} dist 项目目录
|
40 | */
|
41 | const afterDownload = () => {
|
42 | writeIgnore(config.pathName);
|
43 | writeLog(config.pathName, config.name);
|
44 | if (program.git) {
|
45 | initGit();
|
46 | }
|
47 |
|
48 | let i = 1;
|
49 | log();
|
50 | log('已完成项目的初始化:', 'green');
|
51 | log();
|
52 | log(` ${i++}.在${config.pathName}新建了项目`, 'white');
|
53 | if (program.git) {
|
54 | log(` ${i++}.在${config.pathName}初始化了git`, 'white');
|
55 | }
|
56 | log();
|
57 | log('接下来你需要:', 'white');
|
58 | log();
|
59 | log(` 1.cd ${config.name}`, 'white');
|
60 | log(' 2.npm install(或者 yarn install, cnpm install)', 'white');
|
61 | log();
|
62 | log('然后你可以:', 'white');
|
63 | log();
|
64 | log(' - tofu server 运行开发服务', 'white');
|
65 | log(' - tofu build 打包项目', 'white');
|
66 | log(' - tofu update 更新框架以及命令行工具至最新版本', 'white');
|
67 | log();
|
68 | }
|
69 |
|
70 | /**
|
71 | * 下载项目至指定文件
|
72 | * @param {String} source git源
|
73 | * @param {String} dist 项目目录
|
74 | * @param {Boolean} clone 是否采用git clone来下载
|
75 | */
|
76 | const download = (source, dist, clone) => {
|
77 | const spinner = ora('downloading template');
|
78 | spinner.start();
|
79 |
|
80 | // if (program.intranet) {
|
81 | // ghdownload(source, dist)
|
82 | // .on('error', (err) => {
|
83 | // if (err) throw err;
|
84 | // })
|
85 | // .on('end', () => {
|
86 | // spinner.stop();
|
87 |
|
88 | // afterDownload();
|
89 | // });
|
90 | // } else {
|
91 | downloadFromGit(source, dist, { clone }, err => {
|
92 | spinner.stop();
|
93 |
|
94 | if (err) throw err;
|
95 |
|
96 | afterDownload();
|
97 | });
|
98 | // }
|
99 | }
|
100 |
|
101 | const initConfig = async () => {
|
102 | let name = await inquirer.prompt({
|
103 | name: 'name',
|
104 | message: '请输入项目名',
|
105 | validate (name) {
|
106 | let regExp = /^[\u4E00-\u9FA5a-zA-Z0-9\-\_\$]+$/;
|
107 | if (regExp.test(name)) {
|
108 | return true;
|
109 | } else {
|
110 | return "请输入正确的项目名,只允许输入汉字,英文,数字,和符号('_', '-', '$')"
|
111 | }
|
112 | }
|
113 | });
|
114 |
|
115 | let template = await inquirer.prompt({
|
116 | name: 'template',
|
117 | message: '请选择新建的模板类型',
|
118 | type: 'list',
|
119 | default: 0,
|
120 | choices: [
|
121 | 'PC'
|
122 | ]
|
123 | });
|
124 |
|
125 | const dist = path.resolve(process.cwd(), name.name);
|
126 | let pathName = await inquirer.prompt({
|
127 | name: 'path',
|
128 | message: `将会把项目新建在:${dist},确定吗?`,
|
129 | type: 'confirm'
|
130 | }).then(res => {
|
131 | if (res.path) {
|
132 | return dist;
|
133 | } else {
|
134 | return inquirer.prompt({
|
135 | name: 'path',
|
136 | message: '请输入项目创建的地址(相对当前路径):',
|
137 | filter (input) {
|
138 | return require('path').resolve(process.cwd(), input);
|
139 | }
|
140 | })
|
141 | }
|
142 | })
|
143 |
|
144 | let gitPath;
|
145 | if (program.git) {
|
146 | gitPath = await inquirer.prompt({
|
147 | name: 'gitPath',
|
148 | message: `请输入项目的git地址`,
|
149 | })
|
150 | }
|
151 |
|
152 | return Object.assign({ pathName }, template, gitPath, name);
|
153 | }
|
154 |
|
155 | const init = async () => {
|
156 | config = await initConfig();
|
157 |
|
158 | // 如果存在文件夹,将会删除当前文件夹
|
159 | rm(config.pathName, err => {
|
160 | if (err) throw err;
|
161 |
|
162 | switch (config.template) {
|
163 | case 'PC':
|
164 | // if (program.intranet) {
|
165 | // download('git@192.168.0.192:ishangzu_web/tofu-boilerplate.git', config.pathName);
|
166 | // } else {
|
167 | download('ishangzu-fe/tofu-boilerplate', config.pathName, false);
|
168 | // }
|
169 | break;
|
170 | default:
|
171 | break;
|
172 | }
|
173 | })
|
174 | }
|
175 |
|
176 | require('../lib/check-version')().then(res => {
|
177 | init();
|
178 | });
|