为了账号安全,请及时绑定邮箱和手机立即绑定

我怎样才能让 go 与本地服务器上的存储库一起工作

我怎样才能让 go 与本地服务器上的存储库一起工作

Go
千巷猫影 2023-08-14 17:47:47
我在本地服务器上有一个 git 存储库。我可以通过git clone user@10.xxx.yyy.zzz:/srv/git/liqid.git用户具有 ssh 访问权限的位置进行克隆,并读取/写入 git/ 目录。当我尝试将它与go get -v user@10.xxx.yyy.zzz:/srv/git/liqid.git它一起使用时go: cannot use path@version syntax in GOPATH mode我尝试过各种其他组合,例如省略:,但它们都失败了。可以go get使用本地服务器上的存储库吗?
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

以下是我了解到go get当 git 存储库位于私有服务器上时如何使用包和模块。我希望它可以帮助其他人将所有步骤记录在一个地方。


在私有服务器上使用带有 git 存储库的包和模块


以下是在私有服务器上通过 git 存储库使用 Go 包和模块所需的所有步骤。这些服务器的 IP 地址为 10.xxx.yyy.zzz 或 192.168.xxx.yyy。假设这些服务器上不存在 github 或 gitlab,因此端口 80 上没有运行 Web 服务器,这是所go get基于的假设。您的私人服务器只需要sshd运行即可。


安装最新版本的 Go 并确保设置 GOPATH。GOPATH 中的第一个元素是将这些示例中的代码下载到的位置。


您的网络上需要另一台计算机,您将在其中创建 git 存储库。这将是您的私人 git 服务器。


如果您想跳过所有设置步骤和示例代码,您可以检查两个主要差异部分,其中列出了在私有服务器而不是公共 git 存储库中使用包或模块时的差异。


源代码


将dateutil.go和放入stringutil.go如下所示的包和模块的目录结构中。


日期实用程序:


package datepackage


import "time"


func GetTime() time.Time {

    return time.Now().Local()

}

stringutil.go:


package stringpackage


import "strings"


func ToUpperCase(s string) string {


    return strings.ToUpper(s)

}

main.go(将 main.go 放置在如下所示的目录结构之外的某个位置):


package main


import (

    "fmt"

    "github.com/your-github-username/go-package-test-dateutil/datepackage"

    "github.com/your-github-username/go-package-test-stringutil/stringpackage"

)


func main() {


    fmt.Println("github:  " + stringpackage.ToUpperCase("test"))

    fmt.Println("github:  " + datepackage.GetTime().String())

}

这些文件可以在 github.com 上找到


git@github.com:dwschulze/go-package-test-dateutil.git


git@github.com:dwschulze/go-package-test-stringutil.git


git@github.com:dwschulze/go-module-package-test-drivers.git

使用 GOPATH 约定创建包


在 GOPATH 之外创建一个像这样的目录结构并添加上面的文件。这遵循 GOPATH 约定,但您不需要 GOPATH 中的这些文件。


package

├── github

│   ├── dateutil

│   │   └── src

│   │       └── datepackage

│   │           └── dateutil.go

│   └── stringutil

│       └── src

│           └── stringpackage

│               └── stringutil.go

└── your-local-git-repo-hostname

    ├── dateutil

    │   └── src

    │       └── datepackage

    │           └── dateutil.go

    └── stringutil

        └── src

            └── stringpackage

                └── stringutil.go

your-local-git-repo-hostname是您将在其中创建 git 存储库的私有 git 服务器的主机名或 IP 地址(不是您当前拥有此代码的计算机)。有一个未记录的要求,即go get命令的主机名中包含.。如果您的私有 git 服务器的主机名中没有 ,.则使用其 IP 地址。添加 ssh 密钥访问您的私有 git 服务器ssh-copy-id。


使用 github 上的私有存储库


我们将从最简单的情况开始,使用 github.com 中的包。您需要一个具有 ssh 密钥访问设置的 github 帐户。


在上面创建的两个src/目录中创建 git reposgithub/git init


package

├── github

│   ├── dateutil

│   │   └── src

│   │       └── ...

│   └── stringutil

│       └── src

|           └── ...

datepackage/分别将和目录添加并提交stringpackage/到您的 git 存储库。


在您的 github.com 帐户中创建两个名为go-package-test-dateutil和的私有 github 存储库。go-package-test-stringutil按照说明将目录中本地 git 存储库中的遥控器设置src/为各自的 github 存储库。推一下代码。


