RainMEN
@RainMEN
HTML/STYLUS/JADE/JS/Laravel/Joomla/DLE и т.д.

Как вы боретесь с удалением папок node_modules в Windows?

Всем привет!

С недавнего времени использую gulp с его замечательными способностями, но время от времени в папке виртуального сервера накапливается куча папок, которые от завершенных проектов, 5-6 в месяц, которые уже лежат на репозитории и смысла хранить их локально нет.

Возникает вопрос об необходимости удаления: ну не люблю я не нужные файлы.
И тут засада файлы которые лежат в папке node_modules не удаляются, потому что очень гигантское вложение папок одной в другую и Windows не может справится с удалением выбрасывая error о том что слишком длинное имя файла.

Кто и как с этим борется?

Или это только у меня проблема?

PS: Window 8 юзаю.

Вот такой путь получается до конечного файла:
G:\DEV\OSERV\OpenServer\domains\wdfasdasd\node_modules\gulp-imagemin\node_modules\imagemin\node_modules\imagemin-gifsicle\node_modules\gifsicle\node_modules\bin-build\node_modules\decompress\node_modules\decompress-tar\node_modules\strip-dirs\node_modules\is-


Остальное тупо даже не открывается.
  • Вопрос задан
  • 11577 просмотров
Решения вопроса 3
Defiancefew
@Defiancefew
Web энтузиаст
npm install rimraf -g
rimraf node_modules
Ответ написан
AMar4enko
@AMar4enko
После установки зависимостей в проект делаете
$ npm dedupe
$ npm shrinkwrap

dedupe приводит дерево npm-зависимостей к максимально плоскому виду
Ответ написан
RainMEN
@RainMEN Автор вопроса
HTML/STYLUS/JADE/JS/Laravel/Joomla/DLE и т.д.
Еще решение юзать PHPStorm и удалять из него. Никаких проблем не испытывает при удалении.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
Напишите батник себе или задачу для gulp, рекурсивно проходящую по директориям и бросающую их в корень, либо юзайте глобально установленный пакет flatten-deps. А еще, если вы пользователь Total Commander, то shift + del почти всегда нормально все удаляет.

К слову, такая проблема практически всегда бывает с imagemin у всех сборщиков.
Ответ написан
Комментировать
SynCap
@SynCap
Делаю интернет с 1998 года
Тема в интернетах давно и широко освещаема, народ давно прикурил, что не все так просто, как кажется на первый взгляд, и нет "серебряной пули".

`RimRaf` - хорошо, но не очень: использовать можно либо из скрипта, либо вручную на каждый проект, т.е. перед массовым бэкапом можно использовать лишь в составе некое "подготовительного" инструмента. И таки да - есть проблемы на разных конкретных конфигурациях. "Platform independence" не получился. По сути тех же результатов можно получить делая `rm -rf node_modules` в оболочке `bash` или `rmdir /S node_modules` в `cmd`, причем `rmdir` в большинстве случаев не вспомнит про длину строки, даже если для этого есть поводы.

`npm dedupe` - тоже очень хорошо, но также не очень. Это неплохо делать в каждом проекте после `install` или после каждого изменения зависимостей. В противном случае перекур на сутки - просто гарантирован.

1.

Если доступна оболочка Bash на основе CygWin (если пользуетесь Git, скорее всего она - оболочка баша - есть, но не факт) решение, которое лежит на поверхности:

find . -name "node_modules" -exec rm -rf '{}' +

плюсик в конце - так надо: автоматом подтаскивает завершение (перевод) строки, можно заменить на \;

Попадался и такой вариант:

#!/bin/bash

delete-all-dep-folders() {
  # `-prune` prevents building up lists of `node_modules` inside `node_modules`
  find ${1:-.} -type d -name "node_modules" -prune -exec rm -rf '{}' \; -exec echo 'Deleted {}' \;
  find ${1:-.} -type d -name "bower_components" -prune -exec rm -rf '{}' \; -exec echo 'Deleted {}' \;
}


После запуска скрипта (можно просто скопипастить в окошко баша) можно без параметров запустить команду `delete-all-dep-folders` в нужной папке или первым параметром задать путь:

$ delete-all-dep-folders /path/to/project-root

