我正在尝试离线安装golang的第三方包。我想做一些事情,比如进入一个在线的环境,一个离线的环境。我可以从github获得第三方包的源代码,并将其放在脱机环境中,但这样我就不能在golang中使用它作为包。
我该怎么办?
正如@emptyhua评论的那样,这个链接对我有用:https://gist.github.com/gmolveau/f09c1038ca622620e54d0579ba06ea96#file-golang_offline-md
此处参考:
- 在在线机器上确保go。装好就走。当前目录中存在Sum创建一个go文件:
import (
_ "github.com/gorilla/mux"
_ "github.com/sirupsen/logrus"
)
func main() {}
run:
go mod vendor
复制。国防部,走了。Sum和供应商目录到脱机机
run:
go run -mod=vendor main.go
为了离线测试,我使用一个没有网络的容器:podman run --rm -it --net none -v $(pwd):/go/src:z golang
cd src
go run -mod=vendor main.go
希望有帮助!谢谢@gmolveau -离线go mods
您可以试试vendor/
目录
见我的回答https://stackoverflow.com/a/76688264/490291
如果这个包是Debian的一部分,也许下面这些就足够了:
ln -s /usr/share/gocode/src vendor
在vendor/github.com/$USER/$REPO/
处搜索软件包github.com/$USER/$REPO
,这样您甚至可以使用git submodule
检查软件包:
git submodule add https://github.com/$USER/$REPO.git vendor/github.com/$USER/$REPO/
AFAICS(但我从未尝试过)
git submodule update --recursive
不像预期的那样在这里工作。因此,如果某个子模块本身具有vendor/
目录,则必须将其混合到自己的vendor/
目录中,因为该特性不执行递归。至少这是我从关于该特性的(太少的)文档中得到的印象。当然,您可以使用软链接来映射子路径,例如
yes n | for a in vendor/*/*/*/vendor/*; do [ -d "$a" ] && ln -is --relative "$a"/* "vendor/`basename "$a"`/"; done
有一个不太为人所知的git
特性,它允许您将任何URL映射到任何内容。例如,如果你做了一个镜像(你可以用你的配置工具或rsync
复制到你的服务器):
git clone --mirror https://github.com/$USER/$REPO.git /srv/git/github.com/$USER/$REPO.git
您可以用一行将https://github.com/$USER/$REPO.git
映射到/srv/git/github.com/$USER/$REPO.git
:
git config --global url./srv/git/github.com/.insteadOf https://github.com/
:
- 在一些远程联网的PC上执行所有
--mirror
克隆- 将镜像存储库复制到脱机PC上的
/srv/git/
- 然后执行
git config --global url./srv/git/.insteadOf https://
- 然后把
git submodule add
改成vendor/
或者已经有
.gitmodules
文件的git clone --recursive /srv/git/yoursource.git
,它携带https://github.com/
- url,这些url只能在离线环境之外工作,但是也可以离线工作,因为它们被重新映射到/srv/git/
请注意,您可以用这种方式映射所有http://
和https://
url,这样https://$SERVER/$USER/$REPO.git
就变成了/srv/git/$SERVER/$USER/$REPO.git
与
git config --global url./srv/git/.insteadOf https://
git config --global url./srv/git/.insteadOf http://
您唯一需要记住的是:不要留下后缀.git
在checkout/子模块url中。并且不要在末尾添加/
。
这通常使生活更容易。因为你通常想要命名为"裸"git
存储库(--mirror
)something.git
而不是something
,通常something/
应该是工作树的签出。由于git
在大多数情况下足够智能地删除.git
,并且所有git
服务(如GitHub或GitLab)也这样做,添加.git
只会在重新映射时增加好处,因为您可以以不同的方式映射something.git
和something-wiki.git
(没有扩展something
包括something-wiki
)。
git
的特性url.*.insteadOf
只映射前缀,你不能轻易地改变后缀。因此,如果您碰巧需要添加后缀,则必须单独重新映射每个URL,这会使事情变得不舒服。我还考虑在.git
上结束git
的repo url,这样看起来更自然。YMMV .
首先,您必须为工作目录设置GOPATH
。之后,您可以使用以下脱机包,只需为包的路径创建一个mod
文件。
使用下面的代码初始化go mod文件
go mod init <Enter your GitHub profile link>
例如:
go mod init github.com/amshashankk
在之后,当您导入包时,它们将在代码
的导入部分中写成如下所示github.com/amshashankk/package
.