自定义CLI⼯具

创建⼯程
mkdir vue-mini-cli
cd vue-mini-cli
npm init -y
npm i commander download-git-repo ora handlebars figlet clear chalk open
在vue-mini-cli文件夹中创建文件夹bin,在bin下创建index.js

bin/index.js

#指定脚本解释器为node
#!/usr/bin/env node

package.json

“bin”: {
“index”: “./bin/index.js”
},

将npm 模块链接到对应的运⾏项⽬中去

npm link

删除的情况

ls /usr/local/bin/
rm /usr/local/bin/
在bin下面的index.js中写入下面代码

#!/usr/bin/env node;
const program = require('commander');
const inquirer = require('inquirer');
const symbols = require('log-symbols');
const chalk = require('chalk');
const fs = require('fs');
const path = require('path');
const { promisify } = require('util')
const spawn = async (...args) => {
  const { spawn } = require('child_process')
  return new Promise(resolve => {
      const proc = spawn(...args)
      proc.stdout.pipe(process.stdout)
      proc.stderr.pipe(process.stderr)
      proc.on('close', () => {
          resolve()
      })
  })
}
const clone = async (repo,desc) => {
    const download = promisify(require('download-git-repo'))
    const ora = require('ora')
    const process = ora(`下载.....${repo}`)
    process.start()
    await download(repo, desc)
    process.succeed()
}

const log = content => console.log(chalk.green(content))
program.version('1.0.0', '-v, --version').
  command('init <name>').
  action(name => {
    // fs.existsSync 如果路径存在,则返回 true,否则返回 false
    if (!fs.existsSync(name)) {
      log(`创建项目:` + name)
     //当前命令所在的上一个目录
   
      inquirer.prompt([
        {
          name: 'description',
          message: '请输入项目描述'
        },
        {
          name: 'author',
          message: '请输入作者名称'
        }
       
      ]).then(async res => {
        await clone('https://github.com:xfbaby/xxxxx', name);
        log('安装依赖')
        let pathname =   path.resolve(__dirname,name+'/package.json');
        const filename = pathname;
        const content = fs.readFileSync(filename).toString();
        let dt = JSON.parse(content);
        dt.author = res.author;
        dt.description = res.description
        fs.writeFile( pathname ,`${JSON.stringify(dt)}`,function(err){
        })
      })
    } else {
      console.log(symbols.error, chalk.red('项目已存在'));
    }
  })
program.parse(process.argv);

发布npm

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值