搭建个人脚手架

1 前言

1.1 目的

使项目快速进入开发阶段,解决万事开头难的问题

1.2 最终效果

通过运行命令,从远端下载代码模板,并能自定义文件夹名称、package.json的部分信息

2 目录结构

GitHub
Gitee

├── package.json
├── template.json
├── node_modules
├── bin
│   └── yana-cli.js                                     # 命令脚本
├── lib
│   ├── util
│   │   ├── generator.js
│   │   └── git-user.js
│   ├── create.js                                       # 选择一个模板生成项目
│   └── list.js                                         # 查看模板列表

3 创建命令

尽量不要使用 Git Bash ,可能会有箭头、颜色等失效问题,直接使用 CMD

3.1 package.json 文件初始化

$ npm init --yes

3.2 新建 yana-cli.js

  • 根目录下新建 bin 文件夹
  • 在 bin 文件夹下新建 yana-cli.js
  • 将以下内容粘贴到 yana-cli.js
#! usr/bin/env node
console.log(process.argv)

#! usr/bin/env node :这行代码不可删除,告诉系统当前脚本由 Node.js 来解析执行

3.3 添加命令路径

在根目录下找到 package.json ,添加 bin 字段

"bin": {
  "yana-cli": "bin/yana-cli.js"
}

3.4 添加软链接

$ npm link
  • 执行该命令,增加软链接到全局,成功后可直接全局使用 yana-cli
  • 若该命令执行失败,可以在网上查看对应解决方案
  • 最终无法成功执行,可直接使用 node bin/yana-cli 代替后续 yana-cli 执行命令

3.5 测试命令

$ yana-cli

成功输出以下内容

[
  'xxx\xxx\node.exe',
  'xxx\xxx\bin\yana-cli'
]

4 简化命令解析

4.1 安装 commander

$ npm i commander

4.2 修改 yana-cli.js 文件

#! /usr/bin/env node
const program = require('commander')
const config = require('../package.json')

program.version(config.version, '-v, --version')

// 定义使用方法
program
  .command('create')
  .description('选择模板生成项目')
  .action(() => {
    require('../lib/create')
  })

program
  .command('list')
  .description('查看当前可用模板')
  .action(() => {
    require('../lib/list')
  })

// 解析参数
program.parse(process.argv)
if (!program.args.length) {
  program.help()
}

执行 yana-cli 输出以下内容


2022070501.png

5 新增list命令

5.1 新建 list.js 文件

  • 根目录下新建 lib 文件夹
  • 在 lib 文件夹下新建 list.js
  • 将以下内容粘贴到 list.js
const template = require('../template.json')

console.log('当前模板列表如下:\n')
console.log(template)

5.2 新建 template.json 文件

  • 根目录下新建 template.json 文件
  • 将以下内容粘贴到 template.json
{"vue3-project-template":"https://gitee.com/YanaDH/vue3-project-template.git"}

执行 yana-cli list 输出以下内容


2022070502.png

6 新增create命令

6.1 安装插件

$ npm i download-git-repo inquirer handlebars
  • download-git-repo :执行 git clone 克隆模板仓库
  • inquirer 根据用户输入内容自定义模板
  • handlebars 替换 package.json 中项目元信息

package.json 指的是 template.json 文件配置的vue3-project-template模板仓库里的 package.json 文件,需要被替换的地方需要使用{{}}包裹起来

2022070503.png

6.2 新建 create.js

  • 在 lib 文件夹下新建 create.js
  • 将以下内容粘贴到 create.js
const templateUrl = require('../template.json')['vue3-project-template']
const download = require('download-git-repo')
const inquirer = require('inquirer')
// 新增项
const fs = require('fs')
const path = require('path')
const handlebars = require('handlebars')

download(`direct:${templateUrl}`, 'tmp', { clone: true }, (err) => {
  if (err) return
  const packagePath = path.join(__dirname, '../', '/tmp/package.json')
  const content = JSON.stringify(require(packagePath), '', '\t')
  const template = handlebars.compile(content)
  inquirer
    .prompt([
      { name: 'name', message: '请输入项目名称' },
      { name: 'description', message: '请输入项目描述' },
      { name: 'author', message: '请输入项目作者' },
    ])
    .then((params) => {
      const result = template(params)
      fs.writeFileSync(packagePath, result)
      console.log(params)
    })
})

6.3 create 命令测试

$ yana-cli create

若 inquirer 报错,则降低 inquirer 版本为8.2.4


2022070504.png

终端输出以下内容


2022070505.png

对应目录生成 tmp 文件夹,且下载下来的模板仓库 package.json 文件中 name、description、author 为刚刚输入内容
2022070506.png

7 发布NPM包

若没有npm账号,需要先注册一个

# 1. 登录npm,输入用户名、密码
$ npm login
# 2. 发布
$ npm publish

发布成功后可直接通过 npm i yana-cli 进行安装

8 脚手架优化

GitHub
Gitee

8.1 安装插件

$ npm i chalk ora metalsmith
  • chalk :给控制台打印内容添加颜色
  • ora :给控制台打印内容添加loading
  • metalsmith :自定义文件夹名称

8.2 新增 generator.js 文件

替换 package.json 文件中的 name、description、author

  • 在 bin 文件夹下 util 文件夹
  • 在 util 文件夹下新建 generator.js 文件
  • 链接内容粘贴到 generator.js

8.3 新增 git-user.js 文件

直接将 package.json 文件中的 author 设置为本地 Git 配置的用户名

  • 在 util 文件夹下新建 git-user.js 文件
  • 链接内容粘贴到 git-user.js

8.4 修改 create.js 文件中

控制台增加颜色、loading等显示
链接内容粘贴到 create.js

$ yana-cli create
  • 若 ora 报错,则将 ora 版本降为8.2.4
  • 若 chalk 报错,则将 chalk 版本降为4.1.1


    2022070507.png

9 自动部署

9.1 获取 NPM TOKEN

npm生成 NPM TOKEN

2022070508.png
2022070509.png
2022070510.png

9.2 配置 NPM TOKEN

将 yana-cli 脚手架项目推到 GitHub ,并将生成的 NPM TOKEN 配置到 GitHub 对应仓库


2022070511.png

9.3 添加 Action 脚本

2022070512.png
2022070513.png
  • 将以下内容粘贴到 mian.yml
  • 其中NODE_AUTH_TOKEN对应的值secrets.npm_tokennpm_token需要与上一步骤配置的NPM TOKEN 名称一致
  • 当有代码 push 到仓库时, Action 脚本将会自动执行,将包发布到 NPM
name: Publish To Npm
on:
  push:
    branches: [ "master" ]
 
jobs:
  publish-npm:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: "12.x"
          registry-url: https://registry.npmjs.org/
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.npm_token}}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容