Estoy intentando configurar un proyecto para instalar dependencias de NPM. Publicaré el proyecto en GitHub Packages como un paquete privado. Si uso esta sintaxis en el .npmrc
de mi proyecto:
@my-org:registry=https://npm.pkg.github.com/
Puedo instalar dependencias desde NPM usando npm install
en mi máquina local. Sin embargo, no puedo publicar en GitHub Packages usando npm publish
. NPM me informa que no estoy autenticado. Si uso esta sintaxis en el .npmrc
de mi proyecto:
registry=https://npm.pkg.github.com/my-org/
Puedo publicar usando npm publish
, pero no puedo instalar dependencias con npm install
. NPM me informa que está intentando instalar dependencias de paquetes de GitHub, en lugar de NPM.
Según mi lectura, ambas sintaxis deberían ser compatibles con npm install
y npm publish
. Sin embargo, parece que solo puedo usar uno u otro, según el uso previsto.
Instale Node v15.7.0
y NPM 7.4.3
a través de nvm .
Inicie sesión en GitHub Packages con el comando:
npm login --scope=@my-org --registry=https://npm.pkg.github.com
Consulte nuestro archivo ~/.npmrc
en nuestra carpeta de inicio. Debería leer:
@my-org:registry=https://npm.pkg.github.com/ //npm.pkg.github.com/:_authToken=<auth-token-used-for-login>
Cree un proyecto con el siguiente package.json
:
{ "name": "@my-org/my-package", "description": "A test.", "version": "1.0.0", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "https://github.com/my-org/my-package.git" }, "keywords": ["example"], "author": "Me", "license": "ISC", "bugs": { "url": "https://github.com/my-org/my-package/issues" }, "homepage": "https://github.com/my-org/my-package", "dependencies": { "bootstrap": "^4.5.2" } }
Agregue el siguiente .npmrc
a nuestro proyecto:
@my-org:registry=https://npm.pkg.github.com/
Ejecute npm install
. La instalación debería tener éxito.
Ejecute npm publish
. Recibe el siguiente error:
npm ERR! code ENEEDAUTH npm ERR! need auth This command requires you to be logged in. npm ERR! need auth You need to authorize this machine using `npm adduser` npm ERR! A complete log of this run can be found in: npm ERR! /Users/my-user/.npm/_logs/2021-01-28T20_19_55_974Z-debug.log
Cambie el proyecto .npmrc
a:
registry=https://npm.pkg.github.com/my-org/
Ejecute npm publish
. La publicación debería tener éxito.
rm -rf node_modules/ package-lock.json
en el proyecto.
Ejecute npm install
. Recibe el siguiente error:
npm ERR! code E401 npm ERR! Incorrect or missing password. npm ERR! If you were trying to login, change your password, create an npm ERR! authentication token or enable two-factor authentication then npm ERR! that means you likely typed your password in incorrectly. npm ERR! Please try again, or recover your password at: npm ERR! https://www.npmjs.com/forgot npm ERR! npm ERR! If you were doing some other operation then your saved credentials are npm ERR! probably out of date. To correct this please try logging in again with: npm ERR! npm login npm ERR! A complete log of this run can be found in: npm ERR! /Users/my-user/.npm/_logs/2021-01-28T20_38_20_711Z-debug.log
publishConfig
Desafortunadamente, publishConfig
no soluciona el problema. Tampoco aborda que las dos sintaxis .npmrc
producen resultados diferentes.
.npmrc
authToken
La documentación de NPM establece que no es necesario incluir el authToken
de autenticación en el proyecto .npmrc
. La autenticación con npm login
y el almacenamiento del authToken
en el ~/.npmrc
global debería ser suficiente.
--registry
Encontré una solución alternativa hasta que se resuelva el error de NPM que afecta este problema. Cuando se usa la siguiente sintaxis del proyecto .npmrc
:
@my-org:registry=https://npm.pkg.github.com/
Si ejecuto npm publish --registry=https://npm.pkg.github.com/
, puedo publicar correctamente. Además, puedo instalar dependencias sin problemas.
Encontré 2 problemas en los pasos del 1 al 7.
package.json
"publishConfig": { "registry": "https://npm.pkg.github.com/" }
.npmrc
en el paso 5, no vi //npm.pkg.github.com/:_authToken=<auth-token-used-for-login>
, recuerde que //
no es el comentario. ;
o #
son para comentarios. https://docs.npmjs.com/cli/v6/configuring-npm/npmrc#comments Esto se ha corregido en NPM 7.5.3
y versiones posteriores.
Esto ha sido confirmado como un error en NPM 7.x
Actualmente, el equipo está trabajando para corregir el error con su GitHub Pull Request #2602 . Hasta que se publique esta corrección de errores, la mejor recomendación es realizar una de las soluciones que se enumeran a continuación.
--registry
Cuando ejecute npm publish
, agregue el indicador --registry
. Esta marca permite a los desarrolladores especificar el registro en el que pretenden publicar, anulando las configuraciones de .npmrc
o package.json
. Para el ejemplo enumerado en mi pregunta, el proyecto .npmrc
debe contener:
@my-org:registry=https://npm.pkg.github.com/
La publicación tendrá éxito cuando se inicie ejecutando:
npm publish --registry=https://npm.pkg.github.com/
De acuerdo con el comentario del desarrollador de npm wraithgar sobre el problema de GitHub de este error , puede usar un token ficticio para el registro de NPM predeterminado para solucionar este problema. En el .npmrc
de nuestro proyecto, agregue la siguiente línea:
//registry.npmjs.org/:_authToken=dummy
El proyecto completo .npmrc
debe contener:
//registry.npmjs.org/:_authToken=dummy @my-org:registry=https://npm.pkg.github.com/
En la pregunta, ninguna de las sintaxis del proyecto .npmrc
que hemos intentado usar ha designado un registro, porque la documentación de NPM establece que no es necesario. La documentación indica que verificará nuestro ~/.npmrc
global si no hay uno en nuestro proyecto .npmrc
. El error en NPM hace que NPM verifique si un proyecto .npmrc
ha designado un registro antes de que intente autenticarse. En las propias palabras de Wraithgar :
Lo que sucede es que actualmente el cli solo está buscando su configuración de "registro" configurada cuando ve si ha iniciado sesión. Entonces, la solución temporal es anular esa configuración (como lo estaba haciendo al pasar --registry), O agregar un token para el registro predeterminado (npm) para que la verificación de un token no falle. La verificación solo busca la presencia de un token en la configuración, no lo valida (eso, por supuesto, sucederá cuando y si se usa durante una solicitud real), por lo que poner un valor ficticio detendrá el error hasta ese PR tierras
Después de agregar el token ficticio, la ejecución npm publish
npm install
deberían funcionar correctamente.