ng serve non rileva automaticamente le modifiche ai file


110

Devo eseguire ng serveogni volta che vengono apportate modifiche ai file di origine.Non ho errori nella console.

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
Hai provato a servire - guarda?
planet_hunter

2
Sì. Ma non ha risolto il mio problema
Bhaskararao Gummidi

Per favore controlla la mia risposta aggiornata e fammi sapere se risolve il problema.
planet_hunter

Risposte:


151

La maggior parte delle volte in Linux ng serveo ng build --watchnon funziona se la directory non dispone di autorizzazioni sufficienti.

La soluzione è fornire le autorizzazioni necessarie o utilizzare sudoinvece.

AGGIORNARE

watch flag in ng serveè effettivamente ridondante in quanto è l'opzione predefinita. Ringraziamo @Zaphoid per aver sottolineato l'errore.


29
Grazie. Corro ng servecon i sudopermessi. Ha funzionato.
Bhaskararao Gummidi

1
Quindi, per favore accetta questa come risposta, che aiuterà gli altri che leggeranno questa domanda in futuro
Mawg dice reintegrare Monica

3
@Mawg Invece di usare sudo. Quale serie di autorizzazioni dovrebbero avere i file?
oracleruiz

2
Dipende dall'utente che è in esecuzione, forse tanto quanto a+x, ma metto in guardia dall'usare i permessi, piuttosto che sudo. sudoè per un singolo comando, mentre la modifica dei permessi li cambia per sempre, il che sembra una maggiore perdita di sicurezza.
Mawg dice di reintegrare Monica

5
--watchnon dovrebbe essere necessario, poiché è un valore predefinito, vedere angular.io/cli/serve . Quindi @T. La risposta di van den Berg è stata in realtà più precisa!
Zaphoid

126
ng serve --poll=2000

Funziona bene in Linux e Windows


19
cosa significa (--poll)
HD ..

1
Posso confermare che funziona. Esecuzione del sottosistema Linux su Windows 10 (Ubuntu) con VS Code in esecuzione su Windows.
Ales Potocnik Hahonina

Funziona su Ubuntu 18.0.4
Nishān Wickramarathna

2
Ha funzionato su Ubuntu 18.04. puoi descriverne il motivo?
Vijender Kumar

2
Per me funziona bene! Ma non capisco la causa "ng serve" non ricaricare il progetto.
José Luiz Gonzaga Neto

81

Considera che, quando hai un gran numero di file, c'è un limite in INotify Watches su Linux. Quindi aumentare il limite di orologi a 512K, ad esempio, può risolvere questo problema.

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

Nota che il precedente causa una modifica in memoria che perderai dopo il riavvio.

Tuttavia, puoi renderlo persistente , eseguendo:

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

Come riferimento, puoi controllare: https://github.com/angular/angular-cli/issues/8313#issuecomment-362728855 e https://github.com/guard/listen/wiki/Increasing-the-amount- di-inotify-watchers


5
Questo ha funzionato per me su 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
puoi usare questo comando per controllare / testare il limite di sorveglianza corrente La cat /proc/sys/fs/inotify/max_user_watches risposta sopra è una risposta completamente completa, ma ecco un link con un po 'più di descrizione confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
Junaid

ha funzionato bene. vale la pena notare che alcuni IDE (come JetBrains Webstorm) utilizzano inotify anche per tenere traccia delle modifiche ai file. quindi tienilo a mente se apri 5 progetti e poi esegui ng serve.
Multis

25

Per questo motivo, il sistema che rileva le modifiche non può gestire così tanti orologi per impostazione predefinita.

E la soluzione è change the amount of watchesche può gestire (la quantità massima di file che sarà nel progetto) devi run this command:

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

Il problema con inotify è la reimpostazione di questo contatore ogni volta che si riavvia il computer.


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

18

Nel tuo progetto la cartella dist è di proprietà di root

Prova a usare sudo ng serveinvece di ng serve.

Un'altra soluzione

Quando c'è un gran numero di file watch non funziona su Linux. C'è un limite a INotify Watches su Linux. Quindi aumentando il limite di orologi

//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

È sufficiente eseguire sudo ng serve per risolvere il problema.


5
Bella soluzione alternativa, ma perché doverlo fare è la vera domanda ... eseguire come root non è la migliore pratica ...
Pipo

5

Questo può aiutare se è lo stesso problema che ho avuto. Cercando di usare ng serveea ng build --watchvolte funzionava, ma per lo più non stavano guardando le modifiche al codice e ho pensato che fosse qualcosa a che fare con ng.

Poi mi sono ricordato di un problema che avevo avuto tempo fa con gli orologi inotify

L'ho eseguito sulla mia macchina Ubuntu e sembra che sia entrato in funzione e abbia guardato le modifiche al codice:

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

il merito va a Scott Smith


3

prova questo. Se fai così non hai bisogno di sparare sempre nessun comando. Devi sparare solo una volta

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

3

Non ha funzionato per me:

ng serve --watch

Provare :

sudo ng serve

questo ha funzionato per me!


2

Se tutto il resto fallisce, controlla il tuo codice per errori di sintassi, in particolare su index.htmlo parti del codice che hai modificato di recente appena prima che l'aggiornamento automatico si interrompesse. Gli errori di sintassi interromperanno questa funzionalità di aggiornamento automatico in Angular.

