Как предотвратить установку модулей NPM «devDependencies» для Node.js (package.json)?

588

У меня есть это в моем файле package.json (сокращенная версия):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Я использую NPM версии 1.1.1 на Mac 10.6.8.

Когда я запускаю следующую команду из корня проекта, она устанавливает dependencies и devDependencies :

npm install

У меня сложилось впечатление, что эта команда установила devDependencies:

npm install --dev

Как мне сделать так, чтобы он npm installтолько устанавливал dependencies(чтобы производственная среда получала только эти модули), в то время как что-то вроде npm install --devустанавливает dependenciesи devDependencies?

Лэнс Поллард
источник
1
Согласно документу, вы правы, --dev устанавливает devdeps, иначе только deps. npmjs.org/doc/json.html . Я знаю, что это работает для именованных пакетов, по крайней мере.
mna
1
если вы столкнетесь с этим вопросом в 2015 году, ключ --save-dev сделает то же, что и в этом вопросе.
Ананд
1
Этот ответ stackoverflow.com/a/22004559/3718119 дает хорошее объяснение различий между dependenciesи devDependenciesи когда каждый из них используется.
Quasoft

Ответы:

844

Команда npm installбудет установлена devDependenciesвместе с другими dependenciesпри запуске в каталоге пакета, в среде разработки (по умолчанию).

Используйте npm install --only=prod(или --only=production) только для установки dependencies, а не devDependencies,независимо от значения NODE_ENVпеременной среды.

Источник: нпм документы

Примечание: Перед v3.3.0 НПМ (2015-08-13), опция называлась --production, то есть npm install --production.

Рохан Сингх
источник
2
Вероятно, агата рассуждает об удалении devDependencies, чтобы потребители, устанавливающие ваш пакет npm install yourpackage.tgz, также не получали devDependencies. Однако это уже так. См. Ответ Кевина Кокса ниже ( stackoverflow.com/a/15826602/825588 ).
Иоганн
5
npmjs.org/doc/cli/npm-install.html "По умолчанию, установка npm установит все модули, перечисленные как зависимости. С флагом --production npm не установит модули, перечисленные в devDependencies."
TomByrer
14
Боже мой. Я полностью был NODE_ENV=productionот чего-то другого, чем занимался, и не мог понять, почему npm installне установил зависимости. Спасибо за подробный ответ.
Эндрю
1
npm install --dev установит только зависимости dev
Рустем К
10
Для npm 3.3 и выше: npm WARN install Использование --devопции не рекомендуется. Используйте --only=devвместо этого.
srcspider
232

Я тоже столкнулся с этой проблемой! Установка npm несколько сбивает с толку, и веб-сообщения продолжают вносить флаги -d / - dev, как будто существует явный режим установки «разработки».

  • npm installустановит как " зависимости ", так и " devDependencies "

  • npm install --productionбудет устанавливать только " зависимости "

  • npm install --devбудет только устанавливать " devDependencies "

smertrios
источник
29
ВНИМАНИЕ: Если NODE_ENVустановлено значение productionи вы запускаете npm installего, он не будет устанавливать зависимости dev. Я столкнулся с этой проблемой в моем Dockerfile.
Воган
1
@vaughan Я тоже столкнулся с этим, можно решить, запустив npm --production=false install(хотя и не уверен, будет ли это работать вместе с флагом --dev)
Bavell
138

Новая опция:

npm install --only=prod

Если вы хотите установить только devDependencies:

npm install --only=dev
Cloxure
источник
1
Это отвечает на противоположный вопрос. ОП спрашивает, как НЕ устанавливать devDependencies.
musicin3d
2
вы частично правы @ musicin3d, поэтому в первой части я ответил, как установить зависимости только для prod, а во второй части - как установить зависимости только для dev, на всякий случай.
Cloxure
5
Привет всем. Я оставил этот комментарий до того, как @ user1614572 добавил часть о --only=prod. Вы, сэр, частично правы. ; P
musicin3d
Можем ли мы включить отдельную зависимость для развертывания?
Jeeva Jsb
1
Это комментарий, а не ответ. Я не проверяю все свои комментарии периодически. Я никогда не видел, чтобы люди обновляли комментарии лет назад. Вы в основном пришли сюда, чтобы критиковать то, что я положил год на мой комментарий. Я не буду отвечать дальше. Удачи троллинг других людей.
Жак ジ ャ ッ ク
47

Если вы читаете этот пост в 2016 году, добейтесь того, чего хотите, используя

--only={prod[uction]|dev[elopment]} 

Аргумент приведет к установке только devDependencies или только не devDependencies независимо от NODE_ENV.

от: https://docs.npmjs.com/cli/install

wzr1337
источник
Зачем заглавными буквами "POST"? docs.npmjs.com/cli/install четко документирует ОБА --productionи --only={prod[uction]|dev[elopment]}.
Дан Даскалеску
33

Если вы уже установили все свои зависимости и хотите избежать повторной загрузки производственных пакетов из NPM, вы можете просто набрать:

npm prune --production

Это удалит ваши зависимости dev из вашей node_modulesпапки, что полезно, если вы пытаетесь автоматизировать двухэтапный процесс, такой как

  1. Webpack мой проект, используя зависимости dev
  2. Создайте образ Docker, используя только производственные модули

Промежуточный npm pruneпереход избавит вас от необходимости переустанавливать все!

piercebot
источник
19

При использовании «npm install» модули загружаются и доступны во всем приложении независимо от того, являются ли они «devDependencies» или «зависимости». Суть этой идеи: все, что ваш package.json определяет как зависимость (любого типа), устанавливается в node_modules.

