Golang模块与私有Subversion仓库的使用问题

Golang模块与私有Subversion仓库的使用问题 Go模块功能本应支持Subversion,但我没找到太多相关文档。更复杂的是:a) Subversion仓库是封闭的,我不确定自动拉取是否有效;b) 应用程序包含多个同时开发的模块,所以标签功能用处不大。

在旧的GOPATH模式下,我只需检出代码并移动/重命名目录使其符合GOPATH目录结构,然后根据需要更新各个模块。

针对以下限制条件,是否有开发建议/最佳实践:

  • Subversion"单仓库"模式,多个项目共存于同一仓库。例如开发主干路径为 example.com/svn/projectname/trunk
  • Go项目相互依赖。特别是有个被其他项目使用的"库"项目
  • Subversion仓库访问受限,需通过svn+ssh访问

尝试将此类项目转换为模块方法是否合理?


更多关于Golang模块与私有Subversion仓库的使用问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang模块与私有Subversion仓库的使用问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go模块中使用私有Subversion仓库是可行的,但需要正确配置。以下是针对您具体情况的解决方案:

1. 配置Subversion仓库访问

首先需要在~/.subversion/servers中配置SVN访问凭据,或在环境变量中设置:

export SVN_SSH="ssh -i /path/to/private/key"

2. 配置Go模块代理和私有仓库

创建或编辑~/.gitconfig(SVN通过git协议桥接):

[url "svn+ssh://example.com/"]
    insteadOf = https://example.com/

在Go模块中配置私有仓库替换:

go env -w GOPRIVATE=example.com

3. 模块定义示例

对于路径example.com/svn/projectname/trunk的库项目,创建go.mod

// 在 trunk/go.mod
module example.com/projectname

go 1.21

依赖项目引用时:

// 在其他项目的go.mod中
module example.com/myapp

go 1.21

require (
    example.com/projectname v0.0.0
)

replace example.com/projectname => example.com/svn/projectname/trunk

4. 处理单仓库多项目结构

对于单仓库中的多个Go模块,每个模块应有独立的go.mod

example.com/svn/
├── projectname/
│   ├── trunk/
│   │   ├── go.mod  # module example.com/projectname
│   │   └── lib.go
│   └── tags/
└── anotherapp/
    ├── trunk/
    │   ├── go.mod  # module example.com/anotherapp  
    │   └── main.go
    └── tags/

5. 版本控制替代方案

由于标签功能受限,可以使用SVN修订版本号作为伪版本:

require example.com/projectname v0.0.0-yyyymmddhhmmss-abc123def456

或使用replace指令直接指向特定路径:

replace example.com/projectname => example.com/svn/projectname/trunk@r1234

6. 完整工作流程示例

// 主应用程序go.mod
module example.com/mainapp

go 1.21

require (
    example.com/projectname v0.0.0
    example.com/anotherapp v0.0.0
)

replace (
    example.com/projectname => example.com/svn/projectname/trunk
    example.com/anotherapp => example.com/svn/anotherapp/trunk
)
# 设置环境
export GOPRIVATE=example.com
export SVN_SSH="ssh -i ~/.ssh/svn_key"

# 获取依赖
go mod download

7. 构建脚本示例

创建scripts/setup.sh确保环境一致性:

#!/bin/bash
export GOPRIVATE="example.com"
export SVN_SSH="ssh -i $HOME/.ssh/svn_key"
go mod download
go build -o myapp

这种方法允许在保持现有Subversion工作流程的同时利用Go模块的依赖管理功能。关键是通过GOPRIVATE环境变量和适当的SVN配置来处理私有仓库访问。

回到顶部