logo
35
146
WeChat Login

支持私有仓库对 ?go-get=1 的访问做特殊放行,只返回 meta 标签,代码下载才需认证#1032

Resolved
created 2025-06-26
Edit

这个特性将解决什么问题?

设置仓库为私有非公开可见)时,https://cnb.cool/test/code_package?go-get=1, 直接返回401,导致go get失败

应该返回静态 HTML,专门放 go-import meta 标签的,不涉及源码访问权限
返回内容如下:(以下内容是示例仓库,但示例仓库为 公开可见

<html>
<head>
<meta name="go-import" content="cnb.cool/examples/ecosystem/go-private-repo-server git https://cnb.cool/examples/ecosystem/go-private-repo-server.git">
</head>
<body>
go get cnb.cool/examples/ecosystem/go-private-repo-server
</body>
</html>

设想的解决方案?如有

私有仓库对 ?go-get=1 的访问做特殊放行,只返回 meta 标签,代码下载才需认证

您考虑过哪些替代方案?如有

使用 replace 本地替代
手动把依赖仓库 clone 到本地某个路径(比如 ../code.xxxx)

但体验很差,同时在进行多阶段构建也需要如此操作, 如: 在dockerfile中进行:
FROM xxxxx AS build
ADD . /data/build/
WORKDIR /data/build

RUN go mod tidy -compat=1.22 && go mod graph # 这段必然也涉及到对私有仓库进行go get操作,如果不支持,该处也将需要使用单独的git clone后进行replace
RUN CGO_ENABLED=0 GOOS=linux go build -o some_app main.go

FROM docker.cnb.cool/byboat/alpine:gorun-1.0.0
RUN mkdir -p /data/wwwRoot/
COPY --from=build /data/build/some_app /data/wwwRoot/some_app
WORKDIR /data/wwwRoot

Administrator

go-get 也需要凭证是因为安全的原因,防止匿名检测私有仓库。解决方案是配置好访问凭据,在 $HOME/.netrc 里面添加内容如下:

machine.cnb.cool
login cnb
password <TOKEN>

另外也可以参考这里的 example: https://cnb.cool/examples/ecosystem/go-private-repo-server

Creator

这个方式在linux没有问题,在windows中go mod的fallback的行为是不一样的,并不会在go get 返回401的时候,尝试用git拉取,然后触发.netrc文件生效,在windows中,如果go get触发401会直接失败,不会尝试使用git, 触发.netrc的内置,所以这类方法在windows全部失效

added labels
仅讨论
Administrator

这个方式在linux没有问题,在windows中go mod的fallback的行为是不一样的,并不会在go get 返回401的时候,尝试用git拉取,然后触发.netrc文件生效,在windows中,如果go get触发401会直接失败,不会尝试使用git, 触发.netrc的内置,所以这类方法在windows全部失效

@cnb.yuanqing windows 上面不是 .netrc 而是 _netrc,放在 %HOME% 下面

Administrator
d12e824e-5fba-4d63-a886-36f3c6d01900.png 9b5ad6d8-d60c-499e-baad-dc975d63d0aa.png

@cnb.yuanqing 上面截图就是在 windows 上面实践这个 https://cnb.cool/examples/ecosystem/go-private-repo-server go-get 私有仓库的效果。

Creator

感谢支持,没有想到文件名的问题,已经可以了,总结一下方案

  1. 可设置环境变量: NETRC=C:\Users\youname\xxx,优先使用环境变量,该方法windows,linux通用
  2. linux按照https://cnb.cool/examples/ecosystem/go-private-repo-server 设置即可
  3. windows中golang版本小于1.24之前,要么设置环境变量,参考第一条,要么将文件名修改为_netrc
  4. golang版本1.24之后,支持.netrc 和 _netrc

https://github.com/golang/go/issues/66832
https://go-review.googlesource.com/c/go/+/607237

Resolved ISSUE
referenced ISSUE
Assignee
None yet
Label
仅讨论
Priority
None yet
Time period
-
Property
Add custom properties to record and label key information
Participant