亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我怎樣才能讓 go 與本地服務器上的存儲庫一起工作

我怎樣才能讓 go 與本地服務器上的存儲庫一起工作

Go
千巷貓影 2023-08-14 17:47:47
我在本地服務器上有一個 git 存儲庫。我可以通過git clone [email protected]:/srv/git/liqid.git用戶具有 ssh 訪問權限的位置進行克隆,并讀取/寫入 git/ 目錄。當我嘗試將它與go get -v [email protected]:/srv/git/liqid.git它一起使用時go: cannot use path@version syntax in GOPATH mode我嘗試過各種其他組合,例如省略:,但它們都失敗了??梢詆o 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 上找到


[email protected]:dwschulze/go-package-test-dateutil.git


[email protected]:dwschulze/go-package-test-stringutil.git


[email protected]: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."[email protected]:".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 [email protected]:gitrepo/go-package-test-dateutil



git remote add origin [email protected]: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/[email protected]

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/[email protected]: verifying module: github.com/your-github-username/[email protected]: reading https://sum.golang.org/lookup/github.com/your-github-username/[email protected]: 410 Gone

    server response: not found: github.com/your-github-username/[email protected]: invalid version: unknown revision v0.0.1

如果您沒有設置 GOPRIVATE,則可能會發生這種情況。Go 嘗試從 Go 公共代理檢索您的(私有)模塊,但它在那里找不到它們。


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號