Heim  >  Artikel  >  Web-Frontend  >  Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

青灯夜游
青灯夜游nach vorne
2022-11-04 19:29:421525Durchsuche

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

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

1. Problembeschreibung

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... . Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren bestehtyarn@v1.22.19,在安装依赖后无论是否成功,总是出现网络连接问题而且会卡很长时间,然后会出现几行这样的异常日志:info There appears to be trouble with your network connection. Retrying...Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

有时一些神奇的包(比如 node-sass)出现异常会导致安装失败,结果卡了半天才发现失败,真的让人很崩溃。另外在yarngithub 仓库中有数十条相关的 issue,时间跨度从2016年到2022年足足6年,原因和方案众说纷纭。我很好奇这到底是个什么神奇的问题居然6年都没解决,因此决定一探究竟。【相关教程推荐:nodejs视频教程 、编程视频

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

2、问题排查

2.1、关键词搜索

2.1.1、搜索 github

碰到没啥思路的问题和报错,第一技巧是搜它。在yarngithub 仓库中搜索报错信息 There appears to be trouble with your network connection,可以看到结果中有1个相关代码和91个相关 issue。在 issue 里找了一会没找到合适的方案,接着进入下一步:搜索代码。Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

2.1.2、搜索代码

由于网络原因这里直接转到本地 yarn 的安装目录进行查找。用 vscode 打开 yarn 的安装目录(我的本地目录是~/.volta/tools/image/yarn/1.22.19),全局搜索关键词 There appears to be trouble with your network connection。可以看到结果同样只有1个,整串错误信息赋值给了一个变量offlineRetryingErfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

全局搜索关键词offlineRetrying 共2处结果,除去上一步的结果只有1处引用。这里的代码主要是抛出异常和重试,没有更多关键词可以挖掘。接下来进入调试环节,在 offlineRetrying 这行代码前面打个断点,调试看看具体错误信息和上下文。Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

2.2、程序调试

2.2.1、确定调试命令

安装依赖需要运行命令 yarn, 那要怎么调试它呢?yarn 是一个 npm 包,执行时实际是调用 node xxx.js,而这个 xxx.js 一般配置在 package.jsonbin 字段中。从下图可以看到 yarn 对应的文件是 ./bin/yarn.js,所以可以使用这行调试命令:node --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js。(关于 Node.js 的调试可以参考官方文档Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

2.2.2、开始调试

先在变量 offlineRetrying 所在的代码行cli.js:66099manchmal 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 Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

🎜Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜

🎜2. Fehlerbehebung🎜🎜

🎜2.1. Stichwortsuche🎜

🎜2.1.1. Github durchsuchen🎜

🎜Auf Probleme und Fehler gestoßen, ohne Ideen, Kapitel Eins ist der Trick suche danach. Suchen Sie nach der Fehlermeldung 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. Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜

🎜2.1.2. Suchcode🎜

🎜Gehen Sie aus Netzwerkgründen direkt zum lokalen 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. Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜🎜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. Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜

🎜2.2. Programm-Debugging🎜

🎜2.2.1 Bestimmen Sie den Debugging-Befehl🎜

🎜Für die Installation von Abhängigkeiten ist die Ausführung erforderlich commandyarn, wie kann ich es debuggen? 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 🎜)Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht 🎜

🎜2.2.2. Starten Sie das Debuggen🎜

🎜Gehen Sie zunächst zu der Codezeile, in der sich die Variable 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:  Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren bestehtnode --inspect-brk ~/.volta/tools/image/yarn/1.22.19/bin/yarn.js。此时程序挂起等待调试工具连接,并打印出以下日志:Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

接着打开 chrome 内置的调试页面 chrome://inspect/#devices,找到文件路径相同的 Target,点击 inspect按钮开始调试。

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

接着 chrome 会打开一个独立的 DevTools 窗口,由于使用的是 node --inspect-brk 命令,此时 DevTools 自动断点在被调试文件的起始位置,需要按下 F8 跳过该断点继续执行。Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

等待一小段时间后,DevTools 停在之前添加的断点处,可以看到这是一个超时异常,导致异常的请求是GET: https://yarnpkg.com/latest-version。使用 curl 请求这个链接,结果是 210s 超时。使用代理访问这个链接可以成功,但是请求被重定向到 classic.yarnpkg.com/latest-vers…,其返回结果是 1.22.19Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

至此问题基本清楚了,主要是请求超时并且多次重试导致了文章开头的问题,可以使用代理规避这个问题。如果排查到此结束就没意思了。

2.2.3、深入排查

为了进一步了解 yarn 为什么要请求 yarnpkg.com/latest-vers…,以该链接为关键词在代码中搜索,找到了这个关键词链条:https://yarnpkg.com/latest-version -> SELF_UPDATE_VERSION_URL ->  _checkUpdate -> checkUpdate,实际调用关系则正好相反,具体如下图:

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht

3、确定原因

前面已经推断出超时链接的调用关系是: checkUpdate ->  _checkUpdate  ->  SELF_UPDATE_VERSION_URL -> https://yarnpkg.com/latest-version,再结合 checkUpdate函数的注释和代码来看,每次执行 yarn 安装命令的时候都会请求 yarnpkg.com/latest-vers…,从而检查是否有新版本需要更新。但是这个链接访问超时而且失败后会重试,默认的超时时间为 30s 重试次数为 4 次,所以安装完成后还会卡 120s 程序才会真正结束。

4、解决方案

引发问题的关键因素有3个:检查更新、超时、重试,因此可以从优化网络、调整超时时间、跳过检查更新3个方向去解决问题,以下有6个解决方案可以参考。

4.1、优化网络

这个思路很容易想到,既然访问超时,那就提升请求速度。

  • 【方案1】使用代理优化网络(推荐)
$ 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"

4.2、调整超时时间

这个思路比较直接,适用场景更多些,如果其他方法不奏效可以试试。

  • 【方案2】修改 network-timeout(看情况)

默认超时时间为 30s 可以改小为 2s,修改后异常依然存在,但是可以让检查更新快速失败不用等几分钟。

yarn install --network-timeout 2000

有一部分开发者表示出现异常是因为某些大型 npm 包安装太久超过了默认超时时间 30s,因此也可以把network-timeout 改得更大避免异常。

4.3、跳过检查更新

这个思路的解决方案主要来自 checkUpdate

Öffnen Sie dann die in 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. 🎜🎜Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜🎜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. Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜🎜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…, das Rückgabeergebnis ist 1.22.19. Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜🎜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. 🎜

2.2.3, eingehende Untersuchung

🎜Um besser zu verstehen, warum garn 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: 🎜🎜Erfassen und analysieren Sie einen Garnfehler, der seit 6 Jahren besteht🎜🎜„Erfassen🎜🎜image. png🎜

3. Bestimmen Sie den Grund

🎜Es wurde früher gefolgert, dass die aufrufende Beziehung des Der Timeout-Link lautet: 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. 🎜

4. Lösung

🎜Es gibt drei Schlüsselfaktoren, die Probleme verursachen: Überprüfung auf Aktualisierungen, Zeitüberschreitung und erneute Versuche, damit Sie optimieren können Es gibt drei Möglichkeiten, das Problem zu lösen: Netzwerk, Anpassen des Timeouts und Überspringen der Suche nach Updates. Hier sind 6 Lösungen als Referenz. 🎜

4.1. Optimieren Sie das Netzwerk

🎜Da der Zugriff abläuft, ist es einfach, die Anforderungsgeschwindigkeit zu erhöhen. 🎜
  • [Option 1] Verwenden Sie einen Proxy, um das Netzwerk zu optimieren (empfohlen)
$ yarn config set disable-self-update-check true$ yarn install
🎜 Am Beispiel meiner Entwicklungsumgebung sieht der Befehl so aus: 🎜
$ yarn config set lastUpdateCheck 1e13
$ yarn install

4.2. Passen Sie das Zeitlimit an

🎜Diese Idee ist einfacher und auf mehr Szenarien anwendbar. Wenn andere Methoden nicht funktionieren, können Sie es versuchen. 🎜
  • [Option 2] Netzwerk-Timeout ändern (je nach Situation)
🎜Der Standard-Timeout beträgt 30 Sekunden und kann auf 2 Sekunden geändert werden. Nach der Änderung besteht die Ausnahme weiterhin. Aber Updates können schnell überprüft werden, ohne ein paar Minuten warten zu müssen. 🎜
$ 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. 🎜

4.3 Überprüfung auf Updates überspringen

🎜Die Lösung für diese Idee kommt hauptsächlich von checkUpdate Mehrere Beendigungsbedingungen in Funktionen. 🎜
  • 【方案3】修改配置禁止检查更新(推荐)
$ yarn config set disable-self-update-check true$ yarn install
  • 【方案4】修改配置把上次更新时间调到百年后(推荐)
$ yarn config set lastUpdateCheck 1e13
$ yarn install
  • 【方案5】执行命令时禁用交互式提示(推荐)
$ yarn install --non-interactive
  • 【方案6】修改代码跳过检查更新(不推荐)
    • 找到 yarn 的安装目录注释 checkUpdate 的调用,具体代码行为 cli.js:7261,修改后长这样:// this.checkUpdate();
    • 也可以修改其他可以阻断 checkUpdate 函数的代码...

5、最后

以上主要是分享一些问题分析排查的经验,另外也提供了一些 yarn install 超时异常的解决方案,希望能对前端同学们有所帮助。

在快写完这篇文章的时候,yarnpkg.com/latest-vers… 已经可以正常访问,不知道还会不会有人再遇到这个问题。

另外我在 yarngithub 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen