node开发命令行脚本
https://github.com/helloGrape/nono-cli
bash-handbook

搭建npm包架子

vue create[命令] app[参数]
ls -l[选项]

0、

  1. mkdir fisd && cd fisd
  2. npm init

1、在bin/fisd.js中写入

  1. // #!/usr/bin/env node 表示使用node作为脚本的解释程序,node的路径通过env来查找
  2. // 本来需要这样运行node ./fisd.js,但是加上了这句后就可以直接./fisd.js运行
  3. #!/usr/bin/env node
  4. console.log('fisd is run!')

2、package.json

  1. {
  2. "name": "fisd",
  3. "version": "0.0.1",
  4. "description": "知道前端工程部署命令工具",
  5. "main": "index.js",
  6. # 脚本入口
  7. "bin": {
  8. "fisd": "bin/fisd.js"
  9. },
  10. }

3、将该命令行工具安装到本地全局

  1. cd fisd
  2. npm install . -g

4、测试
fisd
输出:fisd is run!

5、建立软链接:
使用 npm link 便利地将我们的 index.js 软链接到 path 变量的位置。

  1. $ npm link
  2. 控制台输出以下结果:
  3. /usr/local/bin/fisd -> /usr/local/lib/node_modules/fisd/bin/fisd.js
  4. /usr/local/lib/node_modules/fisd -> /Users/yangxiaoyu08/tutorial/fisd

这样每次修改fisd.js 执行fisd的时候 运行结果也会发生变化

依赖的工具包

  • commander: commander能够更好的解析命令行参数,使开发更简单
  • inquirer: 命令行交互界面集合。可以提问,解析输入,校验回答等
  • ora: 可以使终端输出更优雅,设置正在进行,成功或失败
  • chalk: 可以对终端输出的文字设置一些颜色等样式
  1. npm install commander inquirer ora chalk --save

commander-命令行解析

更多:https://www.yuque.com/u2728/work-makes-me-happy/kmp0e2

  1. var program = require('commander')
  2. program
  3. .version('0.1.0')
  4. .option('-C, --chdir <path>', 'change the working directory')
  5. .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
  6. .option('-T, --no-tests', 'ignore test hook');
  7. program.parse(process.argv);

输出
image.png

api:

  • version
  • option
  • command
  • description
  • action
  • parse
  • outputHelp

优秀片段借鉴

https://github.com/afc163/fanyi

  1. const program = require('commander');
  2. const pkg = require('../package.json');
  3. # 初始化
  4. program
  5. .option('-C, --nocolor', 'Output without color.')
  6. .version(pkg.version);
  7. # help借鉴
  8. program.on('--help', function(){
  9. console.log('');
  10. console.log(chalk.gray('Examples:'));
  11. console.log(chalk.cyan(' $ ') + 'fanyi word');
  12. console.log(chalk.cyan(' $ ') + 'fanyi world peace');
  13. console.log(chalk.cyan(' $ ') + 'fanyi chinglish');
  14. console.log('');
  15. });
  16. # 没有命令参数的时候 自动输出 help
  17. program.parse(process.argv);
  18. if (!process.argv.slice(2).length) {
  19. program.outputHelp();
  20. }

image.png

文件组织

https://github.com/afc163/fanyi

  1. ├── README.md
  2. ├── bin
  3. └── fanyi #bash脚本文件
  4. ├── index.js # 主文件
  5. ├── lib
  6. ├── print.js
  7. └── source.json # 脚本依赖的源
  8. ├── package.json
  9. └── tests # 测试
  10. ├── data.js
  11. └── index.js
  1. // package.json
  2. {
  3. "main": "index.js"
  4. "bin": {
  5. "fy": "./bin/fanyi",
  6. "fanyi": "./bin/fanyi"
  7. }
  8. }
  9. // bin/fanyi
  10. const fanyi = require('..');// index.js 文件
  11. 命令 fanyi word 会对word这个单词 使用三个字段查询,三个字典查完之后 再返回结果
  12. // index.js
  13. module.exports = function(word, options, callback) {
  14. const spinner = ora().start();// loading
  15. // callback 函数
  16. let count = 0;
  17. const callbackAll = () => {
  18. count += 1;
  19. if (count >= 3) {
  20. spinner.stop();// 结束loading
  21. callback && callback();
  22. }
  23. };
  24. request.get('xx.youdao.com',function(error, res, body) {
  25. print.iciba(res.dict, options);
  26. callbackAll(); // 当三个字典查完之后 再调用回调 打印
  27. })
  28. // ... baidufanyi
  29. // ... googlefanyi
  30. }

测试

pull 知道的所有仓库 然后npm i 测试包的安装能力
fisd release 测试 部署能力

  1. # package.json
  2. {
  3. "scripts": {
  4. "test": "mocha tests/index.js --timeout 0"
  5. }
  6. }
  7. # test/index

node熟悉

写入文件

向package.json写入配置

  1. 得到package.json所在的绝对路径
    1. 获取命令行执行的目录(当前进程)process.cwd()
    2. 往上追溯知道构造出绝对路径
  2. 获取文件的原始内容
  3. 写入内容与原始内容处理得到最终内容
  4. writeFileSync写入更替(stringfy json)
  1. const processDir = process.cwd(); // 当前进程执行目录
  2. const createDir = path.resolve(processDir); // path 从右到左依次处理,直到构造出绝对路径。
  3. const pkgPath = path.join(createDir, 'package.json');
  4. //const pkgPath = '/Users/yangxiaoyu08/tutorial/fisd/package.json';
  5. const defaultPkg = require(pkgPath);// 现有的文件内容
  6. const userPkg = Object.assign(defaultPkg, {test: 'yangxiaoyu'});
  7. fs.writeFileSync(pkgPath, JSON.stringify(userPkg, null, ' '));