我们常用的vue-cli,nuxt,eslint,babel,webpack等都可以直接使用他们提供的命令
例如

  1. # npm install eslint
  2. eslint --init
  3. eslint yourfile.js
  4. # npm install vue-cli
  5. vue create "文件夹名称"
  6. vue serve

实现一个自定义的命令

可以在你当前项目,或者创建一个新的项目,修改package.json

  1. {
  2. ...
  3. "bin": {
  4. "hibobi-react-cli": "./bin/hibobi.js" // commandName 命令的名称
  5. },
  6. ...
  7. }
  1. #!/usr/bin/env node
  2. const fs = require('fs')
  3. const path = require('path')
  4. const c = require('ansi-colors')
  5. let createFilePath;
  6. process.argv.forEach((text, index) => {
  7. if (text === '--create' || text === '-c') {
  8. createFilePath = process.argv[index + 1]
  9. }
  10. if (text === '--output' || text === '-o') {
  11. // ...
  12. }
  13. // ...
  14. })
  15. if (!createFilePath) {
  16. console.log(c.yellow("Usage: create [options] <app-name>"))
  17. console.log(c.yellow("hibobi-react-cli -c <app-name>"))
  18. return
  19. }
  20. const exclude = ['node_modules', 'bin', 'package-lock.json', 'yarn.lock']
  21. const checkDirectory = function (src, dst, callback) {
  22. fs.access(dst, fs.constants.F_OK, (err) => {
  23. if (err) {
  24. fs.mkdirSync(dst);
  25. callback(src, dst);
  26. } else {
  27. callback(src, dst);
  28. }
  29. });
  30. }
  31. const copy = function (src, dist) {
  32. const paths = fs.readdirSync(src); //同步读取当前目录
  33. paths.forEach(function (path) {
  34. if (exclude.includes(path)) {
  35. return;
  36. }
  37. var _src = src + '/' + path;
  38. var _dist = dist + '/' + path;
  39. fs.stat(_src, function (err, stats) { //stats 该对象 包含文件属性
  40. if (err) throw err;
  41. if (stats.isFile()) { //如果是个文件则拷贝
  42. let readable = fs.createReadStream(_src);//创建读取流
  43. let writable = fs.createWriteStream(_dist);//创建写入流
  44. readable.pipe(writable);
  45. } else if (stats.isDirectory()) { //是目录则 递归
  46. checkDirectory(_src, _dist, copy);
  47. }
  48. });
  49. });
  50. }
  51. try {
  52. const target = path.resolve(createFilePath);
  53. const source = path.resolve(__dirname, '../');
  54. fs.mkdirSync(target);
  55. copy(source, target);
  56. } catch (e) {
  57. console.error(c.red(e))
  58. }

实践你的指令

创建一个新的文件夹
mkdir demo
cd demo
npm init

修改 package.json

  1. "dependencies": { "my-lib": "file:/home/xxx/mylib" } // 这里建议写上绝对路径

npm install // 安装依赖

// npx 在执行node_module/.bin 下面的指令时,可以使用npx
// 全局安装后,直接使用 hibobi-react-cli
npx hibobi-react-cli

  1. Usage: create [options] <app-name>
  2. hibobi-react-cli -c <app-name>
  3. Usage: create [options] <app-name>

npx hibobi-react-cli -c demo

测试完毕,没问题后,npm publish 发布你的项目
然后就可以直接使用,你自己定义的指令了。