ng serve ne détecte pas automatiquement les modifications de fichiers


110

Je dois exécuter à ng servechaque fois que des modifications sont apportées aux fichiers source.Je n'ai aucune erreur dans la 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
Avez-vous essayé ng serve --watch?
planet_hunter

2
Oui. Mais cela n'a pas résolu mon problème
Bhaskararao Gummidi

Veuillez vérifier ma réponse mise à jour et me faire savoir si cela résout le problème.
planet_hunter

Essayez de cette façon - stackoverflow.com/a/42534127/1191125
zeleniy

Réponses:


151

La plupart du temps sous Linux, ng serveou ng build --watchne fonctionne pas si le répertoire ne dispose pas des autorisations suffisantes.

La solution consiste soit à fournir les autorisations nécessaires, soit à utiliser à la sudoplace.

METTRE À JOUR

watch flag in ng serveest en fait redondant car c'est l'option par défaut. Merci à @Zaphoid d'avoir signalé l'erreur.


29
Je vous remercie. Je cours ng serveavec des sudoautorisations. Ça a marché.
Bhaskararao Gummidi

1
Alors, veuillez accepter ceci comme réponse, ce qui aidera les autres qui liront cette question à l'avenir
Mawg dit de réintégrer Monica le

3
@Mawg au lieu d'utiliser sudo. Quel ensemble d'autorisations les fichiers doivent avoir?
oracleruiz

2
Cela dépend de l'utilisateur en cours d'exécution, peut-être autant que a+x, mais je mets en garde contre l'utilisation des autorisations, plutôt que sudo. sudoest pour une seule commande, alors que la modification des autorisations les change pour toujours, ce qui semble une plus grande fuite de sécurité.
Mawg dit de réintégrer Monica

5
--watchne devrait pas être nécessaire, car il s'agit d'une valeur par défaut, voir angular.io/cli/serve . Alors @T. La réponse de van den Berg était en fait plus précise!
Zaphoid

126
ng serve --poll=2000

Fonctionne bien sous Linux et Windows


19
qu'est-ce que cela signifie (--poll)
HD ..

1
Peut confirmer que cela fonctionne. Exécution du sous-système Linux sur WIndows 10 (Ubuntu) avec VS Code exécuté sur Windows.
Ales Potocnik Hahonina

Fonctionne sur ubuntu 18.0.4
Nishān Wickramarathna

2
Cela a fonctionné sur Ubuntu 18.04. pouvez-vous s'il vous plaît décrire sa raison?
Vijender Kumar le

2
Pour moi ça marche bien! Mais, je ne comprends pas la cause "ng serve" ne recharge pas le projet.
José Luiz Gonzaga Neto

81

Considérez que, lorsque vous avez un grand nombre de fichiers, il existe une limite chez INotify Watches sous Linux. Ainsi, augmenter la limite des montres à 512K, par exemple, peut résoudre ce problème.

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

Notez que le précédent entraîne une modification en mémoire que vous perdrez après le redémarrage.

Cependant, vous pouvez le rendre persistant , en exécutant:

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

A titre de référence, vous pouvez vérifier: https://github.com/angular/angular-cli/issues/8313#issuecomment-362728855 et https://github.com/guard/listen/wiki/Increasing-the-amount- observateurs-inotify


5
Cela a fonctionné pour moi sur 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
vous pouvez utiliser cette commande pour vérifier / tester la limite de surveillance actuelle. La cat /proc/sys/fs/inotify/max_user_watches réponse ci-dessus est une réponse totalement complète, mais voici un lien avec un peu plus de description confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
Junaid

a bien fonctionné. il convient de noter que certains IDE (comme JetBrains Webstorm) utilisent également inotify pour suivre les modifications de fichiers. donc, gardez cela à l'esprit si vous ouvrez 5 projets et que vous exécutez ng serve.
Multis

25

En raison de, le système qui détecte les modifications ne peut pas gérer autant de montres par défaut.

Et la solution est de change the amount of watchespouvoir gérer (le nombre maximum de fichiers qui seront dans le projet), vous devez run this command:

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

