ng nie wykrywa automatycznie zmian w plikach

110

Muszę uruchamiać się za ng servekażdym razem, gdy wprowadzono jakiekolwiek zmiany w plikach źródłowych.Nie mam błędu w konsoli.

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
Bhaskararao Gummidi
źródło
2
Czy próbowałeś służyć - patrzysz?
planet_hunter
2
Tak. Ale to nie rozwiązało mojego problemu
Bhaskararao Gummidi
Sprawdź moją zaktualizowaną odpowiedź i daj mi znać, jeśli to rozwiązuje problem.
planet_hunter
Spróbuj w ten sposób - stackoverflow.com/a/42534127/1191125
zeleniy

Odpowiedzi:

151

W większości przypadków w systemie Linux ng servelub ng build --watchnie działa, jeśli katalog nie ma wystarczających uprawnień.

Rozwiązaniem jest zapewnienie niezbędnych uprawnień lub ich użycie sudo.

AKTUALIZACJA

Watch flag in ng servejest w rzeczywistości zbędna, ponieważ jest opcją domyślną. Podziękowania dla @Zaphoid za wskazanie błędu.

planet_hunter
źródło
29
Dziękuję Ci. Biegam ng servez sudouprawnieniami. Udało się.
Bhaskararao Gummidi
1
Następnie zaakceptuj to jako odpowiedź, która pomoże innym, którzy przeczytają to pytanie w przyszłości
mówi Mawg, przywróć Monikę
3
@Mawg Zamiast używać sudo. Jaki zestaw uprawnień powinny mieć pliki?
oracleruiz
2
Zależy od użytkownika, który jest uruchomiony, może tak samo, jak a+x, ale ostrzegam przed używaniem uprawnień, a nie sudo. sudodotyczy jednego polecenia, podczas gdy zmiana uprawnień zmienia je na zawsze, co wydaje się większym wyciekiem bezpieczeństwa.
Mawg mówi, że przywróć Monikę
5
--watchnie powinno być konieczne, ponieważ jest to ustawienie domyślne, zobacz angular.io/cli/serve . Więc @T. Odpowiedź van den Berga była właściwie bardziej precyzyjna!
Zaphoid,
126
ng serve --poll=2000

Działa dobrze w Linuksie i Windowsie

Dhandapani Loganathan
źródło
19
co to znaczy (--poll)
HD ..
1
Potwierdzam, że to działa. Uruchamianie podsystemu linux w systemie Windows 10 (Ubuntu) z programem VS Code działającym w systemie Windows.
Ales Potocnik Hahonina
Działa na ubuntu 18.0.4
Nishān Wickramarathna
2
To działało na ubuntu 18.04. czy możesz opisać jego przyczynę?
Vijender Kumar
2
U mnie działa dobrze! Ale nie rozumiem przyczyny, dla której „ng serv” nie wczytuje ponownie projektu.
José Luiz Gonzaga Neto
81

Weź pod uwagę, że w przypadku dużej liczby plików istnieje limit w INotify Watches w systemie Linux. Na przykład zwiększenie limitu zegarków do 512K może rozwiązać ten problem.

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

Zwróć uwagę, że poprzednia powoduje zmianę w pamięci, którą utracisz po ponownym uruchomieniu.

Możesz jednak uczynić go trwałym , wykonując:

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

Jako punkt odniesienia możesz sprawdzić: https://github.com/angular/angular-cli/issues/8313#issuecomment-362728855 i https://github.com/guard/listen/wiki/Increasing-the-amount- of-inotify-watchers

Muhammad Altabba
źródło
5
To zadziałało dla mnie na ubuntu 14 - "echo fs.inotify.max_user_watches = 524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system"
mahesh kajale
1
możesz użyć tego polecenia, aby sprawdzić / przetestować aktualny limit zegarków. cat /proc/sys/fs/inotify/max_user_watches Powyższa odpowiedź jest kompletną odpowiedzią, ale tutaj jest link z nieco większym opisem confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
czerwiec
działało dobrze. Warto zauważyć, że niektóre IDE (takie jak JetBrains Webstorm) używają również inotify do śledzenia zmian plików. więc miej to na uwadze, jeśli otworzysz 5 projektów i uruchomisz usługę.
Multis
25

Z tego powodu system wykrywający zmiany domyślnie nie obsługuje tylu zegarków.

A rozwiązaniem jest to, change the amount of watchesże poradzi sobie (maksymalna ilość plików, które znajdą się w projekcie) musisz run this command:

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

Problem z inotify polega na resetowaniu tego licznika po każdym ponownym uruchomieniu komputera.

