使用VSCode管理父子Golang代码仓库的最佳实践

使用VSCode管理父子Golang代码仓库的最佳实践 大家好, 我有一个仓库,我将其拆分成了一个child包/库/仓库和一个parent仓库。我分别在两个独立的VSCode项目中管理它们。

所以,当我更新child并希望parent能同步时,我目前的做法是:

  1. 提交child的新版本
  2. 同步(推送)该提交
  3. 复制提交ID
  4. 切换到parent的VS Code编辑器
  5. 使用go get -u <githuburl>@<commitid>

这个方法有效(但有点麻烦)。更重要的是,有时我的child提交无法正常工作,我不得不在parentchild之间来回切换,不断提交child的新版本,直到一切恢复正常(这会产生很多无意义的提交)……

我希望能够这样做:

  1. 保存child的更改
  2. 使用child的本地副本运行parent
  3. 当一切正常时,再执行child的提交+推送操作

注意:我仍然需要使用childcommit版本运行/构建parent,以便为其他用户检查部署情况。我可能需要为此专门创建另一个VSCode项目……这个项目基本上会拉取两者的最新提交……

有没有人用过更好的方法?

提前感谢 - Andy


更多关于使用VSCode管理父子Golang代码仓库的最佳实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

你好。你可以通过几种方式来实现。其中一种仅使用 go.mod 文件,即在文件中添加指向本地副本路径的 replace 指令。但我更倾向于使用 go.work。它允许你开发属于其他项目的包,并在将任何内容推送到 git 之前进行本地测试。官方文档可以在这里找到。

更多关于使用VSCode管理父子Golang代码仓库的最佳实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于考虑采用类似方法(即使用 replace 指令)的人,这里有一个小提示。

VSCode 的“父”编辑器有时会与“子”代码的更新不同步。可以通过重启父编辑器,或者在父编辑器中使用(在 Windows 上)Ctrl-Shift-P 然后选择 Developer: Reload Window 来修复此问题。

希望这能有所帮助。

你试过 go work 吗?在这种情况下,你就不需要替换导入语句或修改 go.mod 文件中的任何其他内容了。它会为你处理一切。

// 代码示例:使用 go work 管理多个模块
// 假设我们有两个本地模块:project-a 和 project-b
// 在项目根目录执行以下命令来创建工作区
// go work init project-a project-b

我尝试过使用 go work,但这意味着我所有的代码库在一个项目中都是可见的。我希望 child 代码与 parent 代码是分开的——我编辑时会使用两个 VSCode 编辑器(一个深色模式,另一个浅色模式),这有助于区分职责和我的注意力。我倾向于先处理子项目(API),然后根据需要切换到父框架或从父框架切换回来。

无论如何,感谢你——replace 指令确实非常有用 :slight_smile:

(最终)这个方法对我来说效果非常好…

在它生效之前,我必须做一些整理工作——以防这对其他人有帮助…

  • replace 指令必须位于 module之后,并且在 go 版本行之前,例如:replace github.com/whatever/child => ../child
  • 子模块的 go.mod 文件必须以 module github.com/whatever/child 开头
  • 每个导入语句(在父模块和子模块中)也必须采用 github.com/whatever/... 的形式

希望这能帮助到其他人…

在 Go 项目中管理父子仓库,推荐使用 replace 指令配合本地开发。以下是具体方案:

1. 在父仓库的 go.mod 中使用 replace

parent/go.mod 中添加:

module github.com/yourname/parent

go 1.21

require github.com/yourname/child v1.0.0

replace github.com/yourname/child => ../child

2. 本地开发工作流

初始设置:

# 克隆两个仓库到同级目录
projects/
├── parent/
└── child/

开发时:

  1. 直接在 child 目录修改代码
  2. parent 中运行测试,自动使用本地的 child 代码
  3. 无需提交或推送 child

示例测试命令:

cd parent
go test ./...
go run main.go

3. 版本发布流程

child 开发完成后:

# 1. 提交 child 变更
cd child
git add .
git commit -m "feat: new feature"
git push origin main

# 2. 创建新标签
git tag v1.2.0
git push origin v1.2.0

# 3. 更新父仓库引用
cd ../parent
# 移除 replace 指令或更新版本
go get github.com/yourname/child@v1.2.0

4. 多环境配置方案

创建不同的 go.mod 文件:

parent/
├── go.mod          # 开发版(含 replace)
├── go.mod.release  # 发布版(无 replace)
└── Makefile

Makefile 示例:

.PHONY: dev release

dev:
	cp go.mod.dev go.mod
	go mod tidy

release:
	cp go.mod.release go.mod
	go mod tidy
	go build -o app

5. 使用 workspaces(Go 1.18+)

创建 go.work 文件:

cd projects
go work init parent child

go.work 内容:

go 1.21

use (
    ./parent
    ./child
)

这样在 VSCode 中打开 projects 目录即可同时编辑两个仓库。

6. 完整示例

项目结构:

~/projects/
├── parent/
│   ├── go.mod
│   ├── main.go
│   └── go.work (可选)
└── child/
    ├── go.mod
    └── pkg.go

parent/main.go:

package main

import (
    "fmt"
    "github.com/yourname/child"
)

func main() {
    result := child.DoSomething()
    fmt.Println(result)
}

这种方案支持:

  • 本地实时测试子仓库变更
  • 无需频繁提交推送
  • 保持版本控制完整性
  • 便于团队协作
回到顶部