Как удалить все зависимости, перечисленные в package.json (NPM)?

107

Если у меня есть файл package.json, определенный в корне моего приложения, и я запустил npm install -gего, он установит все зависимости, определенные в package.json, globablly.

Однако, похоже, это не работает наоборот.

Если я это сделаю npm uninstall -gв корне моего приложения, он выдает ошибку, предлагая мне передать ему имя пакета.

Разве при этом не следует удалить те же пакеты, которые я установил?

Я делаю что-то неправильно?

qodeninja
источник
1
К вашему сведению, мои аргументы в пользу того, что я никогда не использую npm -g. peterlyons.com/problog/2012/09/…
Питер Лайонс
1
Помните, что если вы хотите использовать модуль для своего проекта, вы должны установить его локально. Глобальная установка модуля предоставляет только больше команд в вашем терминале, как, например, в expressjs и express (1).
warchimede 01
@sgwilly Вы ошибаетесь в том, что вам нужно использовать node_modules глобально - об этом даже говорится в документации - nodejs.org/api/modules.html#modules_all_toght - функция require () "умна" в том, что она смотрит в разных местах чтобы попытаться разрешить путь для модуля, включая глобальные node_modules
qodeninja
Я должен был быть более конкретным: это правда, что require () достаточно умен, чтобы найти ваш глобально установленный модуль. Это сработает, если все ваши проекты зависят от одной и той же версии указанного модуля. Тем не менее, вам может быть сложно поддерживать проекты, основанные на разных версиях модулей, если вы управляете зависимостями только глобально. Вот почему рекомендуется всегда устанавливать модули локально и устанавливать их глобально только тогда, когда вы хотите получить доступ к некоторым удобным исполняемым командам.
warchimede 02 окт.13,
@sgwilly - спасибо, что поделились своими мыслями - этот проект, в частности, является распространяемым, поэтому он не должен пытаться что-либо обновлять - на самом деле обновления будут происходить через RPM (обратите внимание, что RPM, а не NPM), а фактические node_modules сжаты - Мне просто нужен был способ быстро очистить систему от всего, что установил rpm (в моей среде разработки)
qodeninja 02

Ответы:

168

Если вы используете Bash, просто перейдите в папку, в которой находится ваш файл package.json, и выполните следующее:

for package in `ls node_modules`; do npm uninstall $package; done;

В случае глобально установленных пакетов переключитесь в свою %appdata%/npmпапку (если в Windows) и выполните ту же команду.

РЕДАКТИРОВАТЬ: эта команда прерывается с npm 3.3.6 (Node 5.0). Теперь я использую следующую команду Bash, которую я сопоставил с npm_uninstall_all в моем файле .bashrc:

npm uninstall `ls -1 node_modules | tr '/\n' ' '`

Добавлен бонус? это намного быстрее!

https://github.com/npm/npm/issues/10187

Jedmao
источник
1
Вы разместили ту же команду, что и ответ на вопрос «Команда удалить все модули npm глобально?». Как это может быть уместным и в той, и в этой ситуации?
никто
@AndrewMedico Как это неуместно? Пакеты, установленные в вашем файле package.json, будут установлены в вашу папку node_modules. Эта команда перенесет каждую подпапку в папку node_modules и запустит npm uninstall <package>для каждой папки. Я сделал это сам и работает отлично!
jedmao
2
@UgoRobain хороший вопрос. Как оказалось, некоторые зависимости становятся действительно глубокими. В файловой системе NTFS (Windows), по крайней мере, возникают проблемы с удалением каталогов, в которых имя пути длиннее какого-то предела, оставляя эти фантомные каталоги, которые вы не можете удалить. К счастью, об этом npm uninstallпозаботятся, поэтому этот трюк полезен.
jedmao
7
Вот что я делал с foreach($package in ls node_modules){npm uninstall $package}
PowerShell
1
похоже, не работает с окнами. tr is not recognized
Overdrivr
79

Это сработало для меня:

командную строку или gitbash в папку node_modules вашего проекта, затем выполните:

npm uninstall *

Удалены все локальные пакеты для этого проекта.

Друубакка
источник
Разве это не удаляет и глобальные установки?
shinzou
@shinzou Для меня это не удалило глобальные установки.
Тейлор Эдмистон
1
На Mac 10.13.5 это вызывает множество ошибок, как показано ниже: "> heapdump@0.3.9 install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (target) Release / obj.target / addon / src / heapdump. o В файле, включенном из ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: ошибка: ни один элемент с именем 'GetCpuProfiler' в 'v8 :: Isolate' не возвращает изолятор-> GetCpuProfiler () -> StartProfiling (title, record_samples); "
vikramvi
35

Для Windows перейдите в каталог node_modules и запустите его в powershell

npm uninstall (Get-ChildItem).Name 
Самир
источник
Для меня это приводит к ошибке «Командная строка слишком длинная».
Daniel
29

Недавно я нашел команду узла, которая позволяет удалить все зависимости разработки следующим образом:

npm prune --production

Как я уже упоминал, эта команда удаляет только пакеты зависимостей разработки. По крайней мере, это помогло мне не делать это вручную.

чало
источник
8

