首页 > 其他分享 >创建自己的简单脚手架工具

创建自己的简单脚手架工具

时间:2024-03-20 21:32:44浏览次数:20  
标签:bin npm 创建 create nbycli js inquirer 脚手架 工具

什么是脚手架?

        脚手架是能帮助我们快速完成项目初始化等操作的工具。

        比如在创建完react项目后的模板通常不是我们需要的,我们需要对原始模板删除一些文件才方便我们使用。因此,如果我们自己开发一个脚手架,然后下载修改后的项目模板,这样就能提高工作效率。

脚手架需要具备哪些能力

1、全局命令的执行能力

2、命令行交互的能力

3、项目初始化下载代码的能力

开始制作

        制作步骤主要围绕上面3个能力。我在这里创建了一个nbycli脚手架,可以自定义一个名字。

1、准备工作

添加全局指令nbycli

        创建一个nbycli文件夹,再在nbycli里面创建bin/cli.js(这是脚手架的入口),内容如下:

#! /usr/bin/env node
// 上面一行告诉操作系统用node解释器来执行本文件,相当于node cli.js
console.log('shebang')

        然后执行【npm init】,这样会创建出package.json文件,并且json对象中还会自动包含bin字段,【解释bin字段的作用:当这个包是全局下载时,bin对象的指令会变为全局指令。比如下面的nbycli指令,到时候执行nbycli执行就会去执行bin/cli.js文件】

package.json代码如下:

