Як ви не можете встановити NPV-модулі «devDependitions» для Node.js (package.json)?


587

Я маю це у своєму файлі 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
На думку doc, ви маєте рацію, --dev встановлює devdeps, інакше лише deps. npmjs.org/doc/json.html . Я знаю, що це працює принаймні з названими пакетами.
мн

1
якщо ви зіткнулися з цим питанням у 2015 році, --save-dev перемикач виконує трюк точно так, як задано в цьому запитанні.
Ананд

1
Ця відповідь stackoverflow.com/a/22004559/3718119 дає гарне пояснення відмінностей між dependenciesі devDependenciesі коли кожен з них використовується.
Квазофт

Відповіді:


844

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

Використовуйте npm install --only=prod(або --only=production) лише для встановлення dependencies, але не devDependencies,незалежно від значення NODE_ENVзмінної середовища.

Джерело: npm docs

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


2
Міркування Agate, ймовірно, усуває devDependpendence, щоб споживачі, які встановлюють ваш пакунок npm install yourpackage.tgz, також не отримували devDependitions. Однак це вже так. Дивіться відповідь Кевіна Кокса нижче ( stackoverflow.com/a/15826602/825588 ).
Йоганн

5
npmjs.org/doc/cli/npm-install.html "За замовчуванням npm install встановить усі модулі, перелічені як залежності. З прапорцем --production, npm не буде встановлювати модулі, перелічені у devDependpendations."
tomByrer

14
Боже мій. Я повністю мав NODE_ENV=productionвід чогось іншого, чим я займався, і не міг зрозуміти все життя, чому npm installб не встановити залежності. Дякую за ретельну відповідь.
aendrew

1
npm install --dev встановив би лише залежність від розробників
Rustem K

10
Для npm 3.3 і далі: npm WARN install Встановлення цього --devпараметра припинено. Використовуйте --only=devзамість цього.
srcspider

232

Я теж стикаюся з цією проблемою! npm install дещо заплутано, і веб-дописи продовжують вводити прапори -d / - dev так, ніби є явний режим встановлення "development".

  • npm installвстановить і " залежності ", і " devDependitions "

  • npm install --productionвстановить лише " залежності "

  • npm install --devбуде встановлено лише " devDependitions "


29
ПОПЕРЕДЖЕННЯ. Якщо NODE_ENVвстановлено productionі ви запустили, npm installвін не встановить залежності від розробників. Я зіткнувся з цим питанням у своєму Dockerfile.
воган

1
@vaughan Я теж наткнувся на це, можна вирішити, запустившись npm --production=false install(хоча не впевнений, чи буде це працювати поряд із прапором --dev)
Bavell

138

Новий варіант:

npm install --only=prod

Якщо ви хочете встановити лише devDependitions:

npm install --only=dev

1
Це відповідає протилежному питанню. ОП запитує, як НЕ встановлювати devDependitions.
musicin3d

2
Ви частково правильні @ musicin3d, тому в першій частині я відповів, як встановити залежності лише у виробництві, а у другій - як встановити залежності лише від розробника, на всякий випадок.
Закриття

5
Гей там. Я залишив цей коментар, перш ніж @ user1614572 додав частину про --only=prod. Ви, пане, частково правильні. ; P
musicin3d

чи можемо ми включити окрему залежність від розгортання?
Jeeva Jsb

1
Це коментар, а не відповідь. Я не переглядаю всі свої коментарі періодично. Я ніколи не бачив, щоб люди ходили оновлені коментарі з років тому. Ви в основному зайшли сюди, щоб критикувати, що я поставив рік на свій коментар. Я більше не відповідатиму. Розважайте тролінгу інших людей.
Жак ジ ャ ッ ク

47

Якщо ви читаєте цю пошту у 2016 році, будь ласка, досягнете того, що хочете, використовуючи

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

аргумент призведе до того, що буде встановлено або лише devDependpendes, або лише не devDependpendets, незалежно від NODE_ENV.

з: https://docs.npmjs.com/cli/install


Навіщо використовувати великі літери "POST"? docs.npmjs.com/cli/install чітко документи BOTH--production та --only={prod[uction]|dev[elopment]}.
Дан Даскалеску

