Heim >Backend-Entwicklung >Golang >Lösen Sie schnell das Problem eines erfolglosen Golang.org/x-Pakets

Lösen Sie schnell das Problem eines erfolglosen Golang.org/x-Pakets

藏色散人
藏色散人nach vorne
2021-12-02 14:42:453108Durchsuche

Dieser Artikel wurde von der go-SpracheTutorial-Kolumne geschrieben, um Ihnen vorzustellen, wie Sie das Problem mit dem Paketfehler von go get golang.org/x mit einem Klick lösen können. Ich hoffe, dass er Freunden in Not hilfreich sein wird!

Ein-Klick-Lösung zum Abrufen des golang.org/x-Paketfehlers

Problembeschreibung

Wenn wir go get, go install, go verwenden mod und andere Befehle, das entsprechende Paket oder abhängige Paket wird automatisch heruntergeladen. Aus bekannten Gründen können Pakete, die <code>golang.org/x/... ähneln, jedoch nicht heruntergeladen werden. Wie unten gezeigt: go getgo installgo mod 等命令时,会自动下载相应的包或依赖包。但由于众所周知的原因,类似于 golang.org/x/... 的包会出现下载失败的情况。如下所示:

$ go get -u golang.org/x/sys

go get golang.org/x/sys: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

解决方式

那我们该如何解决问题呢?毕竟还要制造 bug 的嘛~

手动下载

我们常见的 golang.org/x/... 包,一般在 GitHub 上都有官方的镜像仓库对应。比如 golang.org/x/text 对应 github.com/golang/text。所以,我们可以手动下载或 clone 对应的 GitHub 仓库到指定的目录下。

mkdir $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone git@github.com:golang/text.git
rm -rf text/.git

当如果需要指定版本的时候,该方法就无解了,因为 GitHub 上的镜像仓库多数都没有 tag。并且,手动嘛,程序员怎么能干呢,尤其是依赖的依赖,太多了。

设置代理

如果你有代理,那么可以设置对应的环境变量:

export http_proxy=http://proxyAddress:port
export https_proxy=http://proxyAddress:port

或者,直接用 all_proxy

export all_proxy=http://proxyAddress:port

go mod replace

从 Go 1.11 版本开始,新增支持了 go modules 用于解决包依赖管理问题。该工具提供了 replace,就是为了解决包的别名问题,也能替我们解决 golang.org/x 无法下载的的问题。

go module 被集成到原生的 go mod 命令中,但是如果你的代码库在 $GOPATH 中,module 功能是默认不会开启的,想要开启也非常简单,通过一个环境变量即可开启 export GO111MODULE=on

以下为参考示例:

module example.com/hello

require (
    golang.org/x/text v0.3.0
)

replace (
    golang.org/x/text => github.com/golang/text v0.3.0
)

类似的还有 glide、gopm 等这类第三方包管理工具,都不同方式的解决方案提供给我们。

GOPROXY 环境变量

终于到了本文的终极大杀器 —— GOPROXY

我们知道从 Go 1.11 版本开始,官方支持了 go module 包依赖管理工具。

其实还新增了 GOPROXY 环境变量。如果设置了该变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。这无疑对我等无法科学上网的开发良民来说是最大的福音。

更可喜的是,goproxy.io 这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY 代理服务。同时,也提供了公用的代理服务 https://goproxy.io,我们只需设置该环境变量即可正常下载被墙的源码包了:

export GOPROXY=https://goproxy.io

不过,需要依赖于 go module 功能。可通过 export GO111MODULE=on 开启 MODULE。

如果项目不在 GOPATH 中,则无法使用 go get ...,但可以使用 go mod ... 相关命令。

也可以通过置空这个环境变量来关闭,export GOPROXY=

对于 Windows 用户,可以在 PowerShell 中设置:

$env:GOPROXY = "https://goproxy.io"

最后,我们当然推荐使用 GOPROXYrrreeeLösung

Wie lösen wir das Problem? Schließlich gibt es immer noch Fehler ~

Manueller Download