由于您的存储库是私有的,您必须使用 ssh 公钥访问来下载代码。由于go get默认使用 https,因此您需要将其添加到您的~/.gitconfig文件中:


git config --global url."git@github.com:".insteadOf "https://github.com/"

运行这些命令将您刚刚推送到 github.com 的代码放入您的GOPATH:


go get github.com/your-github-username/go-package-test-stringutil/stringpackage/


go get github.com/your-github-username/go-package-test-dateutil/datepackage/

包被下载到GOPATH 中第一个元素的pkg/和目录中。src/


main.go在上面创建的文件所在的目录中,键入go run main.go内容,结果将打印到控制台。


在您的私人服务器上创建 Git 存储库


现在您将在您的私有 git 服务器上创建 git 存储库。为了保持简单,您只需使用git init --bare. 无需安装 github 或 gitlab。在您的私人 git 服务器上,您需要sshd从代码所在的计算机上运行并具有 ssh 密钥访问权限。新的存储库将位于/home/myusername/gitrepo.


git init /home/myusername/gitrepo/go-package-test-dateutil --bare


git init /home/myusername/gitrepo/go-package-test-stringutil --bare

该go get命令有一个未记录的要求,即主机名.中包含一个。如果您的私有 git 服务器的主机名中没有 ,.则使用其 IP 地址,这就是我在本示例的其余部分中将执行的操作。假设机器的IP地址是192.168.0.12


dateutil.go将您之前创建的和文件复制stringutil.go到以下目录中your-local-git-repo-hostname:


package

├── github

|   ...

└── your-local-git-repo-hostname

    ├── dateutil

    │   └── src

    │       └── datepackage

    │           └── dateutil.go

    └── stringutil

        └── src

            └── stringpackage

                └── stringutil.go

在这两个src/目录中像之前一样创建本地 git 存储库,然后添加并提交代码。将遥控器设置为您在私人 git 服务器上创建的 git 存储库


git remote add origin myusername@your-local-git-repo-hostname:gitrepo/go-package-test-dateutil



git remote add origin myusername@your-local-git-repo-hostname:gitrepo/go-package-test-stringutil

~/.gitconfig您的私人 git 服务器需要另一个条目:


git config --global url."myusername@your-local-git-repo-hostname:".insteadOf "https://192.168.0.12/"

现在推送代码。请注意,此代码尚未在您的 GOPATH 中。


用于go get从您的私人 git 服务器检索代码。需要在您git init --bare的私有 git 服务器上创建 git 存储库的目录名称中添加“.git”后缀。这表明go get这是一个 git 存储库而不是其他版本控制系统。


go get 192.168.0.12/gitrepo/go-package-test-stringutil.git/stringpackage



go get 192.168.0.12/gitrepo/go-package-test-dateutil.git/datepackage

这些软件包被下载到GOPATH.


└── src

    ├── 192.168.0.12

    │   └── gitrepo

    │       ├── go-module-test-dateutil.git

    │       │   ├── dateutil.go

    │       │   └── go.mod

    │       ├── go-package-test-dateutil.git

    │       │   └── datepackage

    │       │       └── dateutil.go

    │       └── go-package-test-stringutil.git

    │           └── stringpackage

    │               └── stringutil.go

在您的main.go代码中将两个 import 语句添加到您的私有 git 服务器上的包中


package main


import (

    dpkg "192.168.0.12/gitrepo/go-package-test-dateutil.git/datepackage"

    strpkg "192.168.0.12/gitrepo/go-package-test-stringutil.git/stringpackage"

    "fmt"

    "github.com/your-github-username/go-package-test-dateutil/datepackage"

    "github.com/your-github-username/go-package-test-stringutil/stringpackage"

)


func main() {


    fmt.Println("github:  " + stringpackage.ToUpperCase("test"))

    fmt.Println("github:  " + datepackage.GetTime().String())

    fmt.Println("local:  " + strpkg.ToUpperCase("test"))

    fmt.Println("local:  " + dpkg.GetTime().String())

}

请注意两个新语句中别名dpkg和的使用,因为这些语句具有重复的包名称(导入语句中的最后一个元素)。strpkgimportimport


现在您可以使用 运行代码go run main.go。