{
  "name": "nbycli",
  "version": "1.0.0",
  "description": "nby-cli",
  "main": "index.js",
  "bin": {
    "nbycli": "bin/cli.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "nby",
  "license": "ISC"
}

        最后还需要执行【npm link nbycli】,将这个包链接到全局的node_modules中。由于现在是本地测试,来模拟全局下包的步骤。

测试

        在命令行执行nbycli,打印【shebang】就代表成功了

2、处理指令参数-【commander】

使用

        通过process.argv能获取到命令行的参数,但是处理有点麻烦,推荐使用第三方库【commander】。

        先下载commander,执行【npm i commander】。

        然后在bin/cli.js中使用commander,主要操作是:用program.command创建一个create指令,用alias起了一个别名,action负责处理执行create的逻辑,现在只打印。

#! /usr/bin/env node

const { program } = require('commander')
// 往--help添加一条说明
program.option('-f --framwork <framwork>', '选择框架')

/* 利用command创建create指令,<project>代表项目 , [other...]代表其他参数
alias设置create指令的别名,
description将create指令加入到--help中
最后的action用于对这个指令进行处理 */
program
    .command('create <project> [other...]')
    .alias('c')
    .description('创建项目')
    .action((project, args) => {
        console.log(project)
        console.log(args, '其他参数')
    })

// 把命令行参数交给program.parse处理,默认有处理--help
program.parse(process.argv)//在旧版本不显式传递process.argv会报错

测试

        执行【nbycli create tem tt】,如果打印【tem [tt] 】等信息就代表成功,因为把项目名和参数都拿到了。

3、命令行问答交互-【inquirer】

使用

        接下来就需要完善action的逻辑处理,需要借助inquirer这个包,能让用户做一些命令行简单的交互。我们做一个让用户上下选择后端框架的功能。

        首先下载【npm i inquirer@8】,注意从9开始就用esm规范了,我们这里是用cjs,所以需要降版本。

        在bin/cli.js下创建一个action函数,在里面使用inquirer.prompt创建一个list列表,这个函数返回promise,promise的值是一个对象。代码如下:

const inquirer = require('inquirer')

async function create_action(project, args) {
  // 处理create
  try {
    const answer = await inquirer.prompt([
      { type: 'list', 
        name: 'framework', 
        choices: ['express', 'koa', 'egg'], 
        message: '请选择你需要的后端框架' }
    ])
    console.log(answer,'====') // {framework : 'koa'}
  } catch (err) {
    console.log(err)
  }
}

program
    .command('create <project> [other...]')
    .alias('c')
    .description('创建项目')
    .action(create_action)

测试

        执行【nbycli c tem】,然后选择koa,最后打印【{framework:'koa'}】就代表目前成功了。

4、根据用户选择下载代码-【download-git-repo】

使用

        上一步我们已经拿到用户的选择了,现在只需要根据选择来下载对应的远程代码就可以了。

        我们需要借助【download-git-repo】这个包,同样的,先下载【npm i download-git-repo】。

        在bin/cli.js中引入后使用,需要传入git地址,创建的文件夹名,还有一个回调函数。

代码存放在不同的仓库,地址是不一样的,具体如下:

  • GitHub - github:剩余地址

  • GitLab - gitlab:剩余地址

  • Bitbucket - bitbucket:剩余地址

  • 码云 - direct:剩余地址

下面是bin/cli.js的完整代码:

const fs = require('fs')
const inquirer = require('inquirer')
const download = require('download-git-repo')
const { frameworkArr, gitAddress } = require('./config.js')
async function create_action(project, args) {
  // 处理create
  try {
    // 先判断需要创建的文件夹是否已经存在
    if (fs.existsSync(project)) {
      console.log(`当前目录已经存在目标文件夹(${project}),请更换项目名`)
      return
    }

    const answer = await inquirer.prompt([
      { type: 'list', name: 'framework', choices: frameworkArr, message: '请选择你需要的后端框架' }
    ])
    
    // 根据用户选择的框架,下载对应的代码。
    download('direct:' + gitAddress[answer.framework], project, { clone: true }, (err) => {
      if (err) {
        console.log(err, '下载发生错误')
      } else {
        console.log('下载成功')
      }
    })
  } catch (err) {
    console.log(err)
  }
}

config.js代码如下:

const frameworkArr = ['express', 'koa', 'egg']
const gitAddress = {
  express: 'https://gitee.com/beiyaoyaoyao/express-template.git',
  koa: 'https://gitee.com/beiyaoyaoyao/koa-template.git',
  egg: 'https://gitee.com/beiyaoyaoyao/egg-template.git'
}

module.exports = { frameworkArr, gitAddress }

测试

        执行【nbycli c tem】,然后选择一个框架,之后就会生成一个tem文件夹,里面有模板代码。

5、将脚手架提交到npm上

使用

        提交之前,先【npm unlink nbycli】取消本地链接。然后【npm publish】就能提交了,执行【npm publish】之前需要有npm的账号。

测试

        执行【npm i nbycli -g】全局下载我们的脚手架,然后执行【nbycli c tem2】后有对应的模板文件,那就成功了。

END

        学习了慕课的node课程写下了这篇博客,上面步骤是设计制作脚手架的主要步骤,还能用ora做一些加载优化等。

git地址

后补

标签:bin,npm,创建,create,nbycli,js,inquirer,脚手架,工具
From: https://blog.csdn.net/badbaby52906/article/details/136878671

相关文章

  • Java中String类型的创建与比较(详解)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、String类型是什么??二、String类型的创建使用字符串字面量使用new关键字intern()方法简读图解String的比较总结前言提示:这里可以添加本文要记录的大概内容:在背八股文(Holis版)的过程中遇......
  • 默认密码凭证备忘录工具
    在一个地方提供所有默认凭据,以在参与期间协助渗透测试人员,本文档包含从多个来源收集的多个产品默认登录名/密码。Motivation 赋予动机Onedocumentforthemostknownvendorsdefaultcredentials一个文档,用于最知名的供应商默认凭据Assistpentestersduringapentest/......
  • 线程的创建与终止
    线程的创建与终止:1.线程的创建:应用程序在启动时,通常仅有一个线程在执行,称为“初始化线程”,它的主要功能是创建新线程,利用一个线程创建函数,并提供相应参数,创建函数执行完毕后,返回一个线程标识符供以后使用。2.线程的终止:当一个线程完成了自己的任务后,或是线程在运行中出现异......
  • 通过ETL工具快速实现单据同步
    ETLCloud介绍ETLCloud是一款旨在解决企业数据集成挑战的最新一代平台,它集成了离线数据集成ETL、ELT、CDC实时数据集成、编排调度和数据服务API等功能,形成了一体化的DataOps数据集成平台。该平台提供私有化部署以及云原生架构,能够满足企业不同发展阶段的业务需求。此外,ETLCloud还......
  • 提升Java编程安全性-代码加密混淆工具的重要性和应用
     在Java编程领域中,保护代码安全性和知识产权至关重要。本文旨在探讨代码加密混淆工具在提升代码安全性和保护知识产权方面的重要性。我们将介绍几款流行的Java代码加密混淆工具,如ProGuard、DexGuard、Jscrambler、DashO和ipaguard,并分析它们的功能和适用场景,旨在帮助开发者选择......
  • 10大漏洞评估和渗透测试工具【附安装包】
    1、NetsparkerSecurityScanner专为企业设计的强大的漏洞扫描和管理工具,它可以检测和利用SQL注入和XSS等漏洞。https://www.netsparker.com/product/2、AcunetixScanner针对中小型企业的Web应用程序漏洞扫描程序,但也可以扩展到更大的组织。它可以检测SQL注入......
  • 自己动手做一个批量doc转换为docx文件的小工具
    前言最近遇到了一个需求,就是要把大量的doc格式文件转换为docx文件,因此就动手做了一个批量转换的小工具。背景doc文件是什么?"doc"文件是一种常见的文件格式,通常用于存储文本文档。它是MicrosoftWord文档的文件扩展名。"doc"是"document"的缩写,表示这是一个文档文件。这......
  • pinia——vue3的状态管理工具
    简介Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态。主要优点Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑......
  • 三款.NET代码混淆工具比较分析:ConfuserEx、Obfuscar和Ipa Guard
    ​随着.NET应用程序的广泛应用,保护知识产权和防止逆向工程的需求逐渐增长。本文将详细介绍三款知名的.NET代码混淆工具:ConfuserEx、Obfuscar和IpaGuard,帮助读者全面了解其功能特点和应用场景。一、ConfuserExConfuserEx是一个.NET代码混淆工具,支持多种混淆技术,包括控制流混淆......
  • 线程同步,命令行程序创建承载WPF程序运行的另一种实现
    WPFApplication类WPFApplication类是WPF应用程序的核心。它负责管理应用程序的生命周期、创建和管理应用程序的主窗口、处理应用程序事件以及提供对应用程序资源的访问。主要方法和属性WPFApplication类包含以下主要方法和属性:构造函数: 构造函数用于初始化应用程序......