Unsere gängigen golang.org/x/...-Pakete entsprechen im Allgemeinen offiziellen Spiegel-Repositorys auf GitHub. Beispielsweise entspricht golang.org/x/text github.com/golang/text. Daher können wir das entsprechende GitHub-Repository manuell herunterladen oder in das angegebene Verzeichnis klonen.
rrreee🎜Wenn Sie die Version angeben müssen, gibt es für diese Methode keine Lösung, da die meisten Spiegellager auf GitHub keine Tags haben. Darüber hinaus stellt sich die Frage, wie Programmierer dies manuell tun können, insbesondere weil es zu viele Abhängigkeiten gibt. 🎜

Proxy festlegen

🎜Wenn Sie 🎜einen Proxy haben🎜, können Sie die entsprechende Umgebungsvariable festlegen: 🎜rrreee🎜 Oder verwenden Sie direkt all_proxy: 🎜rrreee

go mod ersetzen

🎜Ab Go Version 1.11 werden go-Module neu unterstützt, um Probleme bei der Paketabhängigkeitsverwaltung zu lösen. Dieses Tool bietet replace, um das Problem der Paketaliase zu lösen. Es kann auch das Problem lösen, dass golang.org/x nicht heruntergeladen werden kann. 🎜🎜go module ist in den nativen Befehl go mod integriert, aber wenn Ihre Codebasis in $GOPATH liegt, module code> Die Funktion ist standardmäßig nicht aktiviert. Sie können sie über eine Umgebungsvariable <code>export GO111MODULE=on aktivieren. 🎜🎜Das Folgende ist ein Referenzbeispiel: 🎜rrreee🎜Ebenso gibt es Paketverwaltungstools von Drittanbietern wie Glide und Gopm, die uns unterschiedliche Lösungen bieten. 🎜

GOPROXY-Umgebungsvariable

🎜Endlich sind wir beim ultimativen Killer dieses Artikels angekommen – 🎜GOPROXY🎜. 🎜🎜Wir wissen, dass ab der Version Go 1.11 das Paketabhängigkeitsverwaltungstool go module offiziell unterstützt wird. 🎜🎜Tatsächlich wurde die Umgebungsvariable GOPROXY hinzugefügt. Wenn diese Variable festgelegt ist, wird der Quellcode über die durch diese Umgebungsvariable festgelegte Proxy-Adresse heruntergeladen, anstatt wie zuvor direkt aus der Codebibliothek herunterzuladen. Dies ist zweifellos die größte gute Nachricht für uns Entwicklungsbürger, die keinen wissenschaftlichen Zugang zum Internet haben. 🎜🎜Noch erfreulicher ist, dass uns das Open-Source-Projekt goproxy.io dabei hilft, das zu erreichen, was wir wollen. Dieses Projekt ermöglicht es Entwicklern, mit einem Klick ihren eigenen GOPROXY-Proxy-Dienst zu erstellen. Gleichzeitig wird auch ein öffentlicher Proxy-Dienst https://goproxy.io bereitgestellt. Wir müssen nur diese Umgebungsvariable festlegen, um das blockierte Quellcodepaket normal herunterzuladen: 🎜rrreee🎜Allerdings 🎜 erfordert Abhängigkeiten in der Funktion go module 🎜. MODULE kann über export GO111MODULE=on aktiviert werden. 🎜🎜Wenn sich das Projekt nicht in GOPATH befindet, können Sie go get... nicht verwenden, aber Sie können go mod... entsprechend verwenden Befehle. 🎜🎜Es kann auch deaktiviert werden, indem diese Umgebungsvariable leer gesetzt wird: export GOPROXY=. 🎜🎜Für Windows-Benutzer können Sie es in PowerShell festlegen: 🎜rrreee🎜Abschließend empfehlen wir auf jeden Fall die Verwendung der Umgebungsvariablenlösung GOPROXY, vorausgesetzt, dass 🎜Go-Version > 1.11🎜. 🎜🎜Schließlich hat Qiniu auch einen inländischen Proxy goproxy.cn eingeführt, um inländischen Benutzern den schnelleren Zugriff auf unzugängliche Pakete zu ermöglichen, was wirklich ein Gewissen ist. 🎜🎜

Das obige ist der detaillierte Inhalt vonLösen Sie schnell das Problem eines erfolglosen Golang.org/x-Pakets. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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