馃棑 Publicado el 5 de diciembre de 2022
Shell scripts FTW! 馃悮 馃摐
Cada proyecto de node debe tener un archivo package.json en el que se especifican propiedades del proyecto, entre las cuales est谩 la versi贸n del mismo. Este par谩metro usualmente est谩 indicado por tres n煤meros separados por puntos, los cuales indican el n煤mero mayor, menor y versi贸n de parche, por ejemplo:
{
name: "myNodeProject",
version: "1.2.3"
}
En este caso:
1 es el n煤mero de versi贸n mayor. Un incremento en este valor indica cambios grandes en el proyecto, posiblemente con incompatibilidad entre versiones del mismo.2 es el n煤mero de versi贸n menor y un incremento en este n煤mero puede indicar nuevas funcionalidades en el proyecto, pero no implican incompatibilidad entre versiones.3 es el n煤mero de parche de esta versi贸n y suele indicar correcciones de errores o mejoras menores.Usualmente se tiene que incrementar este n煤mero de alguna manera en alg煤n momento del desarrollo del proyecto.
En un trabajo anterior era frecuente que yo olvidara hacer este incremento de versiones, que usualmente ten铆a que hacerse en el archivo package.json pero bien podr铆a ser en otro archivo, por ejemplo el app.json de proyectos de React Native con Expo, o en general cualquier archivo de texto, no necesariamente con contenido JSON. Dada esta situaci贸n de olvidar hacer este incremento, me decid铆 a automatizar esta tarea repetitiva e implement茅 una soluci贸n basada en Git Hooks, Husky y AWK.
Utilizamos Husky para ejecutar un script de bash cuando se ejecuta un git hook en nuestro proyecto, en este caso el pre-commit hook, el cual se activa antes de realizar un commit de git.
El script en cuesti贸n es 茅ste:
{
"scripts": {
"versionIncrease": "awk -F'[\"]' -v OFS='\"' '/\"version\":/{split($4,a,\".\");$4=a[1]\".\"a[2]\".\"a[3]+1};1' ./package.json > ./package2.json && mv ./package2.json ./package.json"
}
}
Se cre贸 ese script en el package.json del proyecto, el cual hace lo siguiente:
package.json la l铆nea con la cadena "version": y toma el contenido de la l铆nea hasta el caracter " y separa su contenido usando el caracter ., para despu茅s tomar el tercer elemento y sumarle un 1 (asumiendo que el tercer elemento de la versi贸n es un n煤mero).package2.json y posteriormente reemplaza el archivo package.json con el package2.json el cual tiene el incremento de versi贸n.Adicionalmente se agreg贸 esta l铆nea en el package.json para configurar los hooks de husky en el hooksPath de un git submodule que ten铆a el proyecto padre, pero es un caso muy particular.
"postinstall": "cd src/submodule-path && git config core.hooksPath ../../.husky",
El hook de husy creado es el siguiente:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
CURDIR=$(pwd)
BASE=$(basename $CURDIR)
if [[ "$BASE" == "submodule-path" ]];
then
echo "submodule precommit hook:";
yarn run versionIncrease && yarn lint-staged && git add package.json
else
echo "$BASE precommit hook:";
yarn run anotherCommand && yarn run versionIncrease && yarn lint-staged && git add app.json package.json
fi
Este script es el que ejecuta los scripts de AWK especificados en el pacakge.json, tiene una condici贸n para identificar si el pre-commit hook est谩 siendo ejecutado en el directorio del proyecto padre, o el del subm贸dulo (pero es un caso muy particular) y dependiendo de esto ejecuta diferentes comandos, aunque al final de ambos se ejecuta el linter del proyecto y se agregan los cambios generados por los scripts al stage area de git, para que sean incluidos en el commit actual.