33

Якщо ви вже встановили всі свої залежності, і хочете уникнути необхідності завантажувати свої виробничі пакети з NPM знову, ви можете просто ввести:

npm prune --production

Це видалить ваші залежності від розробників із вашої node_modulesпапки, що корисно, якщо ви намагаєтесь автоматизувати процес на два етапи

  1. Вебпак мого проекту, використовуючи залежність від розробників
  2. Створіть зображення Docker, використовуючи лише виробничі модулі

Переміщення npm pruneміж ними позбавить вас від необхідності перевстановлювати все!


19

При використанні "npm install" модулі завантажуються та доступні у всій вашій програмі, незалежно від того, чи є "devDependitions" або "залежності". Сума цієї ідеї: все, що ваш package.json визначає як залежність (будь-якого типу), встановлюється в node_modules.

Призначення різниці між залежностями / devDependences / optionalDependitions полягає в тому, що споживачі вашого коду можуть робити без входу в хвилину для установки цих ресурсів.

Відповідно до документації: https://npmjs.org/doc/json.html ...

Якщо хтось планує завантажувати та використовувати ваш модуль у своїй програмі, він, ймовірно, не хоче або потребує завантаження та створення зовнішнього тестового або документаційного каркасу, який ви використовуєте.

У цьому випадку найкраще перерахувати ці додаткові елементи в хеші devDependitions.

Ці речі будуть встановлені щоразу, коли встановлено прапор конфігурації --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


16

npm встановить залежності dev при установці зсередини пакету (якщо package.jsonв поточному каталозі є). Якщо він знаходиться з іншого місця (реєстр npm, git repo, інше місце у файловій системі), він встановлює лише залежності.


Не могли б ви переформулювати? Я думаю, що ти помилився у своїх дужках, я думаю, що ти забув закрити його раніше, і твій фрагмент не має для мене особливого сенсу (неносець англійської мови). Коментар Йогана під відповіддю Рохана Сінгха вказував на мене, щоб я подивився на вашу відповідь (тому що мій сумнів був саме таким, що сумніви агата), і успіху немає. Я досі не розумію, як npm install some-moduleне встановити залежність від розробників some-module.
Рафаель Ейн

Спасибі, виправлено. Однак я не розумію решти вашого питання.
Кевін Кокс

3

Я виявив, що, намагаючись встановити залежності dev для пакету, який містить аддон вузла, ви не можете уникнути побудови аддону під час запуску npm install --dev, навіть якщо ви просто хочете встановити devDependitions. Отже, мені довелося обходити спину 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тоді devDependitions .

npm install packageName --save-devслід використовувати для додавання пакетів для розробки. Як і додавання TDD-пакетів (Chai, mocha тощо). Які використовуються в розвитку, а не у виробництві.


ОП не має проблем із збереженням залежностей у, package.jsonале як тільки ці залежності вже збережені , то як примусити npmвстановити лише один конкретний тип залежності. Коли я прочитав тут вашу відповідь, я не дізнався нічого, що допомагає вирішити проблему, поставлену ОП.
Луї

3

Варто зазначити, що ви можете використовувати NODE_ENVзмінну середовища для досягнення того ж результату. Особливо корисно, якщо ви зберігаєте додаток Node (наприклад, Docker).

NODE_ENV=production npm install

Вищевказаний код встановить усі ваші залежності, окрім розроблених (тобто 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. devDependitions не встановлюються на найвищому рівні при запуску локальної установки npm без аргументів.
    2. Встановіть NODE_ENV = "виробництво" для сценаріїв життєвого циклу.

Щасливі контейнери =)


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.


Класно, це працює і з npm ciне тільки npm install!
Клесун

2

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


7
Так, -gне встановлюватиметься devDependencies, але він встановлює пакети в усьому світі, що часто не є наміченим результатом.
Барді Харбороу

0

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


-1

Тепер виникла проблема, якщо у вас є пакет-lock.json з npm 5+. Ви повинні видалити його перед використанням npm install --production.


-1
npm install --dev will install dev dependencies

І, відповідно до питання про встановлення лише залежностей, допоможе наступна команда

npm install --prod will install dependencies
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.