O servidor não detecta alterações de arquivo automaticamente


110

Preciso executar ng servesempre que houver alterações feitas nos arquivos de origem. Não tenho erro no 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
Você tentou servir --watch?
planet_hunter

2
Sim. Mas isso não resolveu meu problema
Bhaskararao Gummidi

Verifique minha resposta atualizada e me informe se ela resolve o problema.
planet_hunter

Respostas:


151

Na maioria das vezes no Linux, ng serveou ng build --watchnão funciona se o diretório não tiver permissões suficientes.

A solução é fornecer as permissões necessárias ou usar em seu sudolugar.

ATUALIZAR

watch flag in ng serveé redundante, pois é a opção padrão. Agradecemos a @Zaphoid por apontar o erro.


29
Obrigado. Eu corro ng servecom sudopermissões. Funcionou.
Bhaskararao Gummidi

1
Então, aceite esta como a resposta, o que ajudará outras pessoas que lerem essa pergunta no futuro
Mawg diz para restabelecer Monica

3
@Mawg Em vez de usar sudo. Qual conjunto de permissões os arquivos devem ter?
oracleruiz

2
Depende do usuário que está executando, talvez tanto quanto a+x, mas eu aviso contra o uso de permissões, ao invés de sudo. sudoé para um único comando, ao passo que alterar as permissões as altera para sempre, o que parece um vazamento de segurança maior.
Mawg diz para restabelecer Monica

5
--watchnão deve ser necessário, pois é um padrão, consulte angular.io/cli/serve . Então, @T. A resposta de van den Berg foi realmente mais precisa!
Zaphoid de

126
ng serve --poll=2000

Funcionando bem em Linux e Windows


19
o que significa (--poll)
HD ..

1
Pode confirmar que isso funciona. Executando o subsistema Linux em WIndows 10 (Ubuntu) com VS Code em execução no Windows
Ales Potocnik Hahonina

Funciona no ubuntu 18.0.4
Nishān Wickramarathna

2
Isso funcionou no Ubuntu 18.04. você pode descrever o motivo?
Vijender Kumar

1
Para mim funciona bem! Mas, eu não entendo a causa "ng serve" não recarregar o projeto.
José Luiz Gonzaga Neto

81

Considere que, ao ter um grande número de arquivos, existe um Limite no INotify Watches no Linux. Portanto, aumentar o limite de relógios para 512K, por exemplo, pode resolver isso.

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

Observe que o anterior causa uma alteração na memória que você perderá após a reinicialização.

No entanto, você pode torná-lo persistente , executando:

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

Como referência, você pode verificar: https://github.com/angular/angular-cli/issues/8313#issuecomment-362728855 e https://github.com/guard/listen/wiki/Increasing-the-amount- de-inotify-watchers


5
Isso funcionou para mim no 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
você pode usar este comando para verificar / testar o limite de observação atual A cat /proc/sys/fs/inotify/max_user_watches resposta acima é uma resposta totalmente completa, mas aqui está um link com um pouco mais de descrição confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
Junaid

funcionou bem. é importante notar que alguns IDEs (como o JetBrains Webstorm) também usam o inotify para rastrear alterações em arquivos. portanto, lembre-se se você abrir 5 projetos e depois executar o serviço.
Multis

25

Por causa disso, o sistema que detecta mudanças não pode lidar com tantos relógios por padrão.

E a solução é para change the amount of watchesele aguentar (a quantidade máxima de arquivos que estarão no projeto) você deve run this command:

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

O problema com o inotify é zerar este contador toda vez que você reiniciar o computador.


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

18

No seu projeto, a pasta dist é propriedade do root

Tente usar em sudo ng servevez de ng serve.

Outra solução

Quando há um grande número de arquivos, o relógio não funciona no linux. Há um limite no INotify Watches no Linux. Aumentando o limite de relógios

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

Só precisa executar sudo ng serve para resolver o problema.


5
Boa solução, mas por que ter que fazer isso é a verdadeira questão ... executar como root não é a melhor prática ...
Pipo

5

Isso pode ajudar se for o mesmo problema que eu tive. Tentando usar ng servee ng build --watchàs vezes funcionava, mas principalmente eles não estavam prestando atenção nas mudanças de código e eu pensei que tinha algo a ver com isso ng.

Então me lembrei de um problema que tive um tempo atrás com os relógios inotify

Eu executei isso na minha máquina Ubuntu e parece que começou e está observando as mudanças no código:

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

o crédito vai para Scott Smith


3

tente isso. Se você fizer assim você não precisa disparar sempre nenhum comando Você precisa disparar apenas uma vez

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

Não funcionou para mim:

ng serve --watch

Experimentar :

sudo ng serve

isso funcionou para mim!


2

Se tudo mais falhar, verifique se há erros de sintaxe no código - principalmente no index.htmlou partes do código que você editou recentemente, pouco antes da falha da atualização automática. Erros de sintaxe interromperão essa funcionalidade de atualização automática no Angular.

No meu caso, eu tinha vários projetos abertos em janelas separadas do VS Code. Em todos os meus outros projetos, ng servefuncionou como esperado: ele foi atualizado automaticamente ao salvar. Mas em um projeto, seria necessária uma atualização manual para atualizar. Acabou sendo porque eu tinha comentários html fora da área HTML definida do modelo (então, os comentários HTML vieram antes <!doctype html>. Portanto, era inválido bc sua sintaxe HTML fora de uma área HTML.

Eu apaguei os comentários e bam, a atualização automática começou a funcionar novamente (depois de mais uma atualização manual).

Então, analise index.htmlou outras partes do seu código que você editou recentemente antes de quebrar e uma a uma, corte as partes incompletas, atualize o navegador, volte ao VS Code e faça uma alteração, salve e veja se ele é atualizado automaticamente .


1
Outros erros com o modelo também podem impedi-lo de funcionar corretamente. No meu caso, eu tinha costume componente esperando uma @Input(), mas o atributo estava em branco, como este: [myInput]="". Preenchendo-o com um valor restaurado ng serve, nenhuma atualização manual necessária.
Zarepheth

2

Descobri que a pasta dist / no projeto pertencia ao root. É por isso sudo ng serveque vê as mudanças quando ng servenão.

Eu removi a pasta dist / sudo rm -R dist/e reconstruí-a como usuário atual iniciando o servidor dev ng servee tudo funcionou novamente.


2

Eu estava tendo esse problema em uma nova instalação do Linux Ubuntu e percebi que estava recebendo um erro sobre 'muitos observadores para o limite' no VSCode ao mesmo tempo. Segui as instruções para consertá-lo no VSCode e também consertou o problema com o ng watch. Mais informações aqui https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

Eu notei pessoas sugerindo sudopara vigiar. Este é um jogo perigoso, você está dando aos pacotes npm acesso root ao seu sistema. Se suas permissões estiverem corretas, meu problema pode ser a sua correção, já que o limite é por usuário e, executando como sudo, você está executando como root em vez de seu usuário atual que está além do limite (executando um IDE pesado de relógio como vscode ou atom em ). Se por algum motivo você tiver as permissões erradas, defina-as adequadamente para o seu usuário / grupo com chown.


+1 para sugerir para usar chownem vez de correr ng servecom sudo, o que deve ser evitado por todos os meios!
Tobi

1

Eu tive o mesmo problema, usando sudo ng serveparecia "resolver" o problema de forma insatisfatória. O uso de sudoIMO não é satisfatório.

Eu verifiquei minha contagem de INotify em relação ao meu limite padrão (8192) usando: lsof | grep inotify | wc -l O valor retornado pelo comando acima era bem menor que o limite. Portanto, a solução INotify não parecia se aplicar ao meu problema.

Eu também verifiquei as permissões e propriedade, ambas pareciam ok, comparáveis ​​a outro projeto que funcionou.

Frustrado, reiniciei o VS Code. Basicamente fechei todas as instâncias, tinha duas rodando e reabri ambas, após o que o problema foi embora.

Estou inclinado para um possível bug em algum lugar. Isso é algo a se considerar antes de virar o sistema do avesso. Felizmente / infelizmente, esse problema não ocorreu novamente, vou cavar mais fundo se isso acontecer.



1

Não recomendo alterar os parâmetros do SO. Tive alguns problemas (lag) após alterar o parâmetro fs.inotify.max_user_watches, pois você terá outros serviços em execução ...

O "ng serve --poll = 2000" é uma boa solução, mas você provavelmente vai esquecer este parâmetro ...

Investigando: https://github.com/angular/angular-cli/wiki/angular-cli Eu fiz a seguinte solução.

Alterado de angular.json com parâmetro de votação

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

Funciona na minha máquina: D


Obrigado! Esta é a maneira ad hoc para executá-lo sem modificar arquivos de configuração: npm run ng serve -- --poll=2000. Isso não é tão bom quanto a detecção de alteração de arquivo, mas apenas funciona na minha máquina (versão corporativa do Ubuntu 18.04). Eu tenho max_user_watches definido como 524288, mas ng serveainda falha ao detectar alterações depois de algum tempo. Tenho coisas melhores a fazer do que investigar isso, então essa solução é exatamente o que eu preciso.
Andrei Sinitson

1

Fazer o sudo ng servecomando é uma prática ruim. Você tem que alterar a npmpermissão de modo que toda vez que precisar instalar alguma, npm packagesvocê não precise usar sudo.

Este link pode resolver como alterar a permissão npm para o usuário atual e, após seguir estas etapas, após definir a permissão npm, você pode remover a node_modulespasta do diretório do projeto e usar npm install. Após a conclusão da instalação dos pacotes, você pode executar ng servee não precisa fazer sudo ng servesempre que quiser executar seu projeto angular.



0

Minha resposta pode não ser útil. mas procuro essa questão por causa disso.

Depois que comprei um novo computador, esqueci de definir o salvamento automático no editor. Portanto, o código permanece inalterado.


0

Gostaria de deixar meu caso aqui, apenas para referência. No meu caso, o problema estava nas permissões do sistema. Usei uma pasta compartilhada dentro de uma VM como um repo. Eu não tive nenhuma outra mensagem como permissão negada ou algo assim. Tentei de tudo e então percebi que estava usando uma unidade de rede.




0

No meu caso no Mac, foi corrigido concedendo permissão de Leitura / Gravação ao usuário conectado em / usr / local / lib

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.