Cet article est écrit par la colonne tutoriel go language pour vous présenter comment résoudre le problème d'échec du package go get golang.org/x en un seul clic. J'espère qu'il sera utile aux amis dans le besoin !
Solution en un clic pour récupérer l'échec du package golang.org/x
Description du problème
Lorsque nous utilisons go get
, go install
, go mod et d'autres commandes, le package correspondant ou le package dépendant sera automatiquement téléchargé. Cependant, pour des raisons bien connues, les packages similaires à <code>golang.org/x/...
ne pourront pas être téléchargés. Comme indiqué ci-dessous : 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)
Copier après la connexion
解决方式
那我们该如何解决问题呢?毕竟还要制造 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
Copier après la connexion
当如果需要指定版本的时候,该方法就无解了,因为 GitHub 上的镜像仓库多数都没有 tag。并且,手动嘛,程序员怎么能干呢,尤其是依赖的依赖,太多了。
设置代理
如果你有代理,那么可以设置对应的环境变量:
export http_proxy=http://proxyAddress:port
export https_proxy=http://proxyAddress:port
Copier après la connexion
或者,直接用 all_proxy
:
export all_proxy=http://proxyAddress:port
Copier après la connexion
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
)
Copier après la connexion
类似的还有 glide、gopm 等这类第三方包管理工具,都不同方式的解决方案提供给我们。
GOPROXY 环境变量
终于到了本文的终极大杀器 —— GOPROXY。
我们知道从 Go 1.11
版本开始,官方支持了 go module
包依赖管理工具。
其实还新增了 GOPROXY
环境变量。如果设置了该变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。这无疑对我等无法科学上网的开发良民来说是最大的福音。
更可喜的是,goproxy.io 这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY
代理服务。同时,也提供了公用的代理服务 https://goproxy.io
,我们只需设置该环境变量即可正常下载被墙的源码包了:
export GOPROXY=https://goproxy.io
Copier après la connexion
不过,需要依赖于 go module
功能。可通过 export GO111MODULE=on
开启 MODULE。
如果项目不在 GOPATH
中,则无法使用 go get ...
,但可以使用 go mod ...
相关命令。
也可以通过置空这个环境变量来关闭,export GOPROXY=
。
对于 Windows 用户,可以在 PowerShell
中设置:
$env:GOPROXY = "https://goproxy.io"
Copier après la connexion
最后,我们当然推荐使用 GOPROXY
rrreeeSolution
Alors, comment pouvons-nous résoudre le problème ? Après tout, il y a encore des bugs ~
Téléchargement manuel
Nos packages golang.org/x/...
courants ont généralement des référentiels miroir officiels sur GitHub. Par exemple, golang.org/x/text
correspond à github.com/golang/text
. Par conséquent, nous pouvons télécharger ou cloner manuellement le référentiel GitHub correspondant dans le répertoire spécifié. rrreee🎜Lorsque vous devez spécifier la version, cette méthode n'a pas de solution, car la plupart des entrepôts miroirs sur GitHub n'ont pas de balises. De plus, comment les programmeurs peuvent-ils le faire manuellement, notamment parce qu'il y a trop de dépendances. 🎜
Définir le proxy
🎜Si vous 🎜avez un proxy🎜, vous pouvez définir la variable d'environnement correspondante : 🎜rrreee🎜 Ou, utilisez directement
all_proxy
: 🎜rrreee
go mod replace
🎜À partir de la version 1.11 de Go, les
go modules
sont nouvellement pris en charge pour résoudre les problèmes de gestion des dépendances des packages. Cet outil fournit
replace
pour résoudre le problème des alias de package. Il peut également résoudre le problème de l'impossibilité de télécharger
golang.org/x
. 🎜🎜
go module
est intégré à la commande native
go mod
, mais si votre base de code est en
$GOPATH
,
module code> La fonction n'est pas activée par défaut. Il est très simple de l'activer. Vous pouvez l'activer via une variable d'environnement <code>export GO111MODULE=on
. 🎜🎜Ce qui suit est un exemple de référence : 🎜rrreee🎜De même, il existe des outils de gestion de packages tiers tels que glide et gopm, qui nous offrent différentes solutions. 🎜
Variable d'environnement GOPROXY
🎜Enfin, nous avons atteint le tueur ultime de cet article - 🎜GOPROXY🎜. 🎜🎜Nous savons qu'à partir de la version
Go 1.11
, l'outil de gestion des dépendances des packages
go module
est officiellement pris en charge. 🎜🎜En fait, la variable d'environnement
GOPROXY
a également été ajoutée. Si cette variable est définie, le code source sera téléchargé via l'adresse proxy définie par cette variable d'environnement, au lieu d'être téléchargé directement depuis la bibliothèque de codes comme auparavant. C’est sans aucun doute la plus grande bonne nouvelle pour les développeurs comme nous qui ne peuvent pas accéder scientifiquement à Internet. 🎜🎜Ce qui est encore plus gratifiant, c'est que le projet open source goproxy.io nous aide à réaliser ce que nous voulons. Ce projet permet aux développeurs de créer leur propre service proxy
GOPROXY
en un seul clic. Dans le même temps, un service proxy public
https://goproxy.io
est également fourni. Il suffit de définir cette variable d'environnement pour télécharger normalement le package de code source bloqué : 🎜rrreee🎜Cependant, 🎜 nécessite des dépendances Dans la fonction
go module
🎜. MODULE peut être activé via
export GO111MODULE=on
. 🎜🎜Si le projet n'est pas dans
GOPATH
, vous ne pouvez pas utiliser
go get...
, mais vous pouvez utiliser
go mod...
associé commandes. 🎜🎜Il peut également être désactivé en définissant cette variable d'environnement vide,
export GOPROXY=
. 🎜🎜Pour les utilisateurs Windows, vous pouvez le configurer dans
PowerShell
: 🎜rrreee🎜Enfin, nous recommandons certainement d'utiliser la solution de variable d'environnement
GOPROXY
, à condition que 🎜Go version > 1.11🎜. 🎜🎜Enfin, Qiniu a également lancé un proxy national goproxy.cn pour permettre aux utilisateurs nationaux d'accéder plus rapidement aux packages inaccessibles, ce qui est vraiment une conscience. 🎜🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!