10 lut 2022

#shorts - szybki update wersji biblioteki we wszystkich plikach

Mam zawsze problem z tym, że zapominam zmienić wersję biblioteki we wszystkich miejscach w których występuje wzmianka o niej.
Dopiero na koniec gdy wszystko już zakomitowałem na githuba okazuje się że czegoś znowu nie zmieniłem 😉

Postanowiłem temu zapobiec i stworzyłem sobie mały skrypt - version.js

Skrypt na wrzucam do foldera scripts w głównym folderze projektu. I za każdym razem wywołuję przez dodanie do package.json w sekcji script przy budowaniu produkcyjnym.

"scripts": {
  ...
  "prod": "yarn build && yarn sass:prod && yarn lib:version",
  "lib:version": "node ./scripts/version.js",
  ...
},

Skrypt jest dość prosty, otwiera pliki, szuka odpowiedniego stringu i go zamienia na nowy. Ten nowy string pochodzi z package.json czyli version które zadeklarowaliśmy.

const fs = require("fs");

const pkg = require("./package.json");

// pobieramy nową wersję (numer biblioteki) z pliku package
const newVersion = pkg.version;

function updateVersion(file, newVersion) {
  fs.readFile(file, "utf8", function (err, data) {
    if (err) {
      return console.log(err);
    }
  
    // znajdź nasz string do zmienienia
    // w wyniku otrzymamy string znajdujący się miedzy @ - /dist/
    // 1.7.3
    const matches = data.match(/\@(.*?)\/dist/i)[1];

    // zmień wszystkie znaki . na \.
    // 1\.7\.3
    const reg = new RegExp(matches.replace(/\./g, "\\."), "g")

    // zmień wszystkie wystąpienia stringu na nową wersję
    // 1\.7\.3 na 1.7.4
    const result = data.replace(reg, newVersion);

    // zapisz ponownie treść
    fs.writeFile(file, result, "utf8", function (err) {
      if (err) return console.log(err);
    });
  });
}

// deklarujemy wszystkie pliki do zmiany
const someFiles = ["README.md", "docs/index.html"];

// w pętli uruchamiamy funkcję
someFiles.forEach((file) => {
  updateVersion(file, newVersion);
});

Jeszcze jedna uwaga, szukam do pierwszego wystąpienia: const matches = data.match(/\@(.*?)\/dist/i)[1]; i stosuję dla całego pliku.
Jeżeli w tekście mamy powiedzmy kilka wersji to będzie wyszukiwana tylko ta pierwsza i reszta nie zostanie zmieniona. Zakładam z góry że wszędzie wersja jest identyczna.
Dlaczego stosuję do pierwszego wystąpienia, z prostej przyczyny. Bo mam też np. blibotękę pollyfill w treści z identycznym zapisem @8/dist
Więc gdybym nie zrobił do pierwszego wystąpienia pasującego stringu to również i ta biblioteka by została zmieniona, a tego bym nie chciał.

I to by było na tyle 😉

A może ktoś z was rozwiązał to w jakiś inny mniej inwazyjny sposób?