cris
Mi pregunta es similar a esta.
Un proyecto tiene una dependencia de un módulo de Git que reside en un repositorio alojado de forma privada:
"dependencies": {
"mymod": "git+https://mygitserver:8443/scm/od/mymod.git",
...
}
La intención es que esto sea una dependencia instantánea, por lo que cada vez que mymod
el código se modifica, el proyecto despliega la última versión.
La pregunta es, ¿qué comando debo usar correctamente para actualizar mi proyecto a la última versión del módulo?
Lo único que he encontrado que funciona es:
rm -rf node_modules/mymod
npm install
Correr npm install
solo no hace nada (dado que ya se ejecutó una vez), como señaló @Vishwanath en su pregunta, porque el módulo ya está instalado. npm upgrade
es inapropiado, porque también tengo dependencias en muchos otros módulos y no quiero actualizarlos a versiones más nuevas.
Supongo que podría versionar explícitamente mymod
y luego actualizar mi local package.json
con la nueva versión cada vez que cambia, pero eso crea una tarea de mantenimiento continua.
Parece que npm
tiene suficiente información para determinar cuándo se necesita una actualización, porque node_modules/mymod/package.json
contiene la última revisión de cabecera conocida, que podría compararse con la revisión de cabecera actual:
"gitHead": "b63f0df8ef...",
"_resolved": "git+https://mygitserver:8443/scm/od/mymod.git#b63f0df8ef..."
Lo hace npm
¿Tiene una forma preferida de manejar dependencias de instantáneas como esta?
Art3mix
ACTUALIZACIÓN – 2021 – paquete privado en desarrollo y producción
En mi nuevo proyecto hice todo lo posible para escribir mi código para que se adaptara tanto a la producción como al desarrollo con cambios mínimos, trabajar con mi paquete privado fue uno de los desafíos.
Quería trabajar localmente en mi paquete para que todos los cambios se aplicaran de inmediato sin la necesidad de actualizar manualmente mi paquete cada vez como la solución a continuación, pero en producción quería que instalara una versión específica del paquete desde mi git cuando hago npm install
.
Entonces, lo que hice fue usar 2 dependencias diferentes, 1 para producción y 1 para desarrollo.
package.json
:
"dependencies": {
"package-name": "git+ssh://git@bitbucket.com:*git package/path*.git#1.0.0",
},
"devDependencies": {
"package-name-dev": "file:*package path*"
}
Ahora, después de tener ambos paquetes, en desarrollo necesito usar el paquete dev cada vez que llamo al paquete principal en lugar de hacer muchas if(isDev){...}
sobre todos mis archivos.
usé el módulo-alias paquete que me permite crear un alias de un módulo una vez, y se aplicará a todo el proyecto.
en la cima de app.js
:
const isDev = (process.env.NODE_ENV === 'development'),
isProd = (process.env.NODE_ENV === 'production');
if (isDev) {
const moduleAlias = require('module-alias');
moduleAlias.addAlias('package-name', 'package-name-dev');
}
Y eso es todo, ahora, cada vez que yo const pack = require('package-name')
requerirá el paquete local (dev) en desarrollo y el paquete principal en producción.
Nota – en el paquete principal usé una etiqueta (#1.0.0) al final de mi URL de git, uso el mismo paquete en varios de mis proyectos y quería asegurarme de controlar la versión de mi paquete por proyecto , por lo que puedo probar manualmente la versión más nueva en proyectos más antiguos y nada se romperá.
RESPUESTA ORIGINAL: actualizar paquetes manualmente
No pude encontrar una mejor manera de hacer esto, terminé agregando un script en el package.json
que instale manualmente el paquete que necesito.
Agregar un guión a la package.json
que actualizará el paquete necesario:
"scripts": {
"update:packages": "npm install git+ssh://git@GIT_URL_HERE#master"
}
Si bien esto es lo mismo que actualizar manualmente el paquete, como dijo @chris en los comentarios de la otra respuesta, esto es mucho más fácil y se puede usar con:
npm run update:packages
NOTA – Él #master
La etiqueta al final instalará la rama maestra, no es óptima, pero le permite instalar la última versión del paquete sin cambiar manualmente la etiqueta cada vez.
Actualizar – si necesita esto para el desarrollo y el paquete en el repositorio privado es algo en lo que trabaja localmente (como yo), simplemente puede vincular el paquete al proyecto, todos los cambios se mostrarán de inmediato sin necesidad de reinstalarlo, más información en el enlace:
cd /path/to/working/dir
npm link ../path/to/package/dir
Actualización 2
Si usa Docker, npm link
no funcionará dentro de la ventana acoplable, esto se debe a que link
está configurando un enlace suave a su carpeta npm local. Para evitar esto, deberá configurar el enlace suave en el interior el estibador
Puede actualizar manualmente un paquete.
npm update mymod
Esto actualizará su paquete-lock.json con la última confirmación hash.
Intenté actualizar el número de versión en package.json pero aún no actualiza el paquete. Parece que la única forma es eliminar el paquete anterior cada vez.
Cambié mi archivo package.json a algo así que funcionó bien
"scripts": {
.......
"updateGit": "npm uninstall PACKAGE-NAME && npm install git+https://github.com/..../PACKAGE-NAME.git"
},
después
npm run updateGit
Debe actualizar la versión en package.json en mymod para que npm instale el código actualizado.
-
El punto es que no hay un número de versión en package.json; esta es una dependencia de instantánea, por lo que siempre se debe usar el código más reciente.
– chris
24 de febrero de 2016 a las 9:49
-
Por lo que sé, npm está muy centrado en los números de versión. Pero me refiero a actualizar la versión en mymod, no en su proyecto principal. ¿Puedes hacer que mymod suba automáticamente su versión al confirmar o enviar?
–Anders Bornholm
24 de febrero de 2016 a las 9:52
-
Ah, ya veo lo que quieres decir. Idea interesante. Estoy 99% seguro de que
npm install
ni siquiera se conecta al servidor Git, pero lo intentaré.– chris
24 de febrero de 2016 a las 9:56
-
Sé con certeza que npm se negó a instalar un nuevo código de github incluso cuando etiqueté una nueva versión cuando olvidé actualizar la versión en package.json
–Anders Bornholm
24 de febrero de 2016 a las 9:59
-
Intenté actualizar la versión en
package.json
dentro demymod
como se sugiere. No hace ninguna diferencia paranpm install
, que sigue sin hacer nada. Ni siquiera se conecta al repositorio de Git. Sólo un explícitonpm install git+https://etc/mymod
lo obliga a extraer la última versión.– chris
24 de febrero de 2016 a las 10:19
-
El punto es que no hay un número de versión en package.json; esta es una dependencia de instantánea, por lo que siempre se debe usar el código más reciente.
– chris
24 de febrero de 2016 a las 9:49
-
Por lo que sé, npm está muy centrado en los números de versión. Pero me refiero a actualizar la versión en mymod, no en su proyecto principal. ¿Puedes hacer que mymod suba automáticamente su versión al confirmar o enviar?
–Anders Bornholm
24 de febrero de 2016 a las 9:52
-
Ah, ya veo lo que quieres decir. Idea interesante. Estoy 99% seguro de que
npm install
ni siquiera se conecta al servidor Git, pero lo intentaré.– chris
24 de febrero de 2016 a las 9:56
-
Sé con certeza que npm se negó a instalar un nuevo código de github incluso cuando etiqueté una nueva versión cuando olvidé actualizar la versión en package.json
–Anders Bornholm
24 de febrero de 2016 a las 9:59
-
Intenté actualizar la versión en
package.json
dentro demymod
como se sugiere. No hace ninguna diferencia paranpm install
, que sigue sin hacer nada. Ni siquiera se conecta al repositorio de Git. Sólo un explícitonpm install git+https://etc/mymod
lo obliga a extraer la última versión.– chris
24 de febrero de 2016 a las 10:19
Ligeramente mejor que eliminar el módulo local es volver a ejecutar el comando de instalación explícito:
npm install "git+https://mygitserver:8443/scm/od/mymod.git"
– chris
24 de febrero de 2016 a las 9:52