个人脚手架搭建 -- charmingsong-cli 看看对不

目的

为了解决多次构建相同功能的项目,在一定程度上需要定制化以及私有化设置

设计

问题

为什么不用现成的脚手架生成?

  • 如果利用vue或者react的脚手架搭建项目可能创建完项目后还需要一系列的配置以及更改展示样式,并没有真正的解决问题。并且各自的脚手架只能生成各自的框架结构,其他项目不支持。例如,用vue-cli生成一个react项目,是不可以的。

为什么不直接复制相同的项目?

  • 现有的项目中逻辑代码关联性很强,并且项目中可能存在一些基于项目环境的代码,直接复制项目更改名称工程量较大。环境错误不易发觉。

整体思路

为完成所需功能,主要需要实现两个模块

  • 工具——cli
  • 模板——template

cli: 就是和用户交互部分的工具, 需要知道用户所需。

template: 项目模板,可以自己随意定制。

设计目的
  • 模板与工具分开,各自单独维护
  • cli负责获取模板列表,下载、渲染模板
    • 模板可以自行增加删除修改,不需要重新发版新的包
    • 项目逻辑都放到模板中,模板可以设计私有化属性
cli 工作流程图

启程

代码是利用typescript实现的,具体代码可以查看项目地址 charmingsong-cli

文章不会用大量的代码填充讲解,主要会记录一些功能性模块代码

目录结构

