可以在master以外的其他分支上使用Golang模块吗?

问题描述

只要我在master分支上,此代码就可以工作:

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/dwschulze/go-module-test-dateutilmod"
    "github.com/dwschulze/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())
}

go.mod:

module module-driver

require (
    192.168.0.12/gitrepo/go-module-test-dateutil.git v0.0.1
    192.168.0.12/gitrepo/go-module-test-stringutil.git v0.0.1
    github.com/dwschulze/go-module-test-dateutilmod v0.0.1
    github.com/dwschulze/go-module-test-stringutilmod v0.0.1
)

go 1.15

我需要使用分支dev2进行开发。 godocs并未在go.mod显示对导入路径或require语句需要执行的操作。如果我将导入语句更改为:

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

我得到:

$ go run main.go
package command-line-arguments
imports 192.168.0.12/gitrepo/go-module-test-dateutil.git@dev2: can only use path@version Syntax with go get

如果我将@dev2移到go.mod中的require语句中

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

我明白了

$ go run main.go
go: 192.168.0.12/gitrepo/go-module-test-dateutil.git@dev2@v0.0.1: unrecognized import path "192.168.0.12/gitrepo/go-module-test-dateutil.git@dev2": https fetch: Get "https://192.168.0.12/gitrepo/go-module-test-dateutil.git@dev2?go-get=1": dial tcp 192.168.0.12:443: connect: connection refused

错误消息显示https,这很奇怪,因为在我的~/.gitconfig

[url "dean@192.168.0.12:"] insteadOf = https://192.168.0.12/

设置GOPRIVATE无效。如果将@dev2放在两个地方,都会得到相同的错误消息。

godocs并未显示任何有效的.gogo.mod文件必须包含什么才能在master以外的分支上使用模块的任何示例。我认为模块必须在任何分支上都可以工作,因为开发通常是在master以外的分支上进行的。

有人有一个.go文件一个go.mod在非master分支上工作的有效示例吗?

解决方法

Go的工具没有快照,开发或移动依赖的概念。依赖关系是固定的,尝试通过go get绕开分支来避免这种情况会导致更多问题。

如果您有移动依赖项:

  1. 在go.mod中添加一个replace指令,使该依赖项指向它的本地副本。
  2. 以所需的方式管理该依赖项的本地副本,例如通过检出某个分支并定期git pull进行访问。

如果您有无法使用的git服务器:

如果您的VCS服务器不提供https://golang.org/pkg/cmd/go/#hdr-Remote_import_paths中所述的元标记,则必须使用replace指令并通过VCS手动管理本地副本。

在任何情况下:如https://golang.org/pkg/cmd/go/#hdr-Remote_import_paths中所述,格式为“ 192.168.0.12/gitrepo/go-module-test-stringutil.git”(带.git后缀)的导入路径是错误的:如果“ gitrepo”实际上是存储库,则“ .git”应转到“ 192.168.0.12/gitrepo.git/go-module-test-stringutil”。