Nel mio caso, avevo più progetti aperti in finestre VS Code separate. Su tutti gli altri miei progetti, ha ng servefunzionato come previsto: si aggiornava automaticamente al salvataggio. Ma su un progetto richiederebbe un aggiornamento manuale per l'aggiornamento. Finì per essere perché avevo commenti html al di fuori dell'area HTML definita del modello (quindi, i commenti HTML erano precedenti <!doctype html>. Quindi non era valido bc è la sintassi HTML al di fuori di un'area HTML.

Ho cancellato i commenti e bam, l'aggiornamento automatico ha ricominciato a funzionare (dopo un altro aggiornamento manuale).

Quindi passa attraverso index.htmlo altre parti del tuo codice che hai modificato di recente prima che si rompesse e una per una, ritaglia le parti abbozzate, fai un aggiornamento nel browser, quindi torna a VS Code e apporta una modifica, salva e vedi se si aggiorna automaticamente .


1
Altri errori con il modello possono anche impedirne il corretto funzionamento. Nel mio caso, ho avuto personalizzato componente aspetta un @Input(), ma l'attributo era vuoto, in questo modo: [myInput]="". Riempiendolo con un valore ripristinato ng serve, nessun aggiornamento manuale richiesto.
Zarepheth

2

Ho scoperto che la cartella dist / nel progetto era di proprietà di root. Ecco perché sudo ng servevede i cambiamenti quando ng servenon lo fa.

Ho rimosso la cartella dist / sudo rm -R dist/e l'ho ricostruita come utente corrente avviando il server di sviluppo ng servee tutto ha funzionato di nuovo.


2

Stavo riscontrando questo problema su una nuova installazione di Linux Ubuntu e ho notato che ricevevo un errore su "troppi watcher per limite" in VSCode allo stesso tempo. Ho seguito le istruzioni per risolverlo in VSCode e ha anche risolto il problema con ng watch. Maggiori informazioni qui https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

Ho notato che le persone suggerivano sudodi correre a guardare. Questo è un gioco pericoloso, stai dando ai pacchetti npm l'accesso come root al tuo sistema. Se le tue autorizzazioni sono corrette, il mio problema potrebbe essere la tua soluzione poiché il limite è per utente e, eseguendo come sudo, stai eseguendo come root invece del tuo utente corrente che ha superato il limite (eseguendo un ide pesante come vscode o atom sopra ). Se per qualche motivo hai i permessi sbagliati, impostali correttamente sul tuo utente / gruppo con chown.


+1 per aver suggerito di usare chowninvece di correre ng servecon sudo, cosa che dovrebbe essere evitata con tutti i mezzi!
Tobi,

1

Ho avuto lo stesso problema, l'utilizzo sudo ng servesembrava "risolvere" il problema in modo insoddisfacente. L'utilizzo sudonon è soddisfacente IMO.

Ho controllato il mio conteggio INotify rispetto al mio limite predefinito (8192) usando: lsof | grep inotify | wc -l Il valore restituito dal comando precedente era molto inferiore al limite. Quindi la soluzione INotify non sembrava applicarsi al mio problema.

Ho anche controllato i permessi e la proprietà, entrambi sembravano ok, paragonabili a un altro progetto che ha funzionato.

Per la frustrazione ho riavviato VS Code. Fondamentalmente ho chiuso tutte le istanze, ne avevo due in esecuzione e riaperte entrambe dopo di che il problema è andato via.

Mi sto appoggiando a un possibile bug da qualche parte. Questo è qualcosa da considerare prima di capovolgere il tuo sistema. Fortunatamente / Sfortunatamente questo problema non si è più verificato, approfondirò se lo fa.



1

Non consiglio di modificare i parametri SO. Ho riscontrato alcuni problemi (lag) dopo aver modificato il parametro fs.inotify.max_user_watches poiché avrai altri servizi in esecuzione ...

"Ng serve --poll = 2000" è una buona soluzione ma probabilmente dimenticherai questo parametro ...

Indagare: https://github.com/angular/angular-cli/wiki/angular-cli Avevo fatto la seguente soluzione.

Modificato de angular.json con il parametro poll

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

Funziona sulla mia macchina: D


Grazie! Questo è il modo ad hoc per farlo funzionare senza modificare i file di configurazione: npm run ng serve -- --poll=2000. Questo non è bello come il rilevamento delle modifiche ai file, ma funziona solo sulla mia macchina (versione aziendale di Ubuntu 18.04). Max_user_watches è impostato su 524288, ma ng servenon riesce ancora a rilevare le modifiche dopo un po 'di tempo. Ho cose migliori da fare che indagare su questo, quindi questa soluzione è proprio ciò di cui ho bisogno.
Andrei Sinitson

1

Eseguire il sudo ng servecomando è una cattiva pratica. Devi modificare i npmpermessi in modo che ogni volta che devi installarne alcuni npm packagesnon devi usarli sudo.

Questo collegamento può risolvere come modificare l'autorizzazione npm per l'utente corrente e dopo aver seguito questi passaggi dopo aver impostato l'autorizzazione npm è possibile rimuovere la node_modulescartella dalla directory del progetto e utilizzare npm install. Dopo il completamento dell'installazione dei pacchetti puoi eseguire ng servee non devi farlo sudo ng serveogni volta che vuoi eseguire il tuo progetto angolare.



0

La mia risposta potrebbe non essere utile. ma cerco questa domanda per questo motivo.

Dopo aver acquistato un nuovo computer, dimentico di impostare il salvataggio automatico nell'editor. Pertanto, il codice rimane effettivamente invariato.


0

Vorrei lasciare il mio caso qui, solo per riferimento. Nel mio caso, il problema riguardava le autorizzazioni di sistema. Ho usato una cartella condivisa all'interno di una VM come repository. Non avevo nessun altro messaggio come permesso negato o qualcosa del genere. Ho provato di tutto e poi mi sono reso conto che stavo usando un'unità di rete.




0

Nel mio caso su Mac è stato risolto concedendo l'autorizzazione di lettura / scrittura all'utente connesso a / usr / local / lib

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.