Цель различий между зависимости / devDependencies / OptionalDependencies состоит в том, что потребители вашего кода могут сделать w / npm для установки этих ресурсов.

Согласно документации: https://npmjs.org/doc/json.html ...

Если кто-то планирует загрузить и использовать ваш модуль в своей программе, то он, вероятно, не хочет или не нуждается в загрузке и создании используемой вами среды внешнего тестирования или документации.

В этом случае лучше перечислить эти дополнительные элементы в хэше devDependencies.

Эти вещи будут устанавливаться всякий раз, когда установлен флаг конфигурации --dev. Этот флаг устанавливается автоматически при выполнении ссылки npm или при установке npm из корня пакета и может управляться как любой другой параметр конфигурации npm. Смотрите config (1) для более подробной информации по теме.

Однако, чтобы решить этот вопрос, если вы хотите установить ТОЛЬКО «зависимости» с помощью npm, используйте следующую команду:

npm install --production

Это можно подтвердить, посмотрев коммит Git, в котором был добавлен этот фильтр (наряду с некоторыми другими фильтрами [перечислены ниже] для обеспечения этой функциональности).

Альтернативные фильтры, которые могут быть использованы npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr попробуйте использовать npm install --production

creatovisguru
источник
16

npm установит dev-зависимости при установке из пакета (если он есть package.jsonв текущем каталоге). Если он находится в другом месте (реестр npm, git repo, другое место в файловой системе), он устанавливает только зависимости.

Кевин Кокс
источник
Не могли бы вы переформулировать? Я думаю, что вы допустили ошибку в скобках, я думаю, что вы забыли закрыть ее раньше, и ваша фраза не имеет большого смысла для меня (не носитель английского языка). Комментарий Иоганна под ответом Рохана Сингха указал мне на ваш ответ (потому что мои сомнения были точно такими же, как сомнения Агата), но безуспешно. Я до сих пор не понимаю, как npm install some-moduleне будет устанавливать зависимости Dev some-module.
Рафаэль Эйнг
Спасибо, исправлено. Однако я не понимаю остальную часть вашего вопроса.
Кевин Кокс
3

Я обнаружил, что при попытке установить зависимости dev для пакета, который содержит аддон узла, вы не можете избежать сборки аддона при запуске npm install --dev, даже если вы просто хотите установить devDependencies. Итак, мне пришлось обойти спину npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Или еще лучше (и более кратко),

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install
Габриэль Шульхоф
источник
3

Используйте npm install packageName --saveэто, чтобы добавить пакет в зависимости , если вы используете, npm install packageName --save-devто это devDependencies .

npm install packageName --save-devследует использовать для добавления пакетов в целях разработки. Как добавление пакетов TDD (чай, мокко и т. Д.). Которые используются в разработке, а не в производстве.

Сандип Нирмал
источник
У OP нет проблем с сохранением зависимостей, package.jsonно как только эти зависимости уже сохранены , то как принудительно npmустановить только один конкретный тип зависимостей. Когда я прочитал ваш ответ здесь, я не узнал ничего, что помогло бы решить проблему, поставленную ОП.
Луи
3

Стоит отметить, что вы можете использовать NODE_ENVпеременную окружения для достижения того же результата. Особенно полезно, если вы контейнеризуете свое Node-приложение (например, Docker).

NODE_ENV=production npm install

Приведенный выше код установит все ваши зависимости, кроме dev (т.е. devDependencies).

если вам нужно использовать переменные окружения в вашей Dockerfileдополнительной информации можно найти здесь .

Переменные среды легко перезаписывать при необходимости (например, если вы хотите запустить свой набор тестов, скажем, на Travis CI). Если бы это было так, вы могли бы сделать что-то вроде этого:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Документация NPM здесь

производство

  • По умолчанию: false
  • Тип: Boolean Установите значение true для запуска в «производственном» режиме.

    1. devDependencies не устанавливаются на самом верхнем уровне при запуске локальной установки npm без каких-либо аргументов.
    2. Установите NODE_ENV = "production" для сценариев жизненного цикла.

Удачной контейнеризации =)

Франческо Касула
источник
3

Я предлагаю использовать npm ci. Если вы хотите установить только необходимые для производства пакеты (как вы написали - без devDependencies), то:

npm ci --only=production

или

NODE_ENV=production npm ci

Если вы предпочитаете oldschool, npm installтогда:

npm install --production

или

NODE_ENV=production npm install

Вот хороший ответ, почему вы должны использовать npm ci.

marverix
источник
Круто, это работает с npm ciне только npm install!
Клесун
2

Необходимо добавить к выбранному ответу: На данный момент npm installв каталоге пакета (содержащем package.json) будут устанавливаться devDependencies, тогда как npm install -gне будут их устанавливать.

извед
источник
7
Да, -gне будет установлен devDependencies, но он устанавливает пакеты глобально, что часто не является ожидаемым результатом.
Барди Харбороу
0

npm install --productionэто правильный способ установки узловых модулей, которые необходимы для производства. Проверьте документацию для более подробной информации

Рубин Бхандари
источник
-1

Теперь возникает проблема, если у вас есть package-lock.json с npm 5+. Вы должны удалить его перед использованием npm install --production.

Эрих Старк
источник
-1
npm install --dev will install dev dependencies

И, в соответствии с вопросом, чтобы установить только зависимости, следующая команда поможет

npm install --prod will install dependencies
karthiks416
источник