Chintan Kotadiya
źródło
5
echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
Wagner da Silva
18

W Twoim projekcie folder dist należy do katalogu głównego

Spróbuj użyć sudo ng servezamiast ng serve.

Inne rozwiązanie

Gdy jest duża liczba plików, funkcja Watch nie działa w systemie Linux.Istnieje limit w INotify Watches w systemie Linux. Zwiększenie limitu zegarków

//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**
Bijay Pal
źródło
8

Wystarczy uruchomić sudo ng, aby rozwiązać problem.

Sandeep Mishra
źródło
5
Ładne obejście ale dlaczego mając do tego jest prawdziwe pytanie .... uruchomiony jako root nie jest najlepsza praktyka ...
Pipo
5

Może to pomóc, jeśli jest to ten sam problem, który miałem. Próbowałem użyć ng servei ng build --watchczasami działało, ale przeważnie nie obserwowali zmian w kodzie i pomyślałem, że to ma coś wspólnego z ng.

Wtedy przypomniałem sobie problem, który miałem jakiś czas temu z zegarkami inotify

Uruchomiłem to na moim komputerze z Ubuntu i wydaje się, że włączyłem się i obserwowałem zmiany kodu:

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

zasługa Scotta Smitha

arul murugan
źródło
3

Spróbuj tego. Jeśli to zrobisz, nie musisz zawsze odpalać żadnej komendy. Wystrzelisz tylko raz

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
Suhag Lapani88
źródło
3

Nie działa dla mnie:

ng serve --watch

Próbować :

sudo ng serve

to działało dla mnie!

Sahil Ralkar
źródło
2

Jeśli wszystko inne zawiedzie, sprawdź kod pod kątem błędów składniowych - szczególnie w index.htmlkodzie lub jego części, które niedawno edytowałeś tuż przed zepsuciem automatycznej aktualizacji. Błędy składniowe zakłócą funkcję automatycznej aktualizacji w Angular.

