Возможно ли установить пакет npm только в том случае, если он еще не установлен?

Возможно ли установить пакет npm только в том случае, если он еще не установлен?

Мне нужно это, чтобы ускорить тестирование CircleCI, но когда я запускаю npm install [email protected] и т.д., он всегда загружает вещи и устанавливает их из scracth, однако папка node_modules со всеми модулями уже присутствует в момент запуска команд (кэшируется из предыдущей сборки) и protractor --version и т.д. показывает нужную версию пакета.

Его идеально подходит для выполнения одной однострочной команды:

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

но тот, который также проверяет версию пакета.

Ответы

Ответ 1

с bash вы можете сделать

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

Ответ 2

Функциональная версия отличного ответа от @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 "[email protected]" install "[email protected]$v"
}

Используйте как:

$ install_package_if_needed protractor 2.1.0

Чтобы передать дополнительные параметры npm, укажите их после версии, например:

$ install_package_if_needed protractor 2.1.0 -g

Ответ 3

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

Ответ 4

Вы можете попробовать npm list protractor || npm install [email protected]

Где npm list protractor используется для поиска пакета protractor.

Если пакет не найден, он вернет npm ERR! code 1 и сделает npm install [email protected] для установки

Ответ 5

У меня была эта же проблема вместе с желанием установить глобальные зависимости из любого файла "package.json", требующего их.

Это для среды разработки Windows.

Вот мое решение.