node搭建cli自动生成项目-发布到NPM

如果你还在手动复制模板代码,这篇文章值得一看,学到就是赚到

如图所示,使用自定义的指令:hs-cli create <project-name> 就可以下载模板代码
node搭建cli自动生成项目-发布到NPM

1、准备模板代码

在github上初始化仓库,把你的模板代码放上去,我这边的地址是:🔗

2、初始化

初始化项目 npm init

生成了package.json文件

下载插件 npm install chalk commander download-git-repo fs-extra inquirer ora

如果后续执行代码报错:Error [ERR_REQUIRE_ESM]: require() of ES Module ,需要把插件版本降级。推荐:inquirer:8.0.0 、 ora:4.0.0 、 chalk:4.0.0

新增指令:"hs-cli": "bin/hscli.js"
node搭建cli自动生成项目-发布到NPM

3、指令编写

新增 bin/hscli.js 文件

#! /usr/bin/env node  // 页面头都需要增加该注释
console.log('脚手架HS-CLI');

4、指令生效

本地关联指令:npm link . 输入:hs-cli 执行了 hscli.js
node搭建cli自动生成项目-发布到NPM

5、hs-cli create <project-name>

//  hscli.js 

#! /usr/bin/env node 
const program = require("commander");
const create = require('../lib/create');
// 定义指令
program
  .version('0.0.1')
  .usage('<command> [options]')
  .command(`create <app-name>`)
  .action((name, cmd) => {
    // 回调函数
    console.log('脚手架HS-CLI');
    create(name,cmd);
  })
program
  .on('--help',()=>{
    console.log('');
    console.log(`Run ${chalk.cyan(' hscli <command> --help')} show details `);
    console.log('');
  }) 
// 解析命令行参数
program.parse(process.argv);

新增 lib/create.js 文件

//  create.js

const chalk = require('chalk')
const path = require('path')
const ora = require('ora')
const fs = require('fs-extra')
const inquirer = require('inquirer')
const download = require('download-git-repo')

// 下载模板文件
function downloadtemp (projectName) {
  url = 'https://github.com/github-gmm/hs-template.git';
  console.log(chalk.white('\n Start generating... \n'))
  // 出现加载图标
  const spinner = ora("下载中...");
  spinner.start();
  download(`direct:${url}`, `./${projectName}`, { clone: true }, (err) => {
    if (err) {
      spinner.fail()
      console.log(chalk.red(`Generation failed. ${err}`))
      return
    }
    // 结束加载图标
    spinner.succeed()
    console.log(`\r\n ${chalk.green('创建成功!')}`);
    console.log('\n To get started')
    console.log(`\n    cd ${projectName} \n`)
  })
}
module.exports = async function (projectName, option) { 
  //  创建项目
  //  命名重复
  // 1. 获取当前执行目录
  const cwd = process.cwd(); 
  const targetDir = path.join(cwd, projectName)
  if (fs.existsSync(targetDir)) {
    if (option.force) {
      // 强制创建,加入 -f 命令后如果文件存在重名会强制移除上一个文件,新建一个文件
      await fs.remove(targetDir);
    } else {
        // 这个是用户没有加入 -f强制命令进行是否覆盖处理 提示用户是否确定要覆盖,用户选项提示
      let { action } = await inquirer.prompt([
        {
          name: 'action',
          type: 'list',
          massage: '当前文件名重复是否覆盖?',
          choices: [
            { name: '覆盖', value: 'overwrite' },
            { name: '取消', value: false }
          ]
        }
      ])
      // 如果用户不覆盖,直接取消
      if (!action) {
        console.log(`\r\n 取消构建`);
        return 
      } else if (action == 'overwrite') {
        // 如果要覆盖直接将之前文件进行移除 然后覆盖
        console.log(`\r\n 正在移除...`);
        await fs.remove(targetDir);
      } 
    }
  }
  downloadtemp(projectName); 
}

查看效果

node搭建cli自动生成项目-发布到NPM

6、NPM发布

打开npm网站,注册账号🔗

控制台输入:npm login

发布:npm publish

发布到 npm 的脚手架名称就是 package.json 的 name 值,ps:发布名称不能重复

7、CLI验证

解绑本地指令: npm unlink .

安装全局脚手架:npm install hs-cli -g

执行:hs-cli -h

原文链接:https://juejin.cn/post/7213296062084153400 作者:小迷迷

(0)
上一篇 2023年3月23日 上午11:00
下一篇 2023年3月23日 上午11:11

相关推荐

发表回复

登录后才能评论