Le problème avec inotify est la réinitialisation de ce compteur chaque fois que vous redémarrez votre ordinateur.


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

18

Dans votre projet, le dossier dist est propre à la racine

Essayez d'utiliser à la sudo ng serveplace de ng serve.

Une autre solution

Quand il y a un grand nombre de fichiers, la montre ne fonctionne pas sous Linux, il y a une limite chez INotify Watches sur Linux. Donc augmenter la limite de montres

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

Il suffit d'exécuter sudo ng serve pour résoudre le problème.


5
Belle solution de contournement, mais pourquoi le faire est la vraie question ... courir en tant que root n'est pas la meilleure pratique ...
Pipo

5

Cela peut aider si c'est le même problème que j'ai eu. Essayer d'utiliser ng serveet ng build --watchparfois travaillé, mais la plupart du temps, ils ne surveillaient pas les changements de code et je pensais que c'était quelque chose à voir avec ng.

Puis je me suis souvenu d'un problème que j'avais eu il y a quelque temps avec les montres inotify

J'ai exécuté ceci sur ma machine Ubuntu et il semble avoir démarré et regarder les changements de code:

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

le mérite revient à Scott Smith


3

essaye ça. Si vous faites comme ça, vous n'avez pas besoin de toujours tirer une commande Vous n'avez besoin de tirer qu'une seule fois

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

Cela n'a pas fonctionné pour moi:

ng serve --watch

Essayez:

sudo ng serve

cela a fonctionné pour moi!


2

Si tout le reste échoue, vérifiez votre code pour les erreurs de syntaxe, en particulier sur index.htmlou sur des parties de votre code que vous avez récemment modifiées juste avant que cette mise à jour automatique ne soit interrompue. Les erreurs de syntaxe casseront cette fonctionnalité de mise à jour automatique dans Angular.

Dans mon cas, j'avais plusieurs projets ouverts dans des fenêtres VS Code séparées. Sur tous mes autres projets, a ng servefonctionné comme prévu: il est mis à jour automatiquement lors de l'enregistrement. Mais sur un projet, il faudrait une actualisation manuelle pour mettre à jour. Cela a fini par être parce que j'avais des commentaires html en dehors de la zone HTML définie du modèle (donc, les commentaires HTML sont venus avant <!doctype html>. Donc c'était invalide bc c'est la syntaxe HTML en dehors d'une zone HTML.

J'ai effacé les commentaires et bam, la mise à jour automatique a recommencé à fonctionner (après un autre rafraîchissement manuel).

Alors parcourez index.htmlou d'autres parties de votre code que vous avez récemment modifiées avant que cela ne soit cassé et une par une, découpez les parties fragmentaires, faites une actualisation dans le navigateur, puis revenez à VS Code et apportez une modification, enregistrez et voyez si elle se met à jour automatiquement .


1
D'autres erreurs avec le modèle peuvent également l'empêcher de fonctionner correctement. Dans mon cas, je devais attendre un composant personnalisé @Input(), mais l'attribut était vide, comme ceci: [myInput]="". En le remplissant avec une valeur restaurée ng serve, aucune actualisation manuelle n'est requise.
Zarepheth

2

J'ai découvert que le dossier dist / dans le projet appartenait à root. C'est pourquoi sudo ng servevoit les changements quand ng servene le fait pas.

J'ai supprimé le dossier dist / sudo rm -R dist/et le reconstruire en tant qu'utilisateur actuel en démarrant le serveur de développement ng serveet tout a fonctionné à nouveau.


2

J'avais ce problème sur une nouvelle installation Linux Ubuntu et j'ai remarqué que j'obtenais une erreur concernant `` trop d'observateurs pour la limite '' dans VSCode en même temps. J'ai suivi les instructions pour le réparer dans VSCode et cela a également résolu le problème avec ng watch. Plus d'informations ici https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

