Cómo sabe npm cuál es tu paquete: name, version y dist-tags
Cuando publicas por primera vez en npmjs.com surge la duda: ¿cómo sabe npm que ese tarball es tu paquete y no otro? No adivina nada. La identidad sale de tu package.json y el registro guarda quién publicó qué. Lo cuento con el caso real de tabernaculo, que acabo de publicar.
1. La identidad está en package.json
{ "name": "tabernaculo", "version": "0.2.0" }
name: el nombre público, único en todo npmjs.com. Al publicar la 0.1.0 por primera vez, el nombre estaba libre y quedó reservado a mi cuenta. Desde entonces, solo yo (o a quien añada como maintainer) puede subir algo llamadotabernaculo.version: la edición concreta. Es inmutable: una vez publicado0.1.0, nadie —ni yo— puede volver a subir otro contenido con ese número. Por eso la siguiente fue0.2.0.
2. Qué hace publish por debajo
- Lee
name+versiony empaqueta los ficheros (según el campofiles, másREADMEypackage.jsonsiempre). - Se autentica con tu token (
~/.npmrc) → el registry sabe quién publica. - Comprueba: ¿existe ya
name@version? Si existe → error (cannot publish over existing). Si elnamees nuevo → lo registra a tu cuenta. - Guarda el tarball y mueve el tag
latesta la versión recién publicada.
Eso es todo lo que “sabe” npm: una tabla nombre → versiones → tarballs, más quién tiene permiso sobre cada nombre.
Nota:
bun publishignora el token de~/.npmrcy abre un flujo de auth por navegador. Para publicar de forma no interactiva usénpm publish(respeta el token), y como mi token solo permite staging, el flujo real fuenpm stage publish --otp=<código>+ aprobar en la web de npm. Directo es imposible con ese token (E_STAGE_REQUIRED).
3. Cómo lo encuentra después
npm view tabernaculo,npm install tabernaculoonpx tabernaculo→ el cliente pregunta al registry por el nombre y descarga el tarball de la versión pedida (olatest).npxademás lee el campobin("tabernaculo": "./src/main.ts") para saber qué fichero ejecutar.
Prueba de consumidor real, en un directorio limpio:
npx -y tabernaculo@0.2.0 clis
# descarga el 0.2.0 y lista los 8 CLIs soportados
4. Dist-tags: probar sin romper latest
Un dist-tag es una etiqueta que apunta a una versión, un alias móvil:
tabernaculo:
versions: 0.1.0, 0.2.0
dist-tags: { latest: 0.2.0 }
latest es lo que se instala sin pedir versión. Para probar la 0.3.0 con unos pocos sin afectar al resto:
# pre-release: semver la ordena ANTES que 0.3.0
npm version 0.3.0-beta.0 --no-git-tag-version
# se publica con tag beta → latest SIGUE en 0.2.0
npm stage publish --tag beta --otp=<código>
npm dist-tag ls tabernaculo # ver los tags
npx tabernaculo@beta ... # los testers reciben la beta
npx tabernaculo ... # el resto sigue en la estable
# promocionar a estable sin republicar nada:
npm dist-tag add tabernaculo@0.3.0 latest
npm dist-tag rm tabernaculo beta
Reglas prácticas:
- Mover un tag no sube nada: solo cambia a qué versión apunta. Barato y reversible.
- Sin
--tag, todo va alatest: una beta publicada sin tag contaminaría la estable. - Los tags viven en el registry, no en tu repo: no hay nada que commitear por ellos.
Resumen
| Concepto | Qué es | Ejemplo real |
|---|---|---|
name |
Identidad reservada a tu cuenta | tabernaculo libre → mío desde 0.1.0 |
version |
Edición inmutable | 0.1.0 no se puede republicar → 0.2.0 |
latest |
Tag por defecto | npx tabernaculo → 0.2.0 |
beta etc |
Tags para probar sin romper | npx tabernaculo@beta → pre-release |
bin |
Qué ejecuta npx |
./src/main.ts |