web-dev-qa-db-fra.com

Est-il possible d'installer le paquet npm uniquement s'il n'a pas déjà été installé?

Est-il possible d'installer le package npm uniquement s'il n'a pas déjà été installé?

J’ai besoin de cela pour accélérer les tests sur CircleCI, mais lorsque j’exécute npm install [email protected], etc., il télécharge toujours des choses et les installe à partir de scracth. Cependant, le dossier node_modules avec tous les modules est déjà présent au moment de l’exécution des commandes protractor --version etc. indique la version requise du paquet.

C'est parfait pour avoir une commande d'une ligne comme celle-ci:

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

mais celui qui vérifiera également la version du paquet.

23
kovpack

avec bash tu peux faire

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

Vous pourriez essayer npm list protractor || npm install [email protected]

npm list protractor est utilisé pour trouver le package protractor.

Si le paquet n'est pas trouvé, il retournera npm ERR! code 1 et fera npm install [email protected] pour l'installation

11
An Nguyen

Version fonctionnelle de l'excellent réponse 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"
}

Utilisez comme:

$ install_package_if_needed protractor 2.1.0

Pour passer des options supplémentaires à npm, spécifiez-les après la version, comme suit:

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

J'ai eu ce même problème avec le désir d'installer des dépendances globales à partir de n'importe quel fichier "package.json" les nécessitant.

Ceci est pour un environnement de développement Windows.

Voici ma solution .

0
sthames42