Напомню: если `bash` под cygwin, только тогда ему плевать на длину пути. Насколько это так, вы должны знать сами - где и какую версию Гита/Баша вы брали, там и надо читать: в интернетах найдется куча версий баша, скомпилированных с использованием нативных библиотек Windows, которые не используют cygwin!!!

2.

PowerShell. Якобы та самая "серебрянная пуля" от МелкоСофт. Вроде бы, плевать он хотел на длину пути. Якобы.

Если видели в документациях/интернатах другое - не спешите опровергать: с виндами никогда ничего не бывает однозначно, у нее (Винды), как у любой нормальной женщины, в словаре бинарной логики (либо "да", либо "нет") есть еще и значения "может быть", "не знаю" и "это не я".

Вариант:

Get-ChildItem -Path "." -Include "node_modules" -Recurse -File:$false  | Get-ChildItem -Recurse | Remove-Item -Recurse  -Force


Вполне рабочий, НО версия PowerShell >4.0. Более старые версии даже с ключом `-Force` не могут удалить НЕпустые папки.

Уточню: несмотря на то, что Remove-Item (он же del, он же ...) имеет возможность обозначать фильтры и работать рекурсивно, тем не менее необходимость конвейера (знак палки между командами) все-таки есть, и на эти грабли наступало уже очень много народу еще до того, как на ms-tech и в документации была признано и отмечено, что таки да, проблема есть и в качестве решения предлагается использовать конвейер, т.е. – через палку надо делать, и не делать тупо Delete.

И таки да, я нарвался на случай, когда это не сработало - на USB диске (NTFS) лежал старый проект на `Meteor`. Актуальности никакой, для истории тоже не находка, но он единственный усиленно сопротивлялся 4 с лишним часа. После чего мне надоело доискиваться причин такой стойкости и старый (честно купленный еще в прошлом веке) добрый Total Commander справился со всем проектом полностью за 1.897s.

3.

Победитель конкурса - Total Commander с настройками дисковых операций с помощью собственных (НЕ системных) функций. Не верьте документации: Windows, начиная с Vista, выполняет при дисковых операциях значительно больше "левых" действий для красоты, чем Commander, посему операции "его" функциями выполняются быстрее, чем "её" функциями. Совсем хорошо, если отключить в командере поддержку файлов описаний содержимого каталогов. Также, когда-то давно, мне попадался на глаза подключаемый модуль для командера, который заменял/дополнял поиск файлов на другой, в котором используется другая библиотека для работы с регулярными выражениями и дисковые операции можно выполнять сразу над результатами поиска без перекладывания во временную панель.

4.

Или мы не программисты? Пишем свой велосипед по рекурсивному обходу каталогов и `rimraf`-им чего надо. При этом не забываем положить сей золотой ключик отдельно, чтобы мимоходом не прибить его зависимости, и делаем для него консольный вызов. Успешно выкладываем в NPM и собираем звезды на Гитхабе. Дерзайте, а я настоящий программист, мне - лень, когда все просто и понятно :)
Ответ написан
Комментировать
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
У Вас какая-то рекурсия, скорее всего, в нормальном состоянии node_modules не должны так уж разрастаться.
PS: и юзайте centos, ubuntu или debian, зачем Вы так страдаете
Ответ написан
MAKAPOH
@MAKAPOH
многостаночник
Да, такая проблема под виндой есть. Для себя выход нашёл в использовании терминала bash из msys2, возможно и обычный cmd подойдёт, но мне сейчас проверить не на чем. Из терминала такие глубоко вложенные каталоги как ни странно удаляются.
Ответ написан
Комментировать
Как вариант можно удалить эту папку через Unlocker, процесс не самый быстрый, зато всегда 100% работает.
Ответ написан
Винда: я кстати тоже для себя способ сам случайно нашел. просто захожу в почти самую глубокую папку. вырезаю. вставляю на папок 5 выше. и так далее. эта операция в отличие от удаления или переименования работает у меня. и со временем путь становится короткий и все можно удалить shift-del. попробуйте)).

у меня просто SSD навернулся давно. и когда восстанавливал его (много конечно потерялось), но те файлы и папки что остались - некоторые папки были глубоко глубоко - вот так я их и удалил.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы