𝗣𝗮𝗰𝗸𝗮𝗴𝗲.𝗷𝘀𝗼𝗻 𝘃𝘀 𝗚𝗼.𝗺𝗼𝗱: ¿𝗔 𝗱ó𝗻𝗱𝗲 𝘀𝗲 𝗳𝘂𝗲 𝗲𝗹 𝗰𝗮𝗺𝗽𝗼 𝗱𝗲 𝘃𝗲𝗿𝘀𝗶ó𝗻?

Si pasas de JavaScript a Go, una cosa te sorprenderá.

En un archivo package.json, la versión está justo al principio. Puedes leerla. Puedes cambiarla en un pull request. Puedes buscarla. Es un hecho que vive dentro de tu código.

Ahora abre un archivo go.mod. La versión no está ahí.

Esto no es un error. Es una elección.

Go no utiliza un campo de versión para tu propio módulo. En su lugar, Go utiliza git tags.

Para establecer una versión en Go, haces esto:

El git tag es la única fuente de verdad. Cuando alguien ejecuta go get, Go busca en los tags de tu repositorio para encontrar el commit correcto.

Este diseño tiene una gran fortaleza. Una versión nunca puede apuntar al código incorrecto. En npm, el código publicado y el código fuente etiquetado pueden desincronizarse. En Go, son lo mismo porque la versión es un puntero a un commit.

Sin embargo, esto cambia tu flujo de trabajo de varias maneras:

La mayoría de los demás ecosistemas mantienen la versión en un archivo:

Go es diferente. Depende únicamente de los git tags.

Si quieres que tu binario de Go muestre una versión limpia, puedes inyectarla durante el proceso de compilación usando ldflags. Muchos desarrolladores también utilizan herramientas como goreleaser para automatizar el proceso de etiquetado y lanzamiento.

Los dos modelos representan prioridades diferentes:

Go eligió el modelo de tags para asegurar que el manifiesto siempre coincida con el código.

Para quienes distribuyen código Go: ¿Cómo les resulta el modelo basado únicamente en etiquetas en su trabajo diario? ¿Lo cambiarían?

Fuente: https://dev.to/dalirnet/packagejson-vs-gomod-where-did-the-version-field-go-3301