ng serve не обнаруживает изменения файлов автоматически

110

Мне нужно запускать ng serveкаждый раз, когда в исходные файлы вносятся какие-либо изменения, в консоли нет ошибки.

Angular CLI: 1.6.2
Node: 8.9.1
OS: linux ia32
Angular: 5.1.2
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

@angular/cdk: 5.0.2-c3d7cd9
@angular/cli: 1.6.2
@angular/material: 5.0.3-e20d8f0
@angular-devkit/build-optimizer: 0.0.36
@angular-devkit/core: 0.0.22
@angular-devkit/schematics: 0.0.42
@ngtools/json-schema: 1.1.0
@ngtools/webpack: 1.9.2
@schematics/angular: 0.1.11
@schematics/schematics: 0.0.11
typescript: 2.4.2
webpack: 3.10.0
Бхаскарарао Гуммиди
источник
2
Вы пробовали ng serve --watch?
planet_hunter 04
2
Да. Но это не решило мою проблему
Бхаскарарао Гуммиди
Пожалуйста, проверьте мой обновленный ответ и дайте мне знать, решит ли он проблему.
planet_hunter 04
Попробуйте этот способ - stackoverflow.com/a/42534127/1191125
zeleniy 01

Ответы:

151

В большинстве случаев в Linux ng serveили ng build --watchне работает, если каталог не имеет достаточных разрешений.

Решение - либо предоставить необходимые разрешения, либо использовать их sudoвместо них.

ОБНОВИТЬ

Флаг просмотра в ng serveдействительности избыточен, так как это опция по умолчанию. Благодарим @Zaphoid за указание на ошибку.

planet_hunter
источник
29
Спасибо. Бегу ng serveс sudoразрешениями. Это сработало.
Bhaskararao Gummidi
1
Тогда, пожалуйста, примите это как ответ, который поможет другим, кто прочитает этот вопрос в будущем
Mawg говорит восстановить Монику
3
@Mawg Вместо использования sudo. Какой набор разрешений должен иметь файлы?
oracleruiz
2
Зависит от пользователя, который работает, может быть столько же a+x, но я предостерегаю от использования разрешений, а не sudo. sudoпредназначена для одной команды, тогда как изменение разрешений меняет их навсегда, что кажется большей утечкой безопасности.
Mawg просит восстановить Монику
5
--watchне обязательно, так как это значение по умолчанию, см. angular.io/cli/serve . Итак, @T. Ответ ван ден Берга был на самом деле более точным!
Zaphoid
126
ng serve --poll=2000

Работает нормально в Linux и Windows

Дхандапани Логанатан
источник
19
что это значит (--poll)
HD ..
1
Могу подтвердить, что это работает. Запуск подсистемы linux в WIndows 10 (Ubuntu) с VS Code, работающим в Windows.
Алесь Поточник Хахонина
Работает на ubuntu 18.0.4
Нишан Викрамаратна
2
Это сработало на ubuntu 18.04. не могли бы вы описать его причину?
Виджендер Кумар
2
У меня отлично работает! Но я не понимаю, почему "ng serve" не перезагружает проект.
Хосе Луис Гонзага Нето,
81

Учтите, что при большом количестве файлов существует ограничение на INotify Watches в Linux. Так что, например, увеличение лимита часов до 512 КБ может решить эту проблему.

sudo sysctl fs.inotify.max_user_watches=524288
sudo sysctl -p --system

Обратите внимание, что предыдущее изменение вызывает изменение в памяти, которое вы потеряете после перезапуска.

Однако вы можете сделать его постоянным , выполнив:

echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

В качестве справки вы можете проверить: https://github.com/angular/angular-cli/issues/8313#issuecomment-362728855 и https://github.com/guard/listen/wiki/Increasing-the-amount- of-inotify-watchers