.
├── .DS_Store
├── .eslintrc.json
├── .gitignore
├── .npmignore
├── .npmrc
├── README.md
├── cs-config.json
├── package-lock.json
├── package.json
├── src
│   ├── index.ts
│   ├── libs
│   │   ├── inquirer.ts
│   │   ├── program.ts
│   │   └── tools.ts
│   ├── typing.d.ts
│   └── utils
│       └── logger.ts
├── tsconfig.json
└── yarn.lock
  • tsconfig.json: ts 的配置文件,可以查询官网,了解的具体设置。
  • package.json
    // ...
    "scripts": {
      "build": "tsc", // 打包
      "dev": "tsc -w", // 开发调试
      "eslint": "eslint src --ext .ts", // eslint 检查以 .ts 为后缀的文件
      // ...
    },
    "bin": {
      "cs": "bin/index.js"
      // 全局安装(npm i -g xxx) 全局运行时执行的文件 然后全局就可以使用命令 cs
    },
    "husky": {
      "hooks": {
        "pre-commit": "npm run eslint"
        // 主要是为了在提交commit的时候检测代码是否符合标准,如果感兴趣可以了解一下husky
      }
    },
    // ...
    
    > [husky](https://github.com/typicode/husky)
  • src/: 代码文件目录
    • index.ts : 主文件

      #!/usr/bin/env node
      
      // ...

      全局安装运行命令式, 在文件开头加上 #!/usr/bin/env node 在直接运行时会用本机中的 node环境来运行文件。

    • typing.d.ts: typescript的描述文件,个人理解就是用来将一些没有ts全局获取不到的包, 定义个环境提供给typescript 。 (深入学习 ts 后来补充 xxx.d.ts 文件所代表的意义)
    • utils/:公共方法目录
      • logger.ts : 提供一个在终端输出特殊样式的方法
    • libs/:环境工具目录
      • program.ts: 终端命令定义工具, 主要就是使用commander包,对其进行私有化设置封装
      • inquirer.ts:终端交互式界面提示工具,获取用户的自定义信息,利用inquirer来实现,和 终端命令定义工具 搭配使用。
      • tools.ts:主要提供流程需要的函数方法, 如:下载模板,渲染模板等

实现流程

项目地址已经贴出来了, 所以不讲解每个文件的代码实现逻辑

因为每个文件都是各司其职, 这里只记录主文件的实现逻辑

主文件解读

建议不懂的包自行去官网看一下,一方面不论我怎么讲解都没有官网讲解的深刻全面,另一方面我可能有的地方也不是很了解其原理本质,如果有错误的地方,欢迎指出,共同进步

  1. 利用commander包全局注册一个 init 的命令

    import program from ‘./libs/program‘
    // ./libs/program文件就是对commander设置了一下基本信息,然后重命名、引入
    
    async function commandInit(appName: string) {}
    
    program.command(‘init <project-name>‘).action((appName: string) => {
      commandInit(appName)
    })
    
    // commander 的用法,可以设置命令行的参数
    // 当用户输入 之前 cs init xxx 的时候
    //   cs ==> package.json文件的设置的环境变量 我设置名称是  cs
    //   init ==> 是 cs 后面带的命令, 这里设置的是 init
    //   xxx ==> 这里是指文件名,是用户输入的参数,此处用法 commander 包有关, 建议仔细看一下用法
    //  commandInit ==> 如果用户输入命令是 init 时所执行的函数。
    
    program.parse(process.argv)
    // 将node的环境变量给 program ,简单来说就是将终端参数交个 commander 来解析
    
    if (!process.argv.slice(2).length) {
      program.outputHelp()
    }
    // 这里是对 cs 命令的 提示帮助, 如果用户在终端只输入 cs ,而不输入命令 那么展示 提示信息
  2. 实现定义的命令函数 commandInit
    import { join } from ‘path‘
    import { existsSync, mkdirSync } from ‘fs‘
    
    import Logger from ‘./utils/logger‘ // 在终端输出信息,可以捕捉错误
    
    import {
      downTemplate, // 下载模板方法
      getMetaJson, // 下载需要的初始json文件方法
      writeTemplate // 渲染文件方法
    } from ‘./libs/tools‘
    // ./libs/tools 是方法库,具体的代码实现可以参考源代码。
    
    import prompt from ‘./libs/inquirer‘ // inquirer封装,终端交互的工具
    
    import { metaName } from ‘../cs-config.json‘
    // 获取 inquirer 所需要初始化的json信息,也就是最开始提问的json
    
    async function commandInit(appName: string) {
      const targetDir = join(process.cwd(), appName)
      // 查看目标目录是否存在
    
      existsSync(targetDir)
        ? Logger.fatal(‘The current directory already exists --> %s ‘, appName)
        : mkdirSync(targetDir)
      // 存在就对用户,输出错误提示:目录存在, 如果不存在,就创建用户所输入的名称的文件夹
    
      const baseInfo: MetaInfoMust = await prompt(await getMetaJson())
      // 获取 模板列表的json 提供给 prompt,来和用户进行交互
    
      const { template } = baseInfo
      // 获取用户选择的模板信息
    
      const templatePath = (await downTemplate(template)) as string
      Logger.success(‘template download success!‘)
      // 下载目标模板到本地, 并提示成功信息
    
      const templateMetaPath = join(templatePath, metaName)
    
      const templateMetaInfo = existsSync(templateMetaPath)
        ? await prompt(require(templateMetaPath))
        : {}
      // 如果模板中需要自定义设置, 读取配置,在和用户交互
    
      const metaInfo = { ...baseInfo, ...templateMetaInfo }
      // 获取两次的交互所得的用户信息
    
      await writeTemplate(templatePath, metaInfo, targetDir)
      Logger.success(‘success ok!‘)
      // 根据获取的用户自定义信息,向开始创建的目标目录写入、渲染模板并提示成功信息
    
      process.exit(1)
      // 退出命令程序
    }

模板的设计

模板类型是根据github纪录的模板类型

模板类型以 cs-templates-xxx格式命名,可用模板列表可自行查看本项目 master_meta分支

模板开发规则

可自行添加模板

目录
.
├── README.md
├── meta.json
└── template

模板写入利用 handlebars,

例如:

{
  "name": "{{projectName}}",
  "version": "{{version}}",
  "description": "{{description}}"
}
默认交互

模板名称--template

项目名称--projectName

简介描述--description

版本--version

自定义交互

可以自行配置meta.json,依据inquirer语法配置, 自动解析。

例如:

[
  {
    "name": "testname",
    "type": "input",
    "message": "测试",
    "default": "test"
  }
]

结语

设计这个脚手架大部分是为了锻炼自己的编程思想,写这篇文章也是为了能在提升自己的语言组织能力的同时帮助到小伙伴们。 个人网站也是用这个 cli 中的 基于vue-ssr 模板搭建的, 有兴趣的可以看一下个人网站

原文地址:https://www.cnblogs.com/625iim8/p/12121882.html

时间: 2024-07-30 02:24:07

个人脚手架搭建 -- charmingsong-cli 看看对不的相关文章

vue-cli3.0 脚手架搭建项目的过程详解

1.安装vue-cli 3.0 ? 1 2 3 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) 2.命令变化 ? 1 vue create --help 用法:create [options] <app-name> 创建一个由 `vue-cli-service` 提供支持的新项目 选项: -p, --preset <presetName>       忽略提示符并使用已保存的或

在windows下用脚手架搭建vue环境

