We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
继回合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); }; ....
把功能模块划分好之后,剩下函数的编写就不难了,完整的代码在这里
至此,已经完成了第一套项目脚手架的搭建,之后第二,第三套就跟脚手架没啥关系了。通过这次自己手动写脚手架,主要有两个收获。
遗留问题点:
The text was updated successfully, but these errors were encountered:
No branches or pull requests
再接再厉
继回合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
把功能模块划分好之后,剩下函数的编写就不难了,完整的代码在这里
至此,已经完成了第一套项目脚手架的搭建,之后第二,第三套就跟脚手架没啥关系了。通过这次自己手动写脚手架,主要有两个收获。
遗留问题点:
The text was updated successfully, but these errors were encountered: