Maison  >  Article  >  développement back-end  >  Résolvez rapidement le problème de l'échec du package Go Lang.org/x.

Résolvez rapidement le problème de l'échec du package Go Lang.org/x.

藏色散人
藏色散人avant
2021-12-02 14:42:453012parcourir

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

最后,我们当然推荐使用 GOPROXYrrreeeSolution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer