Open youngwind opened 8 years ago
继回合1 #46 之后,开始准备回合2。这次我重新整理了一下思路。
针对第一个难点,经人指点,我知道应该在package.json的bin字段中定义我这个命令。其实平常我们输入cd,ls这些命令,shell之所以认识,是因为它们在环境变量$path中能找到。但是全局安装的npm module并不在$path中啊。npm的解决方案是,对于全局安装的,有bin字段的包,在安装的时候会主动建立一个链接,从$path指向该module的某个可执行文件。就像如图所示的第二行箭头那样。
其实这个bin字段还可以配置多个命令,详细的可以参考这里。ok,第一个难题可以解决了。 针对第二个难点,我搜索到了shell.js,关于shell.js,可以参考阮一峰老师的教程。
ok,解决方案敲定之后就开始撸起袖子敲代码了。 先写终端交互的cli.js,主要涉及inquirer.js
#!/usr/bin/env node 'use strict'; var inquirer = require("inquirer"); var lazySmart = require("./lazy-smart"); var shell = require("shelljs"); var questions = [ // 项目名称 { type: "input", name: "name", message: "input your project name", validate: function (value) { if (!value) { return "project name can not be null" } // 检查文件夹是否已存在 var ls = shell.ls(); if (ls.indexOf(value) !== -1) { return "File exists, please select another project name.." } else { return true; } } }, // 选择项目架构类型 { type: "list", name: "architecture", message: "select your project architecture", choices: ["ejs+gulp", "ejs+webpack"] }, // git仓库名称 { type: "input", name: "gitName", message: "input the repository name of git project.(make sure the repository is created and empty)", default: function (answer) { return answer.name; } }, // git仓库所有者名称 { type: "input", name: "gitOwner", message: "input the owner of git project.", default: function () { var userName = shell.exec('git config --global --get user.name').output; userName = userName.substring(0, userName.length - 1); return userName; } } ]; inquirer.prompt(questions, function (answers) { //把用户输入的参数传递给生成模块 lazySmart.init(answers); });
然后编写生成模块lazy-smart.js
// 调用执行命令行 var shell = require("shelljs"); // 支持在脚本中直接执行命令 require('shelljs/global'); // 解析获取命令行参数 var argv = require('yargs').argv; // 初始化 exports.init = function (options) { exports.copy(options); exports.initGit(options); exports.install(options); exports.build(options); exports.run(options); }; ....
把功能模块划分好之后,剩下函数的编写就不难了,完整的代码在这里
至此,已经完成了第一套项目脚手架的搭建,之后第二,第三套就跟脚手架没啥关系了。通过这次自己手动写脚手架,主要有两个收获。
遗留问题点:
再接再厉
继回合1 #46 之后,开始准备回合2。这次我重新整理了一下思路。
寻找方案
针对第一个难点,经人指点,我知道应该在package.json的bin字段中定义我这个命令。其实平常我们输入cd,ls这些命令,shell之所以认识,是因为它们在环境变量$path中能找到。但是全局安装的npm module并不在$path中啊。npm的解决方案是,对于全局安装的,有bin字段的包,在安装的时候会主动建立一个链接,从$path指向该module的某个可执行文件。就像如图所示的第二行箭头那样。
其实这个bin字段还可以配置多个命令,详细的可以参考这里。ok,第一个难题可以解决了。 针对第二个难点,我搜索到了shell.js,关于shell.js,可以参考阮一峰老师的教程。
开始敲代码
ok,解决方案敲定之后就开始撸起袖子敲代码了。 先写终端交互的cli.js,主要涉及inquirer.js
然后编写生成模块lazy-smart.js
把功能模块划分好之后,剩下函数的编写就不难了,完整的代码在这里
至此,已经完成了第一套项目脚手架的搭建,之后第二,第三套就跟脚手架没啥关系了。通过这次自己手动写脚手架,主要有两个收获。
遗留问题点: