Ich bin kürzlich auf einen Garnkäfer gestoßen. Nach einer Suche habe ich herausgefunden, dass er schon seit 6 Jahren existiert. Nach einiger Analyse und Untersuchung habe ich 6 Lösungen angegeben. . .
Der Paketmanager mehrerer Projekte, die ich kürzlich übernommen habe, ist yarn@v1.22.19
. Nach der Installation von Abhängigkeiten ist es egal, ob die Netzwerkverbindung erfolgreich ist Probleme treten immer auf und werden auch weiterhin auftreten. Dann werden mehrere Zeilen mit Ausnahmeprotokollen wie diese angezeigt: info Es scheint ein Problem mit Ihrer Netzwerkverbindung zu geben...
. yarn@v1.22.19
,在安装依赖后无论是否成功,总是出现网络连接问题而且会卡很长时间,然后会出现几行这样的异常日志:info There appears to be trouble with your network connection. Retrying...
。
有时一些神奇的包(比如 node-sass
)出现异常会导致安装失败,结果卡了半天才发现失败,真的让人很崩溃。另外在yarn
的 github
仓库中有数十条相关的 issue
,时间跨度从2016年到2022年足足6年,原因和方案众说纷纭。我很好奇这到底是个什么神奇的问题居然6年都没解决,因此决定一探究竟。【相关教程推荐:nodejs视频教程 、编程视频】
碰到没啥思路的问题和报错,第一技巧是搜它。在yarn
的 github
仓库中搜索报错信息 There appears to be trouble with your network connection
,可以看到结果中有1个相关代码和91个相关 issue
。在 issue
里找了一会没找到合适的方案,接着进入下一步:搜索代码。
由于网络原因这里直接转到本地 yarn
的安装目录进行查找。用 vscode
打开 yarn
的安装目录(我的本地目录是~/.volta/tools/image/yarn/1.22.19
),全局搜索关键词 There appears to be trouble with your network connection
。可以看到结果同样只有1个,整串错误信息赋值给了一个变量offlineRetrying
。
全局搜索关键词offlineRetrying
共2处结果,除去上一步的结果只有1处引用。这里的代码主要是抛出异常和重试,没有更多关键词可以挖掘。接下来进入调试环节,在 offlineRetrying
这行代码前面打个断点,调试看看具体错误信息和上下文。
安装依赖需要运行命令 yarn
, 那要怎么调试它呢?yarn
是一个 npm
包,执行时实际是调用 node xxx.js
,而这个 xxx.js
一般配置在 package.json
的 bin 字段中。从下图可以看到 yarn
对应的文件是 ./bin/yarn.js
,所以可以使用这行调试命令:node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
。(关于 Node.js
的调试可以参考官方文档)
先在变量 offlineRetrying
所在的代码行cli.js:66099
manchmal magisch An Eine Anomalie im Paket (z. B. node-sass
) führt dazu, dass die Installation fehlschlägt. Infolgedessen bleibt die Installation lange hängen, bevor der Fehler entdeckt wird, was wirklich frustrierend ist. Darüber hinaus gibt es Dutzende verwandter Probleme
im github
-Lager von yarn
, die sich über volle 6 Jahre von 2016 bis 2022 erstrecken, mit Gründen und Lösungen: Die Meinungen gehen auseinander. Ich war sehr neugierig, was für ein magisches Problem das war, das sechs Jahre lang nicht gelöst worden war, also beschloss ich, es herauszufinden. [Empfohlene verwandte Tutorials: nodejs-Video-Tutorial, Programmiervideo 】
Es scheint ein Problem mit Ihrer Netzwerkverbindung zu geben
im github
-Repository von yarn
. Sie können sehen, dass 1 relevant ist Code in den Ergebnissen und 91 verwandtes Problem
. Ich habe eine Weile in issue
gesucht, konnte aber keine passende Lösung finden, also bin ich zum nächsten Schritt übergegangen: Durchsuchen des Codes. 🎜yarn
-Installationsverzeichnis, um zu suchen. Verwenden Sie vscode
, um das Installationsverzeichnis von yarn
zu öffnen (mein lokales Verzeichnis ist ~/.volta/tools/image/yarn/1.22.19
) , Globale Suchbegriffe Es scheint ein Problem mit Ihrer Netzwerkverbindung zu geben
. Sie können sehen, dass es auch nur ein Ergebnis gibt und die gesamte Fehlermeldung einer Variablen offlineRetrying
zugewiesen ist. 🎜🎜Globaler Suchschlüssel Es gibt 2 Ergebnisse für das Wort offlineRetrying
. Ohne die Ergebnisse aus dem vorherigen Schritt gibt es nur 1 Referenz. Der Code hier löst hauptsächlich Ausnahmen und Wiederholungsversuche aus, und es müssen keine weiteren Schlüsselwörter herausgesucht werden. Starten Sie als Nächstes den Debugging-Prozess, setzen Sie einen Haltepunkt vor die Codezeile offlineRetrying
und führen Sie das Debugging durch, um die spezifische Fehlermeldung und den Kontext anzuzeigen. 🎜yarn
ist ein npm
-Paket. Wenn es ausgeführt wird, ruft es tatsächlich node xxx.js
und dieses xxx.js
auf wird im Allgemeinen in bin🎜 in package.json konfiguriert. Code> in das Feld ein. Wie Sie im Bild unten sehen können, lautet die entsprechende Datei von <code>yarn
./bin/yarn.js
, sodass Sie diese Zeile des Debugging-Befehls verwenden können: Knoten --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
. (Informationen zum Debuggen von Node.js
finden Sie im offizielles Dokument 🎜) 🎜offlineRetrying
cli befindet .js:66099
Fügen Sie vorher die 🎜debugger🎜-Anweisung hinzu. 🎜🎜Gehen Sie dann zurück zum Stammverzeichnis des Geschäftsprojekts und führen Sie den Debugging-Befehl node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
aus . Zu diesem Zeitpunkt bleibt das Programm hängen und wartet darauf, dass das Debugging-Tool eine Verbindung herstellt, und gibt das folgende Protokoll aus: node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js
。此时程序挂起等待调试工具连接,并打印出以下日志:
接着打开 chrome
内置的调试页面 chrome://inspect/#devices
,找到文件路径相同的 Target
,点击 inspect
按钮开始调试。
接着 chrome
会打开一个独立的 DevTools
窗口,由于使用的是 node --inspect-brk
命令,此时 DevTools
自动断点在被调试文件的起始位置,需要按下 F8
跳过该断点继续执行。
等待一小段时间后,DevTools
停在之前添加的断点处,可以看到这是一个超时异常,导致异常的请求是GET: https://yarnpkg.com/latest-version
。使用 curl
请求这个链接,结果是 210s 超时。使用代理访问这个链接可以成功,但是请求被重定向到 classic.yarnpkg.com/latest-vers…,其返回结果是 1.22.19
。
至此问题基本清楚了,主要是请求超时并且多次重试导致了文章开头的问题,可以使用代理规避这个问题。如果排查到此结束就没意思了。
为了进一步了解 yarn
为什么要请求 yarnpkg.com/latest-vers…,以该链接为关键词在代码中搜索,找到了这个关键词链条:https://yarnpkg.com/latest-version
-> SELF_UPDATE_VERSION_URL
-> _checkUpdate
-> checkUpdate
,实际调用关系则正好相反,具体如下图:
前面已经推断出超时链接的调用关系是: checkUpdate
-> _checkUpdate
-> SELF_UPDATE_VERSION_URL
-> https://yarnpkg.com/latest-version
,再结合 checkUpdate
函数的注释和代码来看,每次执行 yarn
安装命令的时候都会请求 yarnpkg.com/latest-vers…,从而检查是否有新版本需要更新。但是这个链接访问超时而且失败后会重试,默认的超时时间为 30s 重试次数为 4 次,所以安装完成后还会卡 120s 程序才会真正结束。
引发问题的关键因素有3个:检查更新、超时、重试,因此可以从优化网络、调整超时时间、跳过检查更新3个方向去解决问题,以下有6个解决方案可以参考。
这个思路很容易想到,既然访问超时,那就提升请求速度。
$ yarn install --proxy "http://{domain}:{port}" --https-proxy "http://{domain}:{port}"
以我的开发环境举例,命令长这样:
yarn install --proxy "http://10.180.55.191:7890" --https-proxy "http://10.180.55.191:7890"
这个思路比较直接,适用场景更多些,如果其他方法不奏效可以试试。
默认超时时间为 30s 可以改小为 2s,修改后异常依然存在,但是可以让检查更新快速失败不用等几分钟。
yarn install --network-timeout 2000
有一部分开发者表示出现异常是因为某些大型
npm
包安装太久超过了默认超时时间 30s,因此也可以把network-timeout 改得更大避免异常。
这个思路的解决方案主要来自 checkUpdate
Chrome
integrierte Debugging-Seite chrome://inspect/#devices
Suchen Sie den Ziel
und klicken Sie auf die Schaltfläche Inspizieren
, um mit dem Debuggen zu beginnen. 🎜🎜🎜🎜Weiter chrome
öffnet ein unabhängiges DevTools
-Fenster. Da der Befehl node --inspect-brk
verwendet wird, wird DevTools
verwendet code> Der automatische Haltepunkt befindet sich am Anfang der zu debuggenden Datei. Sie müssen F8
drücken, um den Haltepunkt zu überspringen und mit der Ausführung fortzufahren. 🎜🎜Warten Sie auf eine while Nach einer Weile stoppt DevTools
am zuvor hinzugefügten Haltepunkt. Sie können sehen, dass dies eine Timeout-Ausnahme ist. Die Anforderung, die die Ausnahme verursacht hat, ist GET: https://yarnpkg.com/. neueste Version
. Die Verwendung von curl
zum Anfordern dieses Links führt zu einer Zeitüberschreitung von 210 Sekunden. Der Zugriff auf diesen Link über einen Proxy ist erfolgreich, aber die Anfrage wird an classic.yarnpkg.com/latest-vers…< umgeleitet /a>, das Rückgabeergebnis ist 1.22.19
. 🎜🎜Bisher die Das Problem ist im Wesentlichen: Es ist klar, dass das Problem am Anfang des Artikels hauptsächlich durch eine Zeitüberschreitung der Anforderung und mehrere Wiederholungsversuche verursacht wird. Sie können einen Proxy verwenden, um dieses Problem zu vermeiden. Es wäre langweilig, wenn die Ermittlungen hier enden würden. 🎜garn
< anfordern sollte a href=" https://yarnpkg.com/latest-version" target="_blank">yarnpkg.com/latest-vers…, verwenden Sie diesen Link als Schlüsselwort, um im Code zu suchen und dies zu finden Schlüsselwortkette: https://yarnpkg.com/latest-version
-> SELF_UPDATE_VERSION_URL
-> , die eigentliche Aufrufbeziehung ist genau das Gegenteil, wie unten gezeigt: 🎜🎜🎜🎜🎜🎜🎜checkUpdate
-> SELF_UPDATE_VERSION_URL
-> version, dann kombiniert mit Den Kommentaren und dem Code der checkUpdate
-Funktion nach zu urteilen, wird yarnpkg.com/latest-vers…, um zu überprüfen, ob eine neue Version vorhanden ist, die aktualisiert werden muss. Bei diesem Link-Zugriff tritt jedoch eine Zeitüberschreitung auf, und nach einem Fehler wird ein erneuter Versuch unternommen. Das Standard-Zeitlimit beträgt 30 Sekunden und die Anzahl der Wiederholungsversuche beträgt 4. Nach Abschluss der Installation bleibt das Programm also noch 120 Sekunden lang hängen. 🎜$ yarn config set disable-self-update-check true$ yarn install
$ yarn config set lastUpdateCheck 1e13 $ yarn install
$ yarn install --non-interactive
🎜Einige Entwickler gaben an, dass die Ausnahme aufgetreten ist, weil einige große npm
-Pakete zu lange installiert wurden und das Standard-Timeout von 30 Sekunden überschritten haben. Daher kann das Netzwerk-Timeout auch in a geändert werden größerer Wert, um Ausnahmen zu vermeiden. 🎜
checkUpdate</code > Mehrere Beendigungsbedingungen in Funktionen. 🎜<ul><li>【方案3】修改配置禁止检查更新(推荐)</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">$ yarn config set disable-self-update-check true$ yarn install</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><ul><li>【方案4】修改配置把上次更新时间调到百年后(推荐)</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">$ yarn config set lastUpdateCheck 1e13
$ yarn install</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><ul><li>【方案5】执行命令时禁用交互式提示(推荐)</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">$ yarn install --non-interactive</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><ul><li>【方案6】修改代码跳过检查更新(不推荐)<ul>
<li>找到 <code>yarn
的安装目录注释 checkUpdate
的调用,具体代码行为 cli.js:7261
,修改后长这样:// this.checkUpdate();
checkUpdate
函数的代码...以上主要是分享一些问题分析排查的经验,另外也提供了一些 yarn install
超时异常的解决方案,希望能对前端同学们有所帮助。
在快写完这篇文章的时候,yarnpkg.com/latest-vers… 已经可以正常访问,不知道还会不会有人再遇到这个问题。
另外我在
yarn
的github issue
中回复了以上的解决方案,希望前端同学们少受点折磨,也希望官方早点修复这个6年陈的老Bug。?
更多编程相关知识,请访问:编程教学!!
Das obige ist der detaillierte Inhalt vonErfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!