1 回答

TA貢獻(xiàn)1807條經(jīng)驗 獲得超9個贊
以下是我了解到go get當(dāng) git 存儲庫位于私有服務(wù)器上時如何使用包和模塊。我希望它可以幫助其他人將所有步驟記錄在一個地方。
在私有服務(wù)器上使用帶有 git 存儲庫的包和模塊
以下是在私有服務(wù)器上通過 git 存儲庫使用 Go 包和模塊所需的所有步驟。這些服務(wù)器的 IP 地址為 10.xxx.yyy.zzz 或 192.168.xxx.yyy。假設(shè)這些服務(wù)器上不存在 github 或 gitlab,因此端口 80 上沒有運(yùn)行 Web 服務(wù)器,這是所go get基于的假設(shè)。您的私人服務(wù)器只需要sshd運(yùn)行即可。
安裝最新版本的 Go 并確保設(shè)置 GOPATH。GOPATH 中的第一個元素是將這些示例中的代碼下載到的位置。
您的網(wǎng)絡(luò)上需要另一臺計算機(jī),您將在其中創(chuàng)建 git 存儲庫。這將是您的私人 git 服務(wù)器。
如果您想跳過所有設(shè)置步驟和示例代碼,您可以檢查兩個主要差異部分,其中列出了在私有服務(wù)器而不是公共 git 存儲庫中使用包或模塊時的差異。
源代碼
將dateutil.go和放入stringutil.go如下所示的包和模塊的目錄結(jié)構(gòu)中。
日期實用程序:
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 放置在如下所示的目錄結(jié)構(gòu)之外的某個位置):
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 約定創(chuàng)建包
在 GOPATH 之外創(chuàng)建一個像這樣的目錄結(jié)構(gòu)并添加上面的文件。這遵循 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是您將在其中創(chuàng)建 git 存儲庫的私有 git 服務(wù)器的主機(jī)名或 IP 地址(不是您當(dāng)前擁有此代碼的計算機(jī))。有一個未記錄的要求,即go get命令的主機(jī)名中包含.。如果您的私有 git 服務(wù)器的主機(jī)名中沒有 ,.則使用其 IP 地址。添加 ssh 密鑰訪問您的私有 git 服務(wù)器ssh-copy-id。
使用 github 上的私有存儲庫
我們將從最簡單的情況開始,使用 github.com 中的包。您需要一個具有 ssh 密鑰訪問設(shè)置的 github 帳戶。
在上面創(chuàng)建的兩個src/目錄中創(chuàng)建 git reposgithub/git init
package
├── github
│ ├── dateutil
│ │ └── src
│ │ └── ...
│ └── stringutil
│ └── src
| └── ...
datepackage/分別將和目錄添加并提交stringpackage/到您的 git 存儲庫。
在您的 github.com 帳戶中創(chuàng)建兩個名為go-package-test-dateutil和的私有 github 存儲庫。go-package-test-stringutil按照說明將目錄中本地 git 存儲庫中的遙控器設(shè)置src/為各自的 github 存儲庫。推一下代碼。
由于您的存儲庫是私有的,您必須使用 ssh 公鑰訪問來下載代碼。由于go get默認(rèn)使用 https,因此您需要將其添加到您的~/.gitconfig文件中:
git config --global url."git@github.com:".insteadOf "https://github.com/"
運(yùn)行這些命令將您剛剛推送到 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在上面創(chuàng)建的文件所在的目錄中,鍵入go run main.go內(nèi)容,結(jié)果將打印到控制臺。
在您的私人服務(wù)器上創(chuàng)建 Git 存儲庫
現(xiàn)在您將在您的私有 git 服務(wù)器上創(chuàng)建 git 存儲庫。為了保持簡單,您只需使用git init --bare. 無需安裝 github 或 gitlab。在您的私人 git 服務(wù)器上,您需要sshd從代碼所在的計算機(jī)上運(yùn)行并具有 ssh 密鑰訪問權(quán)限。新的存儲庫將位于/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命令有一個未記錄的要求,即主機(jī)名.中包含一個。如果您的私有 git 服務(wù)器的主機(jī)名中沒有 ,.則使用其 IP 地址,這就是我在本示例的其余部分中將執(zhí)行的操作。假設(shè)機(jī)器的IP地址是192.168.0.12
dateutil.go將您之前創(chuàng)建的和文件復(fù)制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/目錄中像之前一樣創(chuàng)建本地 git 存儲庫,然后添加并提交代碼。將遙控器設(shè)置為您在私人 git 服務(wù)器上創(chuàng)建的 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 服務(wù)器需要另一個條目:
git config --global url."myusername@your-local-git-repo-hostname:".insteadOf "https://192.168.0.12/"
現(xiàn)在推送代碼。請注意,此代碼尚未在您的 GOPATH 中。
用于go get從您的私人 git 服務(wù)器檢索代碼。需要在您git init --bare的私有 git 服務(wù)器上創(chuàng)建 git 存儲庫的目錄名稱中添加“.git”后綴。這表明go get這是一個 git 存儲庫而不是其他版本控制系統(tǒng)。
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 服務(wù)器上的包中
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和的使用,因為這些語句具有重復(fù)的包名稱(導(dǎo)入語句中的最后一個元素)。strpkgimportimport
現(xiàn)在您可以使用 運(yùn)行代碼go run main.go。
在 guthub.com 上使用私有存儲庫和在私有 git 服務(wù)器上使用存儲庫之間的主要區(qū)別:
修改~/.gitconfig
在 go get 語句中添加 .git 后綴
go get和 語句中的主機(jī)名import必須有一個點(diǎn)
使用私有存儲庫創(chuàng)建模塊
創(chuàng)建一個與packages/上面創(chuàng)建的目錄平行的目錄結(jié)構(gòu)。復(fù)制上面的dateutil.go和stringutil.go文件。將包語句分別更改為datemod和stringmod。您go.mod稍后將創(chuàng)建這些文件。
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通過在這些目錄中執(zhí)行以下命令來生成文件:
在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/創(chuàng)建一個 git 存儲庫,并git init添加并提交文件。
在 github.com 上創(chuàng)建兩個名為go-module-test-dateutilmod和的私有存儲庫go-module-test-stringutilmod。按照說明在目錄下各自的本地 git 存儲庫中設(shè)置遙控器github/。推一下代碼。
在你的私人 git 服務(wù)器上創(chuàng)建兩個 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/在目錄下的相應(yīng) git 存儲庫中設(shè)置遙控器
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
推一下代碼。
現(xiàn)在您有四個不同的模塊,每個模塊兩個位于您的 github.com 帳戶和您的私人 git 服務(wù)器的存儲庫中。
在另一個目錄中創(chuàng)建一個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())
}
要將模塊與私有存儲庫一起使用,我們必須設(shè)置GOPRIVATE
go env -w GOPRIVATE=192.168.0.12/gitrepo/*,github.com/your-github-username/*
設(shè)置后,GOPRIVATE模塊將直接從指定的 git 存儲庫而不是Go 公共代理中拉取。
現(xiàn)在運(yùn)行
$ go mod init module-driver
go: creating new go.mod: module module-driver
$ cat go.mod
module module-driver
go 1.15
現(xiàn)在執(zhí)行main.go. 在運(yùn)行代碼之前,它將從 github.com 和您的私人 git 服務(wù)器下載模塊:
$ 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在運(yùn)行代碼之前,您不必運(yùn)行來下載這些模塊。也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 下載模塊來測試您的環(huán)境設(shè)置是否正確:
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 服務(wù)器的存儲庫路徑上的后綴的使用。如果沒有這個,go get將使用 https 而不是 git (它將使用 ssh)。
運(yùn)行g(shù)o get會修改go.mod文件。雖然有些人說您可以手動修改go.mod文件,但另一些人則說您不應(yīng)該go.mod手動編輯,而應(yīng)該使用它go get來進(jìn)行任何修改。
使用go get或下載模塊代碼go run main.go會將代碼下載到$GOPATH/pkg/mod. 由于未指定版本,它將提取該模塊的最新語義版本標(biāo)簽。
語義版本控制是通過標(biāo)簽完成的,這些標(biāo)簽只是一個提交。標(biāo)簽獨(dú)立于分支,因此如果最新版本semver是在 master 以外的分支上完成的,它將拉取該版本。
要指定特定版本,請使用
go get 192.168.0.12/gitrepo/go-module-test-dateutil.git@v0.0.1
go.mod如果條目已存在,這將更新該條目
您應(yīng)該能夠刪除$GOPATH/pkg/mod/目錄并go run main.go再次執(zhí)行此操作。您將看到 Go 在運(yùn)行代碼之前下載所需的模塊。
使用私有存儲庫中的模塊時的主要區(qū)別
修改~/.gitconfig
為您的私有服務(wù)器上的存儲庫添加 .git 后綴
您的私有服務(wù)器的主機(jī)名中必須有一個點(diǎn),或者使用其 IP 地址
設(shè)置GOPRIVATE為go env -w GOPRIVATE=...
在不同的分支上使用代碼
語義版本標(biāo)簽獨(dú)立于分支,但有一種情況go get可以使用分支。如果您想要go get來自分支的最新提交,您可以@branchname像這樣附加:
go get 192.168.0.12/gitrepo/go-module-test-dateutil.git@branchname
如果分支上的最新提交沒有標(biāo)簽,semver將go get使用下一個標(biāo)簽號以及時間戳和哈希值創(chuàng)建偽版本semver。
常見問題解答
410 Gone下載模塊時出現(xiàn)錯誤意味著什么?
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
如果您沒有設(shè)置 GOPRIVATE,則可能會發(fā)生這種情況。Go 嘗試從 Go 公共代理檢索您的(私有)模塊,但它在那里找不到它們。
- 1 回答
- 0 關(guān)注
- 204 瀏覽
添加回答
舉報