gpt4 book ai didi

go - 我该如何在本地服务器上使用仓库

转载 作者:行者123 更新时间:2023-12-03 10:10:19 25 4
gpt4 key购买 nike

我在本地服务器上有一个git repo。我可以使用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可以与本地服务器上的存储库一起使用吗?

最佳答案

这是我在git repo在私有(private)服务器上时对包和模块使用go get的知识。我希望它可以帮助其他人将所有步骤记录在一个地方。
在私有(private)服务器上将包和模块与git仓库一起使用
这是在私有(private)服务器上将Go包和模块与git存储库一起使用所需的所有步骤。这些是具有IP地址(例如10.xxx.yyy.zzz或192.168.xxx.yyy)的服务器。假定这些服务器上不存在github或gitlab,因此端口80上没有运行Web服务器,这是go get所基于的假设。您的私有(private)服务器只需要运行sshd
安装最新版本的Go,并确保已设置GOPATH。这些示例中的代码将下载到GOPATH中的第一个元素。
您将需要在网络上另一台计算机上创建git存储库。这将是您的私有(private)git服务器。
如果要跳过所有设置步骤和示例代码,可以检查两个关键差异部分,该部分列出了在私有(private)服务器而不是公共(public)git存储库中使用软件包或模块时的区别。
源代码
对于软件包和模块,将dateutil.gostringutil.go放在下面显示的目录结构中。
dateutil.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 repos的私有(private)git服务器的主机名或IP地址(而不是当前拥有此代码的机器)。有一个未记录的要求,即 go get命令的主机名中包含 .。如果您的私有(private)git服务器的主机名中没有 .,请使用其IP地址。使用 ssh-copy-id将ssh key 访问权限添加到您的私有(private)git服务器。
在github上使用私有(private)仓库
我们将从最简单的情况开始,使用来自github.com的软件包。您将需要一个具有ssh key 访问设置的github帐户。
在上面使用 src/创建的 github/下的两个 git init目录中创建git repos
package
├── github
│   ├── dateutil
│   │   └── src
│   │   └── ...
│   └── stringutil
│      └── src
|  └── ...
datepackage/stringpackage/ dirs分别添加并提交到您的git repos中。
在github.com上的帐户中创建两个名为 go-package-test-dateutilgo-package-test-stringutil的私有(private)github仓库。请按照说明在 src/目录中的本地git仓库中将 Remote 设置为它们各自的github仓库。推送代码。
由于您的存储库是私有(private)的,因此您必须使用ssh公共(public) key 访问权限来下载代码。由于 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,结果将打印到控制台。
在私有(private)服务器上创建Git存储库
现在,您将在私有(private)git服务器上创建git repos。为了保持简单,您只需要使用 git init --bare即可。无需安装github或gitlab。在您的私有(private)git服务器上,您需要运行 sshd并从代码所在的计算机上具有ssh key 访问权限。新的存储库将在 /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命令有一个未记录的要求,即主机名中必须包含 .。如果私有(private)git服务器的主机名中没有 .,则使用其IP地址,这就是本示例其余部分的内容。假设机器的IP地址为192.168.0.12
将您先前创建的 dateutil.gostringutil.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 repos,然后添加并提交代码。将 Remote 设置为您在私有(private)git服务器上创建的git repo
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中为您的私有(private)git服务器添加另一个条目:
git config --global url."myusername@your-local-git-repo-hostname:".insteadOf "https://192.168.0.12/"
现在推送代码。请注意,该代码尚未在您的GOPATH中。
使用 go get从您的私有(private)git服务器检索代码。有必要在您的私有(private)git服务器上使用 git init --bare创建git repos的目录名称中添加“.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中第一个元素的pkg/和src/目录中。
└── 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语句添加到私有(private)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语句中使用了别名 strpkgimport,因为 import语句具有重复的程序包名称(import语句中的最后一个元素)。
现在,您可以使用 go run main.go运行代码。
在guthub.com上使用私有(private)仓库和在私有(private)git服务器上仓库的主要区别:
  • 修改〜/.gitconfig
  • 在go get语句中添加.git后缀
  • go getimport语句中的主机名必须在其中包含一个点

  • 使用私有(private)存储库创建模块
    创建一个类似于上面创建的 packages/目录的目录结构。从上方复制 dateutil.gostringutil.go文件。将package语句分别更改为 datemodstringmod。稍后将创建 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 init创建一个git repo并添加并提交文件。
    在github.com上创建两个名为 go-module-test-dateutilmodgo-module-test-stringutilmod的私有(private)仓库。按照说明在 github/目录下的相应本地git存储库中设置 Remote 。推送代码。
    在您的私有(private)git服务器上,创建两个git repos
    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仓库中设置 Remote
    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帐户和您的私有(private)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())
    }
    要将模块与私有(private)仓库一起使用,我们必须设置 GOPRIVATE
    go env -w GOPRIVATE=192.168.0.12/gitrepo/*,github.com/your-github-username/*
    设置 GOPRIVATE时,将直接从指定的git repos而不是 Go public proxy提取模块。
    现在运行
    $ 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和您的私有(private)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
    再次注意私有(private)git服务器的存储库路径上 .git后缀的使用。没有这个 go get将使用https而不是git(它将使用ssh)。
    运行 go get会修改 go.mod文件。有些人说您可以手动修改 go.mod文件,而其他人则说您不应该手动编辑 go.mod,而应使用 go get进行任何修改。
    使用 go getgo run main.go下载模块代码会将代码下载到 $GOPATH/pkg/mod中。由于未指定版本,它将为该模块提取最新的 semantic version tag
    语义版本控制是通过只是提交的标签完成的。标签与分支无关,因此,如果在master以外的其他分支上完成了最新的 semver,它将提取该版本。
    指定特定版本使用
    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
  • 在私有(private)服务器上为 repo 添加.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公共(public)代理检索您的(私有(private))模块,但无法在其中找到它们。
    资源
    Using private repos from public git hosting services. A demonstration of how GOPRIVATE and GOPROXY work.

    关于go - 我该如何在本地服务器上使用仓库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60645866/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com