在同一个目录中有两个包有意义吗?
Posted
技术标签:
【中文标题】在同一个目录中有两个包有意义吗?【英文标题】:Does it make sense to have two packages in the same directory? 【发布时间】:2013-12-24 00:57:27 【问题描述】:我有一个项目,它提供了一个库(导出一些函数),还必须提供一个命令行界面(必须有一个可执行文件)。
目录结构示例:
whatever.io/
myproject/
main.go
myproject.go
go 编译器需要 package main 和 func main 来开始执行。我的库需要 package myproject 我在上面放东西的地方。这是我在构建另一个尝试导入 myproject 的项目时 go 工具所说的:
main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject
所以我相信没有办法。
我应该将库或 CLI 移动到另一个包吗?
【问题讨论】:
【参考方案1】:只需将您的包移动到 main.go 同一目录中的新文件夹中。 记得从 $GOPATH 的引用中导入新包。
例子:
user@user:~/p/go/test/so-multipack$ ls -R
.:
a main.go
./a:
a.go
user@user:~/p/go/test/so-multipack$ cat main.go
package main
import (
"../so-multipack/a"
)
func main()
a.Hello()
user@user:~/p/go/test/so-multipack$ cat a/a.go
package a
import (
"fmt"
)
func Hello()
fmt.Println("hello from a")
user@user:~/p/go/test/so-multipack$ go run main.go
hello from a
user@user:~/p/go/test/so-multipack$ go build
user@user:~/p/go/test/so-multipack$ ls
a main.go so-multipack
user@user:~/p/go/test/so-multipack$
有用的链接:
go build vs go build file.go
【讨论】:
所以基本上是的,我应该移动它。谢谢。 @xrash,但请考虑将命令代码中的导入更改为whatever.io/myproject
——不要使用相对导入(例如,参见this discussion,以及它包含的指针)。
只有当每个包都在自己的目录中并且从 GOPATH 中引用时,相对路径才可以。否则go build
可能会失败。
听起来如此简单如此简单......但当你以某人的 .proto 文件为例并尝试构建 GO 文件时却不是这样:\【参考方案2】:
每个目录不能有两个包,因此会出现错误。所以@Larry Battle 的解决方案是把你的myproject.go
移动到一个新目录。
来自How to write go code
Go 代码必须保存在工作区中。工作区是一个目录 根目录下包含三个目录的层次结构:
src 包含组织成包的 Go 源文件(每个目录一个包),
pkg 包含包对象,并且
bin 包含可执行命令。
【讨论】:
有一个异常github.com/golang/go/blob/master/src/time/example_test.go 您引用的链接已删除声明“(每个目录一个包)” @yuxh:在概述部分“每个包都包含一个或多个 Go 源文件在一个目录中。”【参考方案3】:在大多数情况下,否。但是,单元测试有一个例外。
工作示例:
这里有 2 个不同的包(mypackage
和 mypackage_test
)在 1 个目录 (mypackage
) 中。编译器不会抱怨这个。
我的包文件夹:
mypackage/
foo.go
foo_test.go
mypackage/foo.go:
package mypackage
func Add(a int, b int) int
return a + b
mypackage/foo_test.go:
package mypackage_test
// Unit tests...
规则:
这 2 个包必须具有以下名称:
目录名称。 NameOfDirectory +_test
.
_test
包中的文件名必须以_test.go
结尾
如果您收到类似于 found packages "foo" and "bar"
的令人困惑的编译器错误,则您可能违反了这些规则中的一个或多个。
【讨论】:
unittest "package" 代码不会被编译成非unittest package 代码。所以不存在打包冲突。 但是 Go 测试说 - 要编写一个新的测试套件,请创建一个名称以 _test.go 结尾的文件,其中包含 ) 函数,如此处所述。将文件放在与被测试文件相同的包中。 @AananthK 文档有点过时了;它缺少一些关于_test
包成语的信息。这是github issue 讨论您引用的文档。
感谢@byxor 提供的信息【参考方案4】:
你不能在一个目录中有两个 golang 文件和两个包。所以你需要把main.go
移出myproject
。
移动前的目录结构
whatever.io/
go.mod
myproject/
main.go
myproject.go
移动后
>whatever.io/
go.mod
main.go
myproject/
myproject.go
您需要更改main.go
的导入路径。如果模块名是aaa
之前
import "aaa"
需要修改
import "aaa/myproject"
【讨论】:
以上是关于在同一个目录中有两个包有意义吗?的主要内容,如果未能解决你的问题,请参考以下文章