ng服务不会自动检测文件更改


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
您是否尝试过服务-观看?
planet_hunter

2
是。但它并没有解决我的问题
Bhaskararao Gummidi

请检查我更新后的答案,让我知道它是否可以解决问题。
planet_hunter

Answers:


151

大部分的时间在Linux中,ng serve或者ng build --watch如果该目录没有足够的权限不起作用。

解决方案是提供必要的权限或使用 sudo

更新

watch flag in ng serve实际上是多余的,因为它是默认选项。感谢@Zaphoid指出错误。


29
谢谢。我ng servesudo权限运行。好了
Bhaskararao Gummidi

1
然后,请接受此答案,这将对将来阅读此问题的其他人有所帮助
Mawg说,请恢复莫妮卡

3
@Mawg而不是使用sudo。文件应具有哪组权限?
oracleruiz

2
取决于正在运行的用户,可能多达a+x,但我警告不要使用权限,而不是sudosudo是针对单个命令的,而更改权限会永久更改它们,这似乎是一个更大的安全漏洞。
Mawg说要恢复莫妮卡

5
--watch不应是必需的,因为它是默认设置,请参见angular.io/cli/serve。所以@T。范登伯格的答案实际上更准确!
Zaphoid

126
ng serve --poll=2000

在Linux和Windows上正常工作


19
这是什么意思(--poll)
HD ..

1
可以确认这项工作。在Windows 10上运行VS Code的WIndows 10(Ubuntu)上运行linux子系统。
Ales Potocnik Hahonina

在Ubuntu 18.0.4工程
尼山Wickramarathna

2
这适用于Ubuntu 18.04。能请您描述一下原因吗?
Vijender Kumar

2
对我来说很好!但是,我不明白“ ng服务”的原因不会重新加载该项目。
何塞·路易斯·冈萨加内托

81

考虑到当拥有大量文件时,Linux 上的INotify Watches 有一个限制。因此,例如将手表限制增加到512K即可解决此问题。

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-362728855https://github.com/guard/listen/wiki/Increasing-the-amount-守望者


5
这对我在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
您可以使用此命令来检查/测试当前的手表限制cat /proc/sys/fs/inotify/max_user_watches 上面的答案是一个完整的答案,但这是一个链接,这里没有更多描述confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
Junaid

工作正常。值得注意的是,某些IDE(例如JetBrains Webstorm)也使用inotify来跟踪文件更改。因此,如果您打开5个项目并运行ng serve,请记住这一点。
复合音色

25

因此,默认情况下,检测更改的系统无法处理那么多手表。

解决方案是change the amount of watches它必须能够处理(项目中最大的文件数量),您必须run this command

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

每次重启计算机时,inotify的问题都会重置此计数器。


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

18

在您的项目中dist文件夹由root拥有

尝试使用sudo ng serve而不是ng serve

另一种解决方案

当有大量文件时,在Linux上手表无法正常工作.Linux上的INotify手表有一个限制。所以增加手表的极限

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


5

如果这与我遇到的问题相同,则可能会有所帮助。尝试使用ng serveng build --watch有时的工作,但他们大多不看代码的变化,我认为这是事做ng

然后我想起了我以前用inotify手表遇到的一个问题

我在我的Ubuntu计算机上运行了它,它似乎已经启动并正在观察代码更改:

回声fs.inotify.max_user_watches = 524288 | 须藤tee /etc/sysctl.d/40-max-user-watches.conf &&须藤sysctl --system

归功于Scott Smith


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,无需手动刷新。
扎里菲斯19'Jul

2

我发现项目中的dist /文件夹归root用户所有。这就是为什么sudo ng serve没有看到更改的原因ng serve

我删除了dist /文件夹,sudo rm -R dist/并通过启动dev服务器将其重建为当前用户,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身份运行,而不是当前超出限制的当前用户(运行诸如vscode或atom之类的watch ideide上 )。如果由于某种原因您拥有错误的权限,请使用将它们正确地设置给您的用户/组chown


+1建议使用chown,而不是运行ng servesudo,应采取一切手段避免!
托比

1

我遇到了同样的问题,sudo ng serve似乎无法令人满意地“解决”该问题。sudoIMO 使用不令人满意。

我使用以下 lsof | grep inotify | wc -l 命令检查了INotify计数与默认限制(8192): 上面命令返回的值比限制小得多。因此,INotify解决方案似乎不适用于我的问题。

我还检查了权限和所有权,两者似乎都可以,与另一个可行的项目相比。

出于无奈,我重新启动了VS Code。基本上,我关闭了所有实例,运行了两个实例,然后都重新打开了实例,然后问题就消失了。

我倾向于某个地方可能的错误。这是将系统内翻前要考虑的事情。幸运的是,这个问题没有再发生,如果发生的话,我会做更深入的探讨。



1

我不建议更改SO参数。更改fs.inotify.max_user_watches参数后,我遇到了一些(滞后)问题,因为您将要运行其他服务...

“ ng serve --poll = 2000”是一个很好的解决方案,但是您可能会忘记此参数...

调查:https : //github.com/angular/angular-cli/wiki/angular-cli 我已经完成了以下解决方案。

用poll参数更改了de 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在一段时间后仍然无法检测到更改。与调查相比,我有更好的工作要做,所以此解决方案正是我所需要的。
Andrei Sinitson

1

执行sudo ng serve命令是一种不好的做法。您必须更改npm权限,这样每次都必须安装npm packages时不必使用sudo

此链接可以解决如何更改当前用户的npm权限,并且在设置npm权限后按照此步骤操作后,可以node_modules从项目目录中删除该文件夹并使用npm install。软件包安装完成后,您可以运行ng serve,而不必sudo ng serve每次都想运行角度项目。



0

我的回答可能没有用。但因为这个原因,我搜索了这个问题。

购买新计算机后,我忘记在编辑器中设置自动保存。因此,代码实际上保持不变。


0

我想把我的案子留在这里,仅供参考。就我而言,问题出在系统权限上。我将VM内的共享文件夹用作存储库。我没有其他消息,例如权限被拒绝或类似的东西。尝试了所有内容,然后我才意识到自己正在使用网络驱动器。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.