本地使用Golang项目的技巧与指南

本地使用Golang项目的技巧与指南 (我是Go语言新手)

如果我不想使用 go get 来安装库,而是想将代码库克隆到本地使用,我需要怎么做? 我的 GOPATH 是 /home/reik/go

仅仅将克隆的代码库放到 /home/reik/go 目录下,然后进入 /home/reik/go/hep/(hep是代码库名称)并执行 go build 是行不通的。

[reik@reik-msi hep]$ go build
can't load package: package hep: code in directory /home/reik/go/src/hep expects import "go-hep.org/x/hep"

使用 go get 也不行:

[reik@reik-msi hep]$ go get
go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src;
	ignoring go.mod;
	see 'go help modules'
can't load package: package hep: code in directory /home/reik/go/src/hep expects import "go-hep.org/x/hep"

查看 go-hep.org/x/hep 这个导入路径,这是否意味着这个库无法在本地构建?


更多关于本地使用Golang项目的技巧与指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

在传统方式中,您可以将克隆的代码库放置在 /your_project_name/vendor 目录下。

更多关于本地使用Golang项目的技巧与指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,虽然可能是相同的,但最好保持清晰。也许项目的名称应该与其他包的名称不同。在我看来,没有理由让两个不同的东西使用相同的名称。

是的,你可以这样做。但如果你想在项目中使用自定义版本的 hep,正如所指出的那样,采用供应商模式可能是个不错的选择。

// 代码示例保留原文

Pratyush_Das:

GOPATH/src/go-hep.org/x/hep/vendor/hep

是的,你应该有这样的路径结构 GOPATH/src/your_project_name/vendor/other_package_name

在你的示例中,your_project_nameother_package_name 能否相同?我的意思是……它们实际上是同一个包。your_project_name 是通过 go-get 安装的,而 other_package_name 是本地保存的同一个包。

codekid:

你好,你没有尝试将代码库克隆到 $GOPATH,而是试了

=> go get go-hep.org/x/hep

这会将包下载到 /home/reik/go/src

但这是否意味着我可以通过 go get 安装后修改源代码并重新构建?

你好,与其将代码库克隆到 $GOPATH 目录,你是否尝试过:

=> go get go-hep.org/x/hep

这将把软件包下载到 /home/reik/go/src 目录

请查看错误信息中的这一行:can't load package: package hep: code in directory /home/reik/go/src/hep

这表明程序正在你的 $GOPATH 的 src 目录中寻找 hep 包。

那么…/your_project_name/vendor/ 是否必须放在我的 GOPATH 中?

例如在这种情况下, 核心包位于 GOPATH/src/go-hep.org/x/hep,那么包含我本地修改的包是否应该放在 GOPATH/src/go-hep.org/x/hep/vendor/hep

codekid:

是的,你可以。

在包的根目录下使用 go build 命令吗?在这个例子中就是 GOPATH/src/go-hep.org/x/hep

根据你的描述,问题在于代码库的导入路径与实际目录结构不匹配。当你在本地克隆代码库时,需要确保目录结构符合Go的导入路径规范。

在你的情况下,go-hep.org/x/hep 这个导入路径意味着代码应该位于 $GOPATH/src/go-hep.org/x/hep 目录下。

以下是解决方案:

正确的目录结构

将代码库克隆到正确的路径:

# 创建正确的目录结构
mkdir -p /home/reik/go/src/go-hep.org/x

# 进入目录
cd /home/reik/go/src/go-hep.org/x

# 克隆代码库
git clone https://github.com/go-hep/hep.git hep

或者直接克隆到正确位置:

cd /home/reik/go/src
mkdir -p go-hep.org/x
cd go-hep.org/x
git clone https://github.com/go-hep/hep.git

构建代码

现在进入正确的目录构建:

cd /home/reik/go/src/go-hep.org/x/hep
go build

使用Go Modules(推荐方案)

更好的方法是启用Go Modules,这样就不需要依赖GOPATH:

# 在任何目录启用Go Modules
export GO111MODULE=on

# 创建新目录并初始化模块
mkdir myproject
cd myproject
go mod init myproject

# 然后你可以直接使用go get
go get go-hep.org/x/hep

或者在现有项目中:

# 在项目根目录初始化模块
go mod init your-project-name
go mod tidy

验证导入

创建一个测试文件验证导入是否正常工作:

// main.go
package main

import (
    "fmt"
    "go-hep.org/x/hep/fit"
)

func main() {
    fmt.Println("HEP library imported successfully")
    // 使用库中的功能
    _ = fit.NewCurve1D(nil)
}

然后构建:

go build main.go

关键点是确保目录结构匹配导入路径。对于 go-hep.org/x/hep,目录必须是 $GOPATH/src/go-hep.org/x/hep 或者使用Go Modules来管理依赖。

回到顶部