J'ai remarqué des gens qui suggéraient sudode faire la montre. C'est un jeu dangereux, vous donnez aux packages npm un accès root à votre système. Si vos autorisations sont correctes, mon problème pourrait être votre solution puisque la limite est par utilisateur, et en exécutant en tant que sudo, vous exécutez en tant que root au lieu de votre utilisateur actuel qui est au-delà de la limite (exécutez une montre lourde ide comme vscode ou atom sur ). Si, pour une raison quelconque, vous avez les mauvaises autorisations, définissez-les correctement sur votre utilisateur / groupe avec chown.


+1 pour avoir suggéré d'utiliser chownau lieu de courir ng serveavec sudo, ce qui devrait être évité par tous les moyens!
Tobi

1

J'ai eu le même problème, l'utilisation sudo ng servesemblait "résoudre" le problème de manière insatisfaisante. L'utilisation sudon'est pas satisfaisante IMO.

J'ai vérifié mon compte INotify par rapport à ma limite par défaut (8192) en utilisant: lsof | grep inotify | wc -l La valeur renvoyée par la commande ci-dessus était bien inférieure à la limite. La solution INotify ne semblait donc pas s'appliquer à mon problème.

J'ai également vérifié les autorisations et la propriété, les deux semblaient ok, comparables à un autre projet qui a fonctionné.

Par frustration, j'ai redémarré VS Code. Fondamentalement, j'ai fermé toutes les instances, j'ai eu deux en cours d'exécution et les deux ont rouvert après quoi le problème a disparu.

Je me penche vers un bug possible quelque part. Ceci est quelque chose à considérer avant de transformer votre système à l'envers. Heureusement / Malheureusement, ce problème ne s'est pas reproduit, je vais creuser plus profondément si c'est le cas.



1

Je ne recommande pas de modifier les paramètres SO. J'ai rencontré des problèmes (de décalage) après avoir modifié le paramètre fs.inotify.max_user_watches car vous aurez d'autres services en cours d'exécution ...

Le "ng serve --poll = 2000" est une bonne solution mais vous oublierez probablement ce paramètre ...

Enquête: https://github.com/angular/angular-cli/wiki/angular-cli J'avais fait la solution suivante.

Changement de angular.json avec le paramètre poll

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

Fonctionne sur ma machine: D


Je vous remercie! Ceci est ad hoc façon de l' exécuter sans modifier les fichiers de configuration: npm run ng serve -- --poll=2000. Ce n'est pas aussi agréable que la détection de changement de fichier, mais fonctionne simplement sur ma machine (version d'entreprise d'Ubuntu 18.04). J'ai mis max_user_watches à 524288, mais je ng serven'arrive toujours pas à détecter les changements après un certain temps. J'ai mieux à faire que d'enquêter sur cela, donc cette solution est exactement ce dont j'ai besoin.
Andrei Sinitson

1

Faire la sudo ng servecommande est une mauvaise pratique. Vous devez modifier l' npmautorisation de sorte qu'à chaque fois, si vous devez en installer, npm packagesvous n'ayez pas à les utiliser sudo.

Ce lien peut résoudre comment modifier l'autorisation npm pour l'utilisateur actuel et après avoir suivi ces étapes après avoir défini l'autorisation npm, vous pouvez supprimer le node_modulesdossier de votre répertoire de projet et utilisernpm install . Une fois l'installation des packages terminée, vous pouvez exécuter ng serveet vous n'avez pas à le faire à sudo ng servechaque fois que vous souhaitez exécuter votre projet angulaire.



0

Ma réponse peut ne pas être utile. mais je recherche cette question à cause de cela.

Après avoir acheté un nouvel ordinateur, j'oublie de définir la sauvegarde automatique dans l'éditeur. Par conséquent, le code reste inchangé.


0

Je voudrais laisser mon cas ici, juste pour référence. Dans mon cas, le problème concernait les autorisations système. J'ai utilisé un dossier partagé dans une machine virtuelle comme dépôt. Je n'avais aucun autre message comme l'autorisation refusée ou quelque chose comme ça. J'ai tout essayé, puis j'ai réalisé que j'utilisais un lecteur réseau.




0

Dans mon cas sur Mac, cela a été corrigé en accordant une autorisation de lecture / écriture à l'utilisateur connecté à / usr / local / lib

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.