乐趣区

关于npm:Git管理使用shell脚本和nodejs实现快速commit和打tag

思考
前端应用 npm 和 git 进行开发工作时,会有版本号或者变更须要同步更新提交。通过 commit 提交更新信息时,是不是能够将 commit 信息利用起来,成为咱们工作时变更的版本日志数据?

话不多说,码上分享。

应用形式

执行命令:sh bin/commit.sh

运行步骤

1. 输出 commit 信息
2. 抉择更新类型
3. 抉择是否提交 tag

实现形式

一、创立相干文件


bin/commit.sh           // 执行脚本
bin/commit.js           // 日志文件更新
bin/version.js          //package.json 版本更新
bin/version_log.json    // 版本日志文件
package.json    //npm 依赖配置文件

二、要害代码


先带大家看一下版本日志文件 version_log.json

[
  {
    "date": "2021-01-01 00:00:00",
    "version": "0.0.1",
    "commit": "[更新]创立提交命令及更新日志脚本测试"
  }
]

这是一个规范的 json 格式文件,通过数组将版本信息存入其中,因为我是将最新的版本放到数组尾部,所以每次只须要提取最初一个匹配到的 version 信息进行辨认版本号操作

接下来是要害的 sh 命令,和开发者产生交互,由开发者填写本次的版本更新日志,抉择更新版本的类型,以及是否进行 tag 标签提交的选项

#!/bin/bash

cd bin/
#========= 读取最初一个版本信息 =========
versions=($(cat ./version_log.json | awk -F 'version' '/version/{print$0}' | sed 's/ //g'  ))
versions_length=${#versions[@]}
newest_version_str=${versions[versions_length-1]}
newest_version_str_length=${#newest_version_str}
#获取字符前面索引值
newest_version_str_length_end=$[newest_version_str_length-2-11]
old_version=${newest_version_str:11:$newest_version_str_length_end}
versionArr=[]
v=${old_version//./}
index=0
for i in $v; do
    versionArr[index]=$i
    index=$[index+1]
done

read -p  "请提交变动信息:" commit_msg
#========= 执行更新类别抉择(默认 bug 修复)=========
commitPrefix="[修复]"
echo "====== 1. 迭代 ======"
echo "====== 2. 更新  ======"
echo "====== 3. 修复 ======"
read -p  "请抉择变动类型 (默认:3) :" level

case $level in
    1)  echo '您已抉择版本迭代'
    versionArr[0]=$[versionArr[0]+1]
    versionArr[1]=0
    versionArr[2]=0
    commit="[迭代]"$commit_msg
    ;;
    2)  echo '您已抉择小更新'
    versionArr[1]=$[versionArr[1]+1]
    versionArr[2]=0
    commit="[更新]"$commit_msg
    ;;
    3)  echo '您已抉择修复'
    versionArr[2]=$[versionArr[2]+1]
    commit="[修复]"$commit_msg
    ;;
    *)  echo '您已默认抉择修复'
    versionArr[2]=$[versionArr[2]+1]
    commit="[修复]"$commit_msg
    ;;
esac
now_date=`date "+%Y-%m-%d_%H:%M:%S"`
echo $now_date
version=${versionArr[0]}'.'${versionArr[1]}'.'${versionArr[2]}
echo $version
addInfo="{\"date\":\"$now_date\",\"version\":\"$version\",\"commit\":\"$commit\"}"

#========= 更新版本日志文件信息 =========
node commit $addInfo
#同步更新 package.json 版本号
node version
git commit -am $commit

read -p  "是否增加 Tag(Git)1/0:" is_add_tag
echo $is_add_tag
if(($is_add_tag == 1))
then
  echo "您已抉择推送 Git 标签, 行将执行..."
  git tag $version
  git push origin --tags dev
else
  echo "您未抉择推送 Git 标签, 行将完结..."
  git push origin dev
fi

exit 1

而后是对两个 json 文件的读写操作 node 命令

commit.js

// 减少更新系统日志性能
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
const path = require("path");
const fs = require('fs')
var versionStr = ""
if (!process.argv[2]) {process.exit()
  return console.error('[打包告诉]未获取到版本信息流, 重写失败', err)
}
versionStr = process.argv[2]   
fs.readFile(path.join(__dirname, './version_log.json'), (err, data) => {if (err) {process.exit()
    return console.error("[打包告诉]文件读取异样:" + err)
  }

  let packagesConfig = JSON.parse(data)
  packagesConfig.push(JSON.parse(versionStr))
  fs.writeFile(path.join(__dirname, './version_log.json'), JSON.stringify(packagesConfig), (err, result) => {if (err) {return console.error('[打包告诉]version_log.json 重写失败', err)
    }
    process.exit()
    return console.log('[打包告诉]version_log.json 版本更新胜利')
  })
})

verison.js

const path = require("path");
const fs = require('fs')

fs.readFile(path.join(__dirname, '../package.json'), (readFilePackageError, packages) => {if (readFilePackageError) {process.exit()
    return console.error("[打包告诉]读取 package.json 谬误:" + readFilePackageError)
  }
  let newVersion
  fs.readFile(path.join(__dirname, './version_log.json'), (readFileLogError, logs) => {if (readFileLogError) {process.exit()
      return console.error("[打包告诉]读取开发日志产生谬误:" + readFileLogError)
    }
    let logData = JSON.parse(logs)
    newVersion = logData.pop().version
    console.log('[打包告诉]以后最新开发日志版本:V' + newVersion)

    let packagesConfig = JSON.parse(packages)
    packagesConfig.version = newVersion

    fs.writeFile(path.join(__dirname, '../package.json'), JSON.stringify(packagesConfig), (err, result) => {if (err) {return console.error('[打包告诉]package.json 重写失败', err)
      }
      process.exit()
      return console.log('[打包告诉]package.json 版本更新胜利')
    })

  })
})

原创内容,未经容许禁止转载!

退出移动版