golang脱机安装第三方包



我正在尝试离线安装golang的第三方包。我想做一些事情,比如进入一个在线的环境,一个离线的环境。我可以从github获得第三方包的源代码,并将其放在脱机环境中,但这样我就不能在golang中使用它作为包。

我该怎么办?

正如@emptyhua评论的那样,这个链接对我有用:https://gist.github.com/gmolveau/f09c1038ca622620e54d0579ba06ea96#file-golang_offline-md

此处参考:

  1. 在在线机器上确保go。装好就走。当前目录中存在Sum创建一个go文件:

import (
_ "github.com/gorilla/mux"
_ "github.com/sirupsen/logrus"
)
func main() {}
  1. run:go mod vendor

  2. 复制。国防部,走了。Sum和供应商目录到脱机机

  3. 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.gitsomething-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.

相关内容

  • 没有找到相关文章

最新更新