Мухаммад Алтабба
источник
5
Это сработало для меня на ubuntu 14 - "echo fs.inotify.max_user_watches = 524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system"
Махеш Каджале
1
Вы можете использовать это , чтобы проверить вводе команды / проверить текущий предел часов cat /proc/sys/fs/inotify/max_user_watches Над ответом будет полностью полный ответ , но вот связь с немного больше описание confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
Junaid
работал нормально. Стоит отметить, что некоторые IDE (например, JetBrains Webstorm) также используют inotify для отслеживания изменений файлов. так что имейте это в виду, если вы откроете 5 проектов, а затем запустите ng serve.
Multis
25

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

И решение состоит в том, что change the amount of watchesон может обрабатывать (максимальное количество файлов, которые будут в проекте), вы должны run this command:

echo 65536 | sudo tee -a /proc/sys/fs/inotify/max_user_watches

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

Чинтан Котадия
источник
5
echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
Вагнер да Силва
18

В вашем проекте папка dist принадлежит root

Попробуйте использовать sudo ng serveвместо ng serve.

Другое решение

Когда есть большое количество файлов, часы не работают в linux. Существует ограничение на INotify Watches в Linux. Так что увеличение лимита часов

//When live server not work in linux

sudo sysctl fs.inotify.max_user_watches=524288
sudo sysctl -p --system

ng serve //You can also do sudo **ng serve**
Биджай Пал
источник
8

Для решения проблемы нужно только запустить sudo ng serve.

Сандип Мишра
источник
5
Хороший обходной путь, но реальный вопрос - почему это нужно делать .... запуск с правами root - не лучшая практика ...
Пипо
5

Это может помочь, если это та же проблема, что и у меня. Пытался использовать ng serveи ng build --watchиногда работал, но в основном они не следили за изменениями кода, и я думал, что это как-то связано ng.

Затем я вспомнил о проблеме, которая у меня была некоторое время назад с часами inotify.

Я запустил это на своей машине с Ubuntu, и, похоже, он начал следить за изменениями кода:

echo fs.inotify.max_user_watches = 524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

кредит принадлежит Скотту Смиту

Арул Муруган
источник
3

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

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

cat /proc/sys/fs/inotify/max_user_watches

fs.inotify.max_user_watches=524288
Сухаг Лапани88
источник
3

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

ng serve --watch

Пытаться :

sudo ng serve

это сработало для меня!

Сахил Ралкар
источник
2

Если все остальное не помогает, проверьте свой код на наличие синтаксических ошибок, особенно в index.htmlчасти кода, которую вы недавно редактировали непосредственно перед тем, как это автоматическое обновление сломалось. Синтаксические ошибки нарушат функцию автоматического обновления в Angular.

В моем случае у меня было несколько проектов, открытых в отдельных окнах VS Code. Во всех других моих проектах все ng serveработало, как ожидалось: оно автоматически обновлялось при сохранении. Но в одном проекте для обновления потребуется ручное обновление. В конечном итоге это произошло из-за того, что у меня были html-комментарии за пределами определенной области HTML в шаблоне (так что комментарии HTML были раньше <!doctype html>. Так что это было недопустимым синтаксисом HTML вне области HTML.

Я стер комментарии и бац, автообновление снова заработало (после еще одного обновления вручную).

Так что просмотрите index.htmlили другие части вашего кода, которые вы недавно редактировали до того, как это сломалось, и одну за другой, вырезайте схематичные части, обновите в браузере, затем вернитесь в VS Code и внесите изменения, сохраните и посмотрите, обновляется ли он автоматически .

Кайл Васселла
источник
1
Другие ошибки в шаблоне также могут препятствовать его правильной работе. В моем случае, я должен был пользовательский компонент ожидает @Input(), но атрибут был пустым, как это: [myInput]="". Заполнение его восстановленным значением ng serve, ручное обновление не требуется.
Zarepheth
2

Я обнаружил, что папка dist / в проекте принадлежит пользователю root. Вот почему sudo ng serveвидит изменения, когда ng serveне видит .

Я удалил папку dist / sudo rm -R dist/и перестроил ее как текущий пользователь, запустив сервер разработки, ng serveи все снова заработало.

Т. ван ден Берг
источник
2

У меня возникла эта проблема при новой установке Linux Ubuntu, и я заметил, что одновременно получаю сообщение об ошибке «слишком много наблюдателей для ограничения» в VSCode. Я выполнил инструкции, чтобы исправить это в VSCode, а также исправил проблему с ng watch. Подробнее здесь https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

Я заметил, что люди предлагают sudoзапустить часы. Это опасная игра, вы предоставляете пакетам npm root-доступ к вашей системе. Если ваши разрешения верны, моя проблема может быть вашим исправлением, так как ограничение для каждого пользователя, и, работая как sudo, вы работаете как root, а не ваш текущий пользователь, который превышает предел (запускает часы с тяжелым ide, например vscode или atom на). Если по какой-то причине у вас неправильные разрешения, установите их правильно для вашего пользователя / группы с помощью chown.

Spera
источник
+1 за предложение использовать chownвместо запуска ng serveс sudo, чего следует избегать всеми средствами!
Тоби
1

У меня была такая же проблема, sudo ng serveказалось , что использование "решило" проблему неудовлетворительно. Использование sudoIMO неудовлетворительно.

Я проверил свой счетчик INotify по сравнению с моим пределом по умолчанию (8192), используя: lsof | grep inotify | wc -l Значение, возвращаемое приведенной выше командой, было намного меньше предела. Таким образом, решение INotify, похоже, не применимо к моей проблеме.

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

Из-за разочарования я перезапустил VS Code. В основном я закрыл все экземпляры, у меня было два запущенных, и я снова открыл оба, после чего проблема исчезла.

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

Донован
источник
1

Вы тоже можете попробовать это.

sudo ng serve
Гурприт Сингх
источник
1

Не рекомендую менять параметры SO. У меня возникли некоторые проблемы (лаг) после изменения параметра fs.inotify.max_user_watches, так как у вас будут работать другие службы ...

"Ng serve --poll = 2000" - хорошее решение, но вы, вероятно, забудете этот параметр ...

Изучение: https://github.com/angular/angular-cli/wiki/angular-cli Я сделал следующее решение.

Изменен файл angular.json с параметром опроса

"serve": {
   "builder....
   "options": {
        "browserTarget": "xkcd:build",
        "poll": 2000
   }
   ...

Работает на моей машине: D

Wdavilaneto
источник
Спасибо! Это специальный способ запустить его без изменения конфигурационных файлов: npm run ng serve -- --poll=2000. Это не так хорошо, как обнаружение изменения файла, но просто работает на моей машине (корпоративный вариант Ubuntu 18.04). У меня max_user_watches установлено на 524288, но ng serveчерез некоторое время все равно не удается обнаружить изменения. У меня есть дела поважнее, чем исследовать это, так что это решение как раз то, что мне нужно.
Андрей Синицон
1

Выполнение sudo ng serveкоманды - плохая практика. Вы должны изменить npmразрешение, чтобы каждый раз, если вам нужно установить некоторые, npm packagesвам не приходилось использовать sudo.

Эта ссылка может решить, как изменить разрешение npm для текущего пользователя, и после выполнения этих шагов после установки разрешения npm вы можете удалить node_modulesпапку из каталога проекта и использовать npm install. После завершения установки пакетов вы можете запускать, ng serveи вам не нужно делать это sudo ng serveкаждый раз, когда вы хотите запускать свой проект angular.


источник
1

для окна -

c:\>ng serve --open

Для Linux -

$sudo ng serve --open
Правинд Кумар
источник
0

Мой ответ может оказаться бесполезным. но я ищу этот вопрос из-за этого.

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

Кеннет Чан
источник
0

Я хотел бы оставить здесь свой случай для справки. В моем случае проблема была в разрешениях системы. Я использовал общую папку внутри виртуальной машины в качестве репо. У меня не было другого сообщения вроде отказа в разрешении или чего-то подобного. Все перепробовал, а потом просто понял, что использую сетевой диск.

Цакироглоу Фотис
источник
0

У меня сработал перезапуск сервера.

Беатрис
источник
0

Предоставление полного разрешения для папки проекта сработало для меня

Мохаммед Музаммил
источник
0

В моем случае на Mac это было исправлено предоставлением разрешения на чтение / запись зарегистрированному пользователю в / usr / local / lib.

Павел Попов
источник