最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 手写一个cli工具

    正文概述 掘金(川普_莱茵哈特)   2021-03-15   675

    cli 工具实现

    1、新建文件夹 my-cli

    执行以下命令生成package.json文件

    npm init -y
    

    2、新建 bin 文件

    新建 hui.js文件

    #!/usr/bin/env node
    
    console.log('my-cli 测试')
    
    // 定制命令
    const program = require('commander')
    
    const initFunc = require('../lib/init') // 初始化函数
    
    program.version(require('../package.json').version)
    
    program.command('init <name>').description('init project').action(initFunc)
    
    // 解析
    program.parse(process.argv)
    
    // console.log('process.argv:')
    // console.log(process.argv)
    // console.log('params:')
    // const params = program.parse(process.argv)
    // console.log(params)
    

    在package.json 添加

      "bin": {
        "hui": "./bin/hui.js"
      },
    

    3、全局安装,或者模拟安装

    当npm包发布后,可以通过 hui 全局执行,若是本地的话可以通过在 my-cli文件下执行npm link 命令

    4、在lib新建init、download的文件

    lib/init.js文件

    const { promisify } = require('util')
    
    const figlet = promisify(require('figlet')) // 大字
    
    const clear = require('clear') // 清屏
    
    const chalk = require('chalk') // 改色输出
    
    const { clone } = require('./download.js')
    
    const log = (content) => console.log(chalk.green(content))
    
    module.exports = async (name) => {
      clear()
      console.log('执行')
      const data = await figlet('my-cli welcome')
      log('创建项目:' + name)
      log(data)
      const { clone } = require('./download.js')
      await clone('github:JeffyEvergarden/learn-ts', name)
    }
    
    

    download.js文件

    const { promisify } = require('util')
    module.exports.clone = async function (repo, desc) {
      const download = promisify(require('download-git-repo'))
      const ora = require('ora') // 显示loading
      const process = ora(`下载……${repo}`)
      try {
        process.start()
        await download(repo, desc)
        process.succeed()
      } catch (error) {
        console.log(error)
        process.succeed()
      }
    }
    
    

    5、安装依赖

    注意的地方,如果运行环境是win32,需要

    process.platform === 'win32' ? 'npm.cmd' : 'npm'
    

    添加 install.js 文件

    // 安装依赖
    
    const spawn = async (...args) => {
      const { spawn } = require('child_process')
    
      return new Promise((resolve) => {
        args[0] = process.platform === 'win32' ? 'npm.cmd' : args[0]
        const proc = spawn(...args) // 得到命令流
        proc.stdout.pipe(process.stdout) // 导到控制台输出流
        proc.stderr.pipe(process.stderr) // 导到错误流
        proc.on('close', () => {
          resolve()
        })
      })
    }
    
    module.exports = spawn
    

    主方法添加 这段代码

      // ...
      try {
        await spawn('npm', ['install', 'lodash'], { cwd: `./${name}` })
        log(chalk.green(`安装依赖完成`))
      } catch (err) {
        console.log(err)
        log(chalk.green(`安装依赖失败`))
      }
      // ...
    

    6、默认打开浏览器,运行 npm run

    const open = require("open")
    open(`http://localhost:3000`);
    await spawn('npm', ['run', 'serve'], { cwd: `./${name}` })
    

    7、包的描述

    A. 关于 download-git-repo 包

    该包用来下载仓库的代码的

    仓库使用方式

    GitHub - github:owner/name or simply owner/name

    GitLab - gitlab:owner/name

    Bitbucket - bitbucket:owner/name

    范例:

    github:JeffyEvergarden/learn-ts
    

    或者使用 direct 直接粘贴gitclone的地址

    Direct - direct:url

    direct:url#my-branch

    B. 关于 spawn 包

    出自child_process包,node自带

    8、约定式路由

    写界面,自定义生成route

    abs模板库

    const fs = require('fs')
    
    const handlebars = require('handlebars')
    
    const chalk = require('chalk')
    
    function compile(meta, filePath, templatePath) {
      if (fs.existsSync(templatePath)) {
        const content = fs.readFileSync(templatePath).toString() // 得到模板
        const result = handlebars.compile(content)(meta) // 得到渲染函数
        fs.writeFileSync(filePath, result) // 写进文件
      }
    }
    
    module.exports = async () => {
      const list = fs.readdirSync('./views').map((v) => ({
        name: v.replace('.vue', '').toLowerCase(),
        file: v,
      }))
    
      compile({ list }, './src/router.js', './template/router.js.hbs')
    }
    

    发布

    新建publish.sh

    #!/usr/bin/env bash 
    npm config get registry 
    # 检查仓库镜像库 
    npm config set registry=http://registry.npmjs.org 
    echo '请进行登录相关操作:' npm login 
    # 登陆 echo "-------publishing-------" 
    npm publish 
    # 发布 
    npm config set registry=https://registry.npm.taobao.org 
    # 设置为淘宝镜像 
    echo "发布完成" exit
    

    遇见的坑:

    1、区别于mac系统,window运行spawn时,如果是win32,需要改为npm.cmd

    2、spawn('npm', ['run', 'serve'], { cwd: ./${name} }), cwd表示的是当前目录

    3、sh在window命令行上运行不了

    4、npm发布的包只有在dependencies安装时才会有依赖,在dev下发布的包是不会安装这些依赖的。

    5、需要关注的包去研究 handlebars(模板转渲染)、child_process(子进程的包研究)、download-git-repo (下载仓库的包,关于仓库的规则,不支持码云)


    起源地下载网 » 手写一个cli工具

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元