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?