2015-06-05 5 views
16

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

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

Ее идеально подходит, чтобы иметь какую-либо команду в одну строку, как это:

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

, но тот, который будет также проверить версию пакета.

+0

'[-d путь/к/транспортир] || npm install ... '? – bishop

+3

'command -v protractor>/dev/null 2> & 1 || npm install ... '? – bishop

+0

Мне нужна контрольная версия установленного в данный момент пакета, желательно не писать полный путь к пакету. несколько разных окружений, разные пути и т. д. – kovpack

ответ

17

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

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

Отлично! Thanx! – kovpack

+4

Почти идеально, как только что получилось. Он выдает исключение, если пакет отсутствует. – kovpack

7

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

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

$ install_package_if_needed protractor 2.1.0 

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

$ install_package_if_needed protractor 2.1.0 -g 
+0

Yeap, thanx. Я сделал что-то вроде этого, но вызвал несколько команд системы из ruby. Но именно эта версия не применима для моей задачи. – kovpack

+0

Спасибо за это. Но для удаления>/dev/null else $ i всегда будет пустым. –

+0

@DarylTeo Спасибо! Ты прав. Не уверен, что я думал. Исправлена! – bishop

0

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

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

Here is my solution.

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

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

Где npm list protractor используется, чтобы найти protractor пакет.

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

Смежные вопросы