Is it possible to install npm package only if it has not been already installed?

こ雲淡風輕ζ 提交于 2019-12-18 13:55:08

问题


Is it possible to install npm package only if it has not been already installed?

I need this to speed up test on CircleCI, but when I run npm install protractor@2.1.0 etc. it always downloads things and installs them from scracth, however, node_modules folder with all modules is already present at the moment of running commands (cached from previous build) and protractor --version etc. shows the needed version of the package.

Its perfect to have some one-line command like this:

protractor --version || npm install -g protractor@2.1.0

but the one that will also check version of the package.


回答1:


with bash you can do

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



回答2:


You could try npm list protractor || npm install protractor@2.1.0

Where npm list protractor is used to find protractor package.

If the package is not found, it will return npm ERR! code 1 and do npm install protractor@2.1.0 for installation




回答3:


Function version of the excellent answer by @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"
}

Use like:

$ install_package_if_needed protractor 2.1.0

To pass additional options to npm, specify them after the version, like so:

$ install_package_if_needed protractor 2.1.0 -g



回答4:


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



回答5:


I had this same issue together with wanting to install global dependencies from any "package.json" file requiring them.

This is for a Windows development environment.

Here is my solution.



来源:https://stackoverflow.com/questions/30667239/is-it-possible-to-install-npm-package-only-if-it-has-not-been-already-installed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!