Stories

Detail Return Return

NPM 自動更新版本號 - Stories Detail

本文首發於 YFun's Blog

前言

ChenYFan 大佬的文章:SpeedUp!使用黑科技為你的網站提速 有提到過將 Hexo 博客的全部靜態文件上傳至 NPM 達到加速效果。

但是 NPM 版本號不能重複,而且為了精準命中緩存和防止邊緣 @latest 緩存過長,就必須指定版本號。

本人在 我的圖牀解決方案 一文中使用的方法是 npm version patch

image.png

但這個方法也有一些弊端,比如 patch 只會更新 z 位數的版本號,而且並不會上傳至倉庫,很可能會出現版本號衝突導致上傳失敗。這就是為什麼最後還需要重新推送 Git 提交。

試試看

NPM 版本號遵循 semver 規範,格式為 major.minor.patch

為了在獲取最新版本號的時候不發生混亂,我選擇先獲取最新的版本號。

記得把 cky-blog-static 改成自己的項目名。
const getVersion = async() => {
    const latestVersion = await fetch("https://registry.npmjs.org/cky-blog-static/latest").then(res => res.json()).then(res => {
        return res.version;
    })
    return latestVersion;
}

獲取到最新版本號後,就可以對版本號進行分析。

1.4.7-b541af2ea284a39da0bbf63b88fdb65c 為例,先按 major.minor.patch 分離。當然,也需要考慮版本號後還有 build metadata 的情況。

const version = await getVersion();
var verArray = version.split(".");
verArray[2] = verArray[2].split("-")[0];

為了版本號好看些 ,可以通過判斷實現滿十進一。

if (verArray[2] < 9) {
    // z 位小於 9,直接 +1
    verArray[2] = String(Number(verArray[2])+1);
} else if (verArray[1] < 9) {
    // z 位大於等於 9,y 位小於 9,y+1, z=0
    verArray[1] = String(Number(verArray[1])+1);
    verArray[2] = 0;
} else {
    // z 大於等於 9,y 大於等於 9,x+1,y=0,z=0
    verArray[0] = String(Number(verArray[0])+1);
    verArray[1] = 0;
    verArray[2] = 0;
}

最後,重新拼接版本號。如果擔心服務器緩存版本號導致衝突,還可以加上一些隨機字符串。

var newVersion = `${verArray[0]}.${verArray[1]}.${verArray[2]}`
var newVersion = newVersion + "-" + md5(`${new Date().getTime()}${newVersion}`);

將最新的版本號信息重新寫入 package.json 文件:

var packageJson = fs.readFileSync("./package.json");
var packageJson = JSON.parse(packageJson);
packageJson.version = newVersion;
var newPackage = JSON.stringify(packageJson);
fs.writeFileSync("./package.json", newPackage);

代碼

直接 CV 代碼!

/**
 * 更新 package.json 版本號
 */
const fetch = require("node-fetch");
const md5 = require("js-md5");
const fs = require("fs");

const getVersion = async() => {
    const latestVersion = await fetch("https://registry.npmjs.org/cky-blog-static/latest").then(res => res.json()).then(res => {
        return res.version;
    })
    return latestVersion;
}

const update = async() => {
    const version = await getVersion();
    var verArray = version.split(".");
    verArray[2] = verArray[2].split("-")[0];
    if (verArray[2] < 9) {
        verArray[2] = String(Number(verArray[2])+1);
    } else if (verArray[1] < 9) {
        verArray[1] = String(Number(verArray[1])+1);
        verArray[2] = 0;
    } else {
        verArray[0] = String(Number(verArray[0])+1);
        verArray[1] = 0;
        verArray[2] = 0;
    }
    var newVersion = `${verArray[0]}.${verArray[1]}.${verArray[2]}`
    var newVersion = newVersion + "-" + md5(`${new Date().getTime()}${newVersion}`);
    console.log(newVersion);
    var packageJson = fs.readFileSync("./package.json");
    var packageJson = JSON.parse(packageJson);
    packageJson.version = newVersion;
    var newPackage = JSON.stringify(packageJson);
    fs.writeFileSync("./package.json", newPackage);
    console.log("Complete!!");
}

update();

最後

如果是 Hexo 文件部署,就可以直接把文件直接丟在項目根目錄,Action 集成部署加上:

node update.js

image.png

Blog 半年沒更新,除除草 --(....

Add a new Comments

Some HTML is okay.