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 get
、go install
、go 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)
Nach dem Login kopieren
解决方式
那我们该如何解决问题呢?毕竟还要制造 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
Nach dem Login kopieren
当如果需要指定版本的时候,该方法就无解了,因为 GitHub 上的镜像仓库多数都没有 tag。并且,手动嘛,程序员怎么能干呢,尤其是依赖的依赖,太多了。
设置代理
如果你有代理,那么可以设置对应的环境变量:
export http_proxy=http://proxyAddress:port
export https_proxy=http://proxyAddress:port
Nach dem Login kopieren
或者,直接用 all_proxy
:
export all_proxy=http://proxyAddress:port
Nach dem Login kopieren
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
)
Nach dem Login kopieren
类似的还有 glide、gopm 等这类第三方包管理工具,都不同方式的解决方案提供给我们。
GOPROXY 环境变量
终于到了本文的终极大杀器 —— GOPROXY。
我们知道从 Go 1.11
版本开始,官方支持了 go module
包依赖管理工具。
其实还新增了 GOPROXY
环境变量。如果设置了该变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。这无疑对我等无法科学上网的开发良民来说是最大的福音。
更可喜的是,goproxy.io 这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY
代理服务。同时,也提供了公用的代理服务 https://goproxy.io
,我们只需设置该环境变量即可正常下载被墙的源码包了:
export GOPROXY=https://goproxy.io
Nach dem Login kopieren
不过,需要依赖于 go module
功能。可通过 export GO111MODULE=on
开启 MODULE。
如果项目不在 GOPATH
中,则无法使用 go get ...
,但可以使用 go mod ...
相关命令。
也可以通过置空这个环境变量来关闭,export GOPROXY=
。
对于 Windows 用户,可以在 PowerShell
中设置:
$env:GOPROXY = "https://goproxy.io"
Nach dem Login kopieren
最后,我们当然推荐使用 GOPROXY
rrreeeLö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!