versiones una node instalar como anterior node.js bash npm circleci

node.js - una - ¿Es posible instalar el paquete npm solo si aún no se ha instalado?



npm versions (5)

Podrías probar el npm list protractor || npm install [email protected] npm list protractor || npm install [email protected]

Donde npm list protractor se usa el protractor para encontrar el paquete del protractor .

Si no se encuentra el paquete, devolverá npm ERR! code 1 npm ERR! code 1 y npm install [email protected] para la instalación

¿Es posible instalar el paquete npm solo si aún no se ha instalado?

Necesito esto para acelerar la prueba en CircleCI, pero cuando ejecuto npm install [email protected] etc., siempre descarga las cosas y las instala desde el escritorio, sin embargo, la carpeta node_modules con todos los módulos ya está presente en el momento de ejecutar los comandos ( almacenado en caché desde la compilación anterior) y el protractor --version etc. muestra la versión necesaria del paquete.

Es perfecto tener un comando de una línea como este:

protractor --version || npm install -g [email protected]

Pero el que también verificará la versión del paquete.


Tuve este mismo problema junto con querer instalar dependencias globales desde cualquier archivo "package.json" que las requiera.

Esto es para un entorno de desarrollo de Windows.

Aquí está mi solución .


Versión funcional de la excelente respuesta de @JeromeWAGNER :

function install_package_if_needed() { local p=${1:-Package required} local v=${2:-Version required} shift 2 local i=$(node -p "require(''$p/package.json'').version" 2>/dev/null) [ "$i" == "$v" ] || npm "$@" install "$p@$v" }

Utilizar como

$ install_package_if_needed protractor 2.1.0

Para pasar opciones adicionales a npm , especifíquelas después de la versión, así:

$ install_package_if_needed protractor 2.1.0 -g


con bash puedes hacer

[ $(node -p "require(''protractor/package.json'').version") != "2.1.0" ] && npm install [email protected]


[ $(node -p "try{require(''protractor/package.json'').version}catch(e){}") != "2.1.0" ] && npm install grunt