做了几个月vue项目,最近两个项目使用脚手架搭建的,确实用脚手架搭建方便了许多,想想以前自己手配的时候,确实是... 1.在这之前我是默认你已经使用过vue的,也默认你已经安装了node.js 2.接着安装全局的vue-cli脚手架,用于帮助搭建所需的模板框架 3.命令为:cnpm install -g vue-cli,回车,等待安装 安装完后,可以输入vue,然后回车,如果出现vue的信息,则说明安装成功了. 4.紧接着,就该创建项目了,自己找一个合适的地方,新建一个项目文件夹,根据自己的需要

用vue-cli脚手架搭建一个仿网易云音乐的全家桶vue项目

一,vue-cli环境搭建 1,全局安装webpack npm install webpack -g 2,安装vue脚手架 npm install vue-cli -g 3,新建一个新的project,终端定位到该项目下 4,初始化项目 vue init webpack-simple 会让你进行该项目的一些基本设置,如下图 5,安装项目依赖 npm install 6,启动项目 npm run dev 可以看到终端提示成功 在浏览器上打开localhost:8080/#/可以看到如下图所示,说明

react脚手架搭建1

23:01:17 react脚手架搭建 (个人用的是webstorm,所以分享下webstorm中的创建react脚手架项目的方法) 1.创建新项目(前提是下载nodejs环境) 2.下载好在webstorm中右键自己创建的项目目录,菜单中会出现一个命令行工具,点进去   然后    npm start 开启服务 3.在浏览器中打开 http://localhost:3000/ 可以看见react的默认页面 初步的搭建完成,开始自己写东西 原文地址:https://www.cnblogs.com

react脚手架搭建

react脚手架搭建 [转]https://blog.csdn.net/weixin_41421227/article/details/80875544 由于我们在安装的过程中要使用到npm  因此需要先前安装好node.js 直接到官方下载即可  一般建议大家下载稳定版的(左边那个!) 知道你们懒,咯官网戳→_→  node.js官网:https://nodejs.org/en/ 判断安装成功与否的标志↓ 打开cmd命令行,输入 node -v 和 npm -v 来查看版本号,如果显示则安装完

用 vue cli 脚手架搭建单页面 Vue 应用(进阶2)

1.配置 Node 环境. 自行百度吧. 安装好了之后,打开 cmd .运行 node -v .显示版本号,就是安装成功了. 注:不要安装8.0.0以上的版本,和 vue-cli 不兼容. 我使用的 6.10.3 的版本,相对稳定. 2.使用 npm 管理依赖 使用 node 自带的包管理工具 npm 管理项目中的依赖,由于 npm 的服务器在国外.经常会遇到速度奇慢或者下载不下来依赖的情况,所以推荐使用淘宝镜像. npm install-g cnpm--registry=https://reg

如何用vue-cli3脚手架搭建一个基于ts的基础脚手架

目录 准备工作 搭建项目 vue 中 ts 语法 项目代理及 webpack 性能优化 其他 忙里偷闲,整理了一下关于如何借助 vue-cli3 搭建 ts + 装饰器 的脚手架,并如何自定义 webpack 配置,优化. 准备工作 @vue/[email protected] vue 2.6 node v12.13.0 安装 node 安装 node 全局安装 nrm,npm 的镜像源管理工具. npm i nrm -g // 安装 nrm ls // 查看可用源,及当前源,带*的是当前使用的

【vuejs小项目】一、脚手架搭建工作

一.关于vuejs 这是一个MVVM的前端开发框架,model(数据).viewmode(通讯).view(视图),它吸取了reactjs和angularjs的长处,核心重点在于组件化的设计原则. 我们都知道一个普通常见的页面,他会由header,body,footer,组成,里面再细分还有nav,list,slidebar等等,组件化就是将这些会重复用到的代码封装起来,在一个页面中需要用到的时候进行引入. 二.搭建脚手架(初始化项目) 做一个项目开始将一些文件环境搭建好,这里vue提供了vue

vue.js学习vue-cli脚手架搭建

1.环境搭建. 前提必须安装node.js,安装方式百度搜索.Node.js方便npm的使用.最好安装最新版本的node.js.npm是随同NodeJS一起安装的包管理工具 在你的项目环境下即你项目所在的文件夹下,打开命令行 打开方式:按住shift键,右键单击就出现了, 1)使用vue-cli脚手架工具构建 安装vue-cli:npm install -g vue-cli 2).使用vue-cli初始化项目: 创建一个基于 webpack 模板的新项目 vue init webpack my-