Совет для пользователей Windows: запустите эту команду PowerShell из node_modulesродительского каталога:

ls .\node_modules | % {npm uninstall $_}
y0n1
источник
6
// forcibly remove and reinstall all package dependencies
ren package.json package.json-bak
echo {} > package.json
npm prune
del package.json
ren package.json-bak package.json
npm i

По сути, это создает поддельный пустой package.json, вызывает npm pruneудаление всего в node_modules, восстанавливает исходный package.json и переустанавливает все.

Некоторые другие решения могут быть более элегантными, но я подозреваю, что это быстрее и исчерпывающе. В других потоках я видел, как люди предлагали просто удалить каталог node_modules, но, по крайней мере, для Windows, это приводит к тому, что npm впоследствии захлебывается, потому что каталог bin отсутствует. Может быть, на linux он восстанавливается правильно, но не на windows.

мем
источник
1
В моем случае - мне не нужен существующий package.json (из-за запуска сценария на CI после выполнения сценариев npm ..) Поэтому я просто выбрал: "echo {}> package.json & npm prune"
Рикки
5

На самом деле нет возможности сделать это, если вы хотите удалить пакеты, package.jsonпросто выполните их npm lsв том же каталоге, который package.jsonиспользует и использует, npm uninstall <name>или npm rm <name>для пакета, который вы хотите удалить.

Gntem
источник
8
Я знаю, как удалять их по отдельности - было бы больше смысла, если бы была команда для запуска в файле package.json так же, как работает npm install.
qodeninja 01
Нет, мы не хотим вручную удалять каждый модуль.
shinzou
1
  1. удалить ненужные зависимости из package.json
  2. npm i

" npm i" не только установит недостающие deps, но и обновит node_modules в соответствии с package.json.

Misaka_0x447f
источник
1

( Не повторяйте эти шаги, пока не прочтете все )

Для меня все упомянутые решения не сработали. Так я пошел /usr/libи побежал туда

for package in `ls node_modules`; do sudo npm uninstall $package; done;

Но он также удалил npmпакет и только половину пакетов (до буквы n).

Поэтому я снова попытался установить узел с помощью руководства по узлам.

# Using Ubuntu
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

Но он не установился npmснова.

Поэтому я решил переустановить весь узел sudo apt-get remove nodejs и снова установить, следуя приведенному выше руководству.

Теперь NPM снова работает, но глобальные модули все еще там. Итак, я проверил содержимое каталога /usr/lib/node_modulesи, кажется, единственное, что здесь важно npm. Поэтому я отредактировал приведенную выше команду, чтобы удалить все, кромеnpm

for package in $(ls node_modules); do if [ "$package" != "npm" ]; then sudo npm uninstall $package; fi; done;

Он удалил все модули без префикса @. Так что я расширил цикл для подкаталогов.

for package in $(ls node_modules); do if [  ${package:0:1} = \@ ]; then 
        for innerPackage in $(ls node_modules/${package}); do
                sudo npm uninstall "$package/$innerPackage";
        done;
fi; done;

My /usr/lib/node_modulesтеперь содержит только npmсвязанные пакеты.

siOnzee
источник
1

Другой ПРОСТОЙ вариант - удалить node_modules и package-lock.json.

rm -rf node_modules
rm -rf package-lock.json

После этого вы можете попробовать переустановить пакеты npm.

Суровый Пхудждар
источник
1
Спасибо за это предложение. У меня не было глобальных пакетов. В большинстве ответов говорится о параметре -g! У меня было ужасное время, когда я избавлялся от ВСЕХ локальных пакетов, потому что, не зная достаточно о nodejs / npm, я сделал «npm install this-and-that» из нескольких разных каталогов. Когда я использую «npm uninstall <anything>», «npm ls» по-прежнему показывает некоторые пакеты. Я программист оболочки, поэтому пробовал "npm uninstall" на каждой мыслимой части вывода "npm ls". Ни один не помог избавиться от ВСЕХ пакетов. Устал, но нашел это предложение и устранил свою проблему за 5 минут. Спасибо Harsh.
BReddy
Я не знаю, для чего нужны package.json, package-lock.json, node_modules, зависимости, локальные / глобальные различия или как работает nodejs / npm. Я использую модуль nodejs, который нужен для другой программы. Поскольку я установил много разных модулей с помощью npm install из разных каталогов, я хотел избавиться от ВСЕХ сразу. Ни в одном другом ответе об этом не говорится. Используя эту команду и команду find в Linux, я смог избавиться от всего за 5 минут. Не знаю, почему еще никто не нашел это полезным.
Брэдди
0

Даже вам не нужно для этого запускать цикл.

Вы можете удалить все node_modules, используя единственную команду: -

npm uninstall `ls -1 node_modules | tr '/\n' ' '`
ВИКАС КОХЛИ
источник
0

Пользователи Powershell: foreach($package in ls node_modules){npm uninstall $package}

Спасибо @JustMailer

Валентин Бондарь
источник
0

Опираясь на VIKAS KOHLI и jedmao , вы можете это сделать

однострочная версия:

npm uninstall `ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` `find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`

многострочная версия:

npm uninstall \
`ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` \
`find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`
Райан Леха
источник