Golang项目文件夹路径设置错误怎么办

Golang项目文件夹路径设置错误怎么办 你好,我在理解如何组织Go项目时遇到了一些困难。

我的项目构建两个二进制文件,一个客户端和一个服务器。它由以下部分组成:

  • 使用“mod”的公共包
  • 使用“mod”的私有包
  • 为两个二进制文件共有的函数准备的本地包。

我使用了这个文件夹结构:

git.company.com/my-project
  + go.mod
  + cmd
  |   + server
  |   |   + go-files / package main / import "git.company.com/my-project/local-package-1"
  |   + client
  |       + go-files / package main
  + local-package-1
  |   + go-files / package local-package-1
  + local-package-2
      + go-files / package local-package-2 / import "git.company.com/my-project/local-package-1"

go.mod 文件如下:

module git.company.com/my-project

go 1.14

// 下面这行似乎没有效果
replace git.company.com/my-project/ => ./

require (
    git.company.com/go-toolbox-1 v0.0.0-xxx-xxx
    git.company.com/go-toolbox-2 v0.0.0-xxx-xxx
    github.com/lib/pq v1.9.0
    github.com/mattn/go-sqlite3 v1.14.5
)

我这样构建:

cd cmd/server && GO111MODULE=on go build

这可以正常工作。

我可以从项目根目录这样更新模块:

go get -u github.com/lib/pq

这也可以正常工作。

但是我无法从项目根目录一次性更新所有依赖项:

go get -u
go get .: path /Users/xxx/git/my-project is not a package in module rooted at /Users/xxx/git/my-project

我想我遗漏了某些东西。我尝试去理解并模仿 https://github.com/golang-standards/project-layout,但没有成功。

请注意,除了 go get -u 之外,我可以构建我的工具,并且项目可以运行。

有人能帮助我吗?


更多关于Golang项目文件夹路径设置错误怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang项目文件夹路径设置错误怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的项目结构是正确的,主要问题在于 go get -u 命令的使用方式。在 Go 模块项目中,go get -u 需要指定具体的包路径或模块路径,不能直接在根目录无参数运行。

以下是解决方案和示例:

1. 修复 go get -u 问题

在项目根目录运行以下命令之一:

// 更新所有依赖项
go get -u ./...

// 或更新特定模块
go get -u git.company.com/go-toolbox-1
go get -u github.com/lib/pq

2. 移除无效的 replace 指令

你的 go.mod 中的 replace 指令有问题,应该移除或修正:

module git.company.com/my-project

go 1.14

// 移除这行,或者如果需要本地替换,使用正确格式:
// replace git.company.com/my-project => ./local-package-1

require (
    git.company.com/go-toolbox-1 v0.0.0-xxx-xxx
    git.company.com/go-toolbox-2 v0.0.0-xxx-xxx
    github.com/lib/pq v1.9.0
    github.com/mattn/go-sqlite3 v1.14.5
)

3. 完整的项目结构示例

git.company.com/my-project/
├── go.mod
├── go.sum
├── cmd/
│   ├── server/
│   │   ├── main.go
│   │   └── server.go
│   └── client/
│       ├── main.go
│       └── client.go
├── internal/
│   ├── pkg1/
│   │   ├── pkg1.go
│   │   └── pkg1_test.go
│   └── pkg2/
│       ├── pkg2.go
│       └── pkg2_test.go
├── pkg/
│   ├── local-package-1/
│   │   ├── module1.go
│   │   └── module1_test.go
│   └── local-package-2/
│       ├── module2.go
│       └── module2_test.go
└── scripts/
    └── build.sh

4. 构建命令示例

// 从项目根目录构建所有
go build ./cmd/...

// 构建特定二进制
go build -o bin/server ./cmd/server
go build -o bin/client ./cmd/client

// 安装到 $GOPATH/bin
go install ./cmd/...

5. 导入示例

cmd/server/main.go:

package main

import (
    "git.company.com/my-project/pkg/local-package-1"
    "git.company.com/my-project/pkg/local-package-2"
    "git.company.com/my-project/internal/pkg1"
)

func main() {
    local_package_1.Function1()
    local_package_2.Function2()
    pkg1.InternalFunction()
}

pkg/local-package-1/module1.go:

package local_package_1

import "fmt"

func Function1() {
    fmt.Println("Function from local-package-1")
}

6. 依赖管理命令

// 查看所有依赖
go list -m all

// 整理 go.mod 文件
go mod tidy

// 下载所有依赖
go mod download

// 验证依赖完整性
go mod verify

你的项目结构基本正确,主要问题是 go get -u 命令的使用方式。使用 go get -u ./... 可以更新所有依赖项。

回到顶部