Golang中如何设置Goproxy

Golang中如何设置Goproxy 大家好,

最近我一直在为我们团队配置Go开发环境。我身处一个企业IT环境中,访问互联网需要通过代理/防火墙。通常,当开发人员执行 go build 命令时,该操作应该在不访问互联网的情况下完成。因此,我正在考虑设置一个goproxy。

我正从Aofei Sheng的这个项目开始着手:https://github.com/goproxy/goproxy

$ ./goproxy
Listen :8080

然后在另一个会话中进行我的 go get 测试(正确设置了GOPROXY):

$ go clean -modcache # 从干净的 $HOME/go 开始
$ go get gopkg.in/ldap.v2
go: downloading gopkg.in/ldap.v2 v2.5.1
go: downloading gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d

它确实工作了,但请不要被迷惑。在这个例子中,go get 是通过我的 https_proxy 访问了互联网。在运行goproxy的会话中,我看到了以下输出:

2022/08/13 20:05:29 goproxy: failed to list module versions: go: gopkg.in@latest: unrecognized import path “gopkg.in”: parse https://gopkg.in/?go-get=1: no go-import meta tags ()

我的 goproxy.go 源码与示例相比改动很小[1]。我确信下一步是弄清楚如何配置它以找到我已经缓存的 gopkg.in 的本地副本(为此,我相信我只需要以某种特殊的方式进行 git clonego get,从而留下一个代码仓库)。

我会将我的发现回复在这里。同时,如果您恰好设置过goproxy并能给我一些指点,那将非常棒。我最近才开始使用Go,还有很多东西要学。

祝好, -Randy [1] 我的环境需要HTTPS,所以我为此修改了示例。 我也在 diasp.org(一个优秀的Facebook自由软件替代品)上发布了这个内容。


更多关于Golang中如何设置Goproxy的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何设置Goproxy的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据你的描述,你已经在企业代理环境下成功运行了goproxy,但遇到了模块版本列表失败的问题。核心问题在于goproxy无法通过你的企业代理访问外部仓库。以下是解决方案:

1. 配置goproxy使用企业代理

修改你的goproxy配置,使其能够通过企业代理访问外部网络。以下是示例代码:

package main

import (
    "crypto/tls"
    "fmt"
    "net/http"
    "net/url"
    "os"
    
    "github.com/goproxy/goproxy"
)

func main() {
    // 设置企业代理
    proxyURL, err := url.Parse("http://your-corporate-proxy:8080")
    if err != nil {
        panic(err)
    }
    
    // 创建带代理的HTTP客户端
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 如果需要跳过证书验证
    }
    
    httpClient := &http.Client{
        Transport: transport,
        Timeout:   30 * time.Second,
    }
    
    // 创建goproxy实例
    proxy := goproxy.New()
    proxy.GoBinEnv = append(os.Environ(),
        "GOPROXY=direct",
        "GOSUMDB=off",
    )
    
    // 设置HTTP客户端
    proxy.HTTPClient = httpClient
    proxy.Proxy = transport.Proxy
    
    // 启动服务器
    fmt.Println("Starting goproxy on :8080")
    if err := http.ListenAndServe(":8080", proxy); err != nil {
        panic(err)
    }
}

2. 配置Go客户端使用goproxy

在你的开发环境中设置环境变量:

# 设置goproxy地址
export GOPROXY=http://localhost:8080,direct
export GOSUMDB=off  # 暂时关闭校验,企业环境可能需要私有校验服务器

# 或者永久设置
go env -w GOPROXY=http://localhost:8080,direct
go env -w GOSUMDB=off

3. 预缓存常用模块

在企业环境中,建议预缓存常用模块到goproxy:

# 通过goproxy预下载模块
GOPROXY=http://localhost:8080 go get gopkg.in/ldap.v2@latest
GOPROXY=http://localhost:8080 go get github.com/gin-gonic/gin@latest

4. 使用goproxy.cn的配置示例

如果你的企业允许访问外部goproxy,可以配置为:

# 使用国内镜像作为上游
export GOPROXY=http://localhost:8080,https://goproxy.cn,direct

# 或者在goproxy配置中设置
proxy := goproxy.New()
proxy.GoBinEnv = append(os.Environ(),
    "GOPROXY=https://goproxy.cn,direct",
)

5. 验证配置

创建测试文件验证配置:

// main.go
package main

import (
    "fmt"
    "gopkg.in/ldap.v2"
)

func main() {
    fmt.Println("LDAP version:", ldap.Version)
}

然后运行:

# 清理缓存
go clean -modcache

# 通过goproxy构建
GOPROXY=http://localhost:8080 go build -v

6. Docker部署示例

如果需要容器化部署:

FROM golang:1.19-alpine

RUN go install github.com/goproxy/goproxy@latest

COPY goproxy-config.toml /etc/goproxy/

EXPOSE 8080

CMD ["goproxy", "-config", "/etc/goproxy/goproxy-config.toml"]

关键点在于确保goproxy本身能够通过企业代理访问外部网络,这样它才能正确获取模块元数据并缓存模块。错误信息"unrecognized import path"通常表明goproxy无法访问模块的元数据端点。

回到顶部