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 за указание на ошибку.


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


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.


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

1

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

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

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

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

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



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


Спасибо! Это специальный способ запустить его без изменения конфигурационных файлов: 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.



0

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

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


0

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




0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.