W moim przypadku miałem wiele projektów otwartych w oddzielnych oknach VS Code. We wszystkich innych moich projektach ng servedziałało zgodnie z oczekiwaniami: automatycznie aktualizowało się przy zapisywaniu. Jednak w przypadku jednego projektu aktualizacja wymagałaby ręcznego odświeżenia. Skończyło się tak, ponieważ miałem komentarze html poza zdefiniowanym obszarem HTML szablonu (więc komentarze HTML pojawiły się wcześniej <!doctype html>. Więc było to nieprawidłowe, ponieważ składnia HTML znajduje się poza obszarem HTML.

Usunąłem komentarze i bam, automatyczna aktualizacja znów zaczęła działać (po jeszcze jednym ręcznym odświeżeniu).

Więc przejrzyj index.htmllub inne części kodu, które niedawno edytowałeś, zanim to się zepsuło, i jeden po drugim, wytnij szkicowe części, odśwież w przeglądarce, a następnie wróć do VS Code i wprowadź zmianę, zapisz i sprawdź, czy automatycznie się aktualizuje .

Kyle Vassella
źródło
1
Inne błędy szablonu mogą również uniemożliwić jego prawidłowe działanie. W moim przypadku, miałem zwyczaj składnik oczekiwał @Input(), ale atrybut był pusty, tak: [myInput]="". Wypełnianie go przywróconą wartością ng serve, nie jest wymagane ręczne odświeżanie.
Zarepheth
2

Odkryłem, że katalog dist / w projekcie był własnością roota. Dlatego sudo ng servewidzi zmiany, kiedy ng servenie.

Usunąłem folder dist / sudo rm -R dist/i odbudowałem go jako bieżący użytkownik, uruchamiając serwer deweloperski ng servei wszystko działało ponownie.

T. van den Berg
źródło
2

Miałem ten problem na nowej instalacji Linuksa Ubuntu i zauważyłem, że w tym samym czasie w VSCode pojawia się błąd dotyczący „zbyt wielu obserwatorów dla limitu”. Postępowałem zgodnie z instrukcjami, aby naprawić to w VSCode, a także naprawiłem problem z zegarkiem ng. Więcej informacji tutaj https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

Zauważyłem ludzi sugerujących sudobieganie na warcie. To niebezpieczna gra, dajesz pakietom npm uprawnienia roota do swojego systemu. Jeśli twoje uprawnienia są poprawne, moim problemem może być twoja poprawka, ponieważ limit dotyczy użytkownika, a uruchamiając jako sudo, korzystasz z konta root zamiast bieżącego użytkownika, który przekroczył limit (uruchamiając ciężki identyfikator, taki jak vscode lub atom włączony). Jeśli z jakiegoś powodu masz złe uprawnienia, ustaw je poprawnie dla swojego użytkownika / grupy za pomocą chown.

Spera
źródło
+1 za sugerowanie używać chownzamiast biegać ng servez sudo, których należy unikać za wszelką cenę!
Tobi
1

Miałem ten sam problem, używanie sudo ng servewydawało się „rozwiązać” problem niezadowalająco. Używanie sudoIMO nie jest zadowalające.

Sprawdziłem liczbę INotify w porównaniu z moim domyślnym limitem (8192), używając: lsof | grep inotify | wc -l Wartość zwrócona przez powyższe polecenie była znacznie mniejsza niż limit. Więc rozwiązanie INotify wydaje się nie mieć zastosowania do mojego problemu.

Sprawdziłem również uprawnienia i własność, oba wydawały się w porządku, porównywalne z innym projektem, który działał.

Z frustracji ponownie uruchomiłem VS Code. Zasadniczo zamknąłem wszystkie wystąpienia, miałem dwie uruchomione i ponownie otworzyłem obie, po czym problem zniknął.

Skłaniam się gdzieś w kierunku możliwego błędu. Należy to rozważyć przed wywróceniem systemu na lewą stronę. Na szczęście / Niestety ten problem nie wystąpił ponownie, poszukam głębiej, jeśli tak się stanie.

Donovan
źródło
1

Ty też możesz spróbować.

sudo ng serve
Gurpreet Singh
źródło
1

Nie polecam zmieniać parametrów SO. Po zmianie parametru fs.inotify.max_user_watches wystąpiły pewne problemy (z opóźnieniem), ponieważ będą działały inne usługi ...

Dobrym rozwiązaniem jest „ng serv --poll = 2000”, ale prawdopodobnie zapomnisz o tym parametrze ...

Badanie: https://github.com/angular/angular-cli/wiki/angular-cli Zrobiłem następujące rozwiązanie.

Zmieniono de angular.json z parametrem ankiety

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

Działa na mojej maszynie: D

wdavilaneto
źródło
Dziękuję Ci! Jest to sposób doraźny, aby go uruchomić bez modyfikacji plików konfiguracyjnych: npm run ng serve -- --poll=2000. Nie jest to tak przyjemne, jak wykrywanie zmian plików, ale działa po prostu na moim komputerze (korporacyjna wersja Ubuntu 18.04). Mam wartość max_user_watches ustawioną na 524288, ale ng servepo pewnym czasie nadal nie udaje mi się wykryć zmian. Mam lepsze rzeczy do zrobienia niż zbadanie tego, więc to rozwiązanie jest właśnie tym, czego potrzebuję.
Andrei Sinitson
1

Wykonywanie sudo ng servepoleceń to zła praktyka. Musisz zmienić npmuprawnienia, aby za każdym razem, gdy musisz coś zainstalować npm packages, nie musisz używać sudo.

To łącze może rozwiązać sposób zmiany uprawnienia npm na bieżącego użytkownika, a po wykonaniu tych kroków po ustawieniu uprawnienia npm można usunąć node_modulesfolder z katalogu projektu i użyć npm install. Po zakończeniu instalacji pakietów możesz uruchomić ng servei nie musisz tego robić za sudo ng servekażdym razem, gdy chcesz uruchomić swój projekt angular.


źródło
1

do okna -

c:\>ng serve --open

W systemie Linux -

$sudo ng serve --open
Pravind Kumar
źródło
0

Moja odpowiedź może się nie przydać. ale szukam tego pytania z tego powodu.

Po zakupie nowego komputera zapomniałem ustawić automatyczne zapisywanie w edytorze. Dlatego kod faktycznie pozostaje niezmieniony.

Kenneth Chan
źródło
0

Chciałbym zostawić tutaj moją sprawę, tylko w celach informacyjnych. W moim przypadku problem dotyczył uprawnień systemu. Użyłem folderu współdzielonego wewnątrz maszyny wirtualnej jako repozytorium. Nie otrzymałem żadnej innej wiadomości, takiej jak odmowa pozwolenia czy coś takiego. Wypróbowałem wszystko, a potem właśnie zdałem sobie sprawę, że używam dysku sieciowego.

Tsakiroglou Fotis
źródło
0

Ponowne uruchomienie serwera zadziałało.

Beatrice
źródło
0

Udzielenie pełnych uprawnień do folderu projektu zadziałało dla mnie

Mohammed Muzammil
źródło
0

W moim przypadku na Macu zostało to naprawione poprzez przyznanie zalogowanemu użytkownikowi uprawnień do odczytu / zapisu do / usr / local / lib

Pavel Popov
źródło