在 guthub.com 上使用私有存储库和在私有 git 服务器上使用存储库之间的主要区别:


修改~/.gitconfig

在 go get 语句中添加 .git 后缀

go get和 语句中的主机名import必须有一个点

使用私有存储库创建模块


创建一个与packages/上面创建的目录平行的目录结构。复制上面的dateutil.go和stringutil.go文件。将包语句分别更改为datemod和stringmod。您go.mod稍后将创建这些文件。


module

├── github

│   ├── datemodule

│   │   ├── dateutil.go

│   │   └── go.mod

│   └── stringmodule

│       ├── go.mod

│       └── stringutil.go

└── 192.168.0.12

    ├── datemodule

    │   ├── dateutil.go

    │   └── go.mod

    └── stringmodule

        ├── go.mod

        └── stringutil.go

请注意,目录名称与包名称不同。包不必遵循目录名称。


go.mod通过在这些目录中执行以下命令来生成文件:


在github/datemodule/


go mod init github.com/your-github-username/go-module-test-dateutilmod

在github/stringmodule/


go mod init github.com/your-github-username/go-module-test-stringutilmod

在192.168.0.12/datemodule/


go mod init 192.168.0.12/gitrepo/go-module-test-dateutil.git

在192.168.0.12/stringmodule/


go mod init 192.168.0.12/gitrepo/go-module-test-stringutil.git

在上面的四个datemodule/目录中stringmodule/创建一个 git 存储库,并git init添加并提交文件。


在 github.com 上创建两个名为go-module-test-dateutilmod和的私有存储库go-module-test-stringutilmod。按照说明在目录下各自的本地 git 存储库中设置遥控器github/。推一下代码。


在你的私人 git 服务器上创建两个 git 存储库


git init /home/myusername/gitrepo/go-module-test-dateutil --bare


git init /home/myusername/gitrepo/go-module-test-stringutil --bare

192.168.0.12/在目录下的相应 git 存储库中设置遥控器


git remote add origin myusername@192.168.0.12:gitrepo/go-package-test-dateutil



git remote add origin myusername@192.168.0.12:gitrepo/go-package-test-stringutil

推一下代码。


现在您有四个不同的模块,每个模块两个位于您的 github.com 帐户和您的私人 git 服务器的存储库中。


在另一个目录中创建一个main.go程序来使用这些模块:


package main


import (

    datemodlocal "192.168.0.12/gitrepo/go-module-test-dateutil.git"

    stringmodlocal "192.168.0.12/gitrepo/go-module-test-stringutil.git"

    "fmt"

    "github.com/your-github-username/go-module-test-dateutilmod"

    "github.com/your-github-username/go-module-test-stringutilmod"

)


func main() {


    fmt.Println("github:  " + stringmod.ToUpperCase("test"))

    fmt.Println("github:  " + datemod.GetTime().String())

    fmt.Println("local:  " + stringmodlocal.ToUpperCase("test"))

    fmt.Println("local:  " + datemodlocal.GetTime().String())

    fmt.Println("local toString:  " + datemodlocal.GetTimeStr())

}

要将模块与私有存储库一起使用,我们必须设置GOPRIVATE


go env -w GOPRIVATE=192.168.0.12/gitrepo/*,github.com/your-github-username/*

设置后,GOPRIVATE模块将直接从指定的 git 存储库而不是Go 公共代理中拉取。


现在运行


$ go mod init module-driver

  go: creating new go.mod: module module-driver

$ cat go.mod

  module module-driver


  go 1.15

现在执行main.go. 在运行代码之前,它将从 github.com 和您的私人 git 服务器下载模块:


$ go run main.go

go: finding module for package github.com/dwschulze/go-module-test-dateutilmod

go: finding module for package github.com/dwschulze/go-module-test-stringutilmod

go: finding module for package 192.168.0.12/gitrepo/go-module-test-stringutil.git

go: finding module for package 192.168.0.12/gitrepo/go-module-test-dateutil.git

go: downloading 192.168.0.12/gitrepo/go-module-test-stringutil.git v0.0.1

go: downloading 192.168.0.12/gitrepo/go-module-test-dateutil.git v0.0.3

go: downloading github.com/dwschulze/go-module-test-dateutilmod v0.0.1

go: downloading github.com/dwschulze/go-module-test-stringutilmod v0.0.1

go: found 192.168.0.12/gitrepo/go-module-test-dateutil.git in 192.168.0.12/gitrepo/go-module-test-dateutil.git v0.0.3

go: found 192.168.0.12/gitrepo/go-module-test-stringutil.git in 192.168.0.12/gitrepo/go-module-test-stringutil.git v0.0.1

go: found github.com/dwschulze/go-module-test-dateutilmod in github.com/dwschulze/go-module-test-dateutilmod v0.0.1

go: found github.com/dwschulze/go-module-test-stringutilmod in github.com/dwschulze/go-module-test-stringutilmod v0.0.1

github:  TEST

github:  2020-12-08 07:57:02.969147007 -0700 MST

local:  TEST

local:  2020-12-08 07:57:02.969220121 -0700 MST

local toString:  2020-12-08 07:57:02.969222359 -0700 MST  (dev2 branch)

local GetTimeStr3:  2020-12-08 07:57:02.96925053 -0700 MST  (dev2 branch)

go get在运行代码之前,您不必运行来下载这些模块。也go.mod被修改了


$ cat go.mod

module module-driver


go 1.15


require (

    192.168.0.12/gitrepo/go-module-test-dateutil.git v0.0.3 // indirect

    192.168.0.12/gitrepo/go-module-test-stringutil.git v0.0.1 // indirect

    github.com/dwschulze/go-module-test-dateutilmod v0.0.1 // indirect

    github.com/dwschulze/go-module-test-stringutilmod v0.0.1 // indirect

)

您可以使用 go get 下载模块来测试您的环境设置是否正确:


go get 192.168.0.12/gitrepo/go-module-test-dateutil.git

go get 192.168.0.12/gitrepo/go-module-test-stringutil.git

go get github.com/your-github-username/go-module-test-dateutilmod

go get github.com/your-github-username/go-module-test-stringutilmod

.git再次注意您的私有 git 服务器的存储库路径上的后缀的使用。如果没有这个,go get将使用 https 而不是 git (它将使用 ssh)。


运行go get会修改go.mod文件。虽然有些人说您可以手动修改go.mod文件,但另一些人则说您不应该go.mod手动编辑,而应该使用它go get来进行任何修改。


使用go get或下载模块代码go run main.go会将代码下载到$GOPATH/pkg/mod. 由于未指定版本,它将提取该模块的最新语义版本标签。


语义版本控制是通过标签完成的,这些标签只是一个提交。标签独立于分支,因此如果最新版本semver是在 master 以外的分支上完成的,它将拉取该版本。


要指定特定版本,请使用


go get 192.168.0.12/gitrepo/go-module-test-dateutil.git@v0.0.1

go.mod如果条目已存在,这将更新该条目


您应该能够删除$GOPATH/pkg/mod/目录并go run main.go再次执行此操作。您将看到 Go 在运行代码之前下载所需的模块。


使用私有存储库中的模块时的主要区别


修改~/.gitconfig

为您的私有服务器上的存储库添加 .git 后缀

您的私有服务器的主机名中必须有一个点,或者使用其 IP 地址

设置GOPRIVATE为go env -w GOPRIVATE=...

在不同的分支上使用代码


语义版本标签独立于分支,但有一种情况go get可以使用分支。如果您想要go get来自分支的最新提交,您可以@branchname像这样附加:


go get 192.168.0.12/gitrepo/go-module-test-dateutil.git@branchname

如果分支上的最新提交没有标签,semver将go get使用下一个标签号以及时间戳和哈希值创建伪版本semver。


常见问题解答


410 Gone下载模块时出现错误意味着什么?


go get github.com/your-github-username/go-module-test-dateutilmod

go: downloading github.com/your-github-username/go-module-test-dateutilmod v0.0.1

go get github.com/your-github-username/go-module-test-dateutilmod: github.com/your-github-username/go-module-test-dateutilmod@v0.0.1: verifying module: github.com/your-github-username/go-module-test-dateutilmod@v0.0.1: reading https://sum.golang.org/lookup/github.com/your-github-username/go-module-test-dateutilmod@v0.0.1: 410 Gone

    server response: not found: github.com/your-github-username/go-module-test-dateutilmod@v0.0.1: invalid version: unknown revision v0.0.1

如果您没有设置 GOPRIVATE,则可能会发生这种情况。Go 尝试从 Go 公共代理检索您的(私有)模块,但它在那里找不到它们。


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信