我有一个提供库(导出一些func)的项目,还必须提供一个命令行界面(必须有一个可执行文件)。
目录结构示例:
whatever.io/
myproject/
main.go
myproject.go
go编译器需要包main 和 func main 才能开始执行。我的库需要包myproject ,我把它放在上面。当我构建另一个试图导入myproject的项目时,这就是go工具所说的内容:
main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject
所以我相信没有办法做到这一点。
我应该将库或CLI移动到另一个包吗?
答案 0 :(得分:18)
只需将您的包移到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$
有用的链接:
答案 1 :(得分:16)
每个目录不能有两个包,因此错误。所以@Larry Battle的解决方案是将你的myproject.go
移动到一个新目录。
Go代码必须保存在工作区内。工作空间是目录 从根开始有三个目录的层次结构:
src包含组织到包中的Go源文件(每个目录一个包),
pkg包含包对象,
bin包含可执行命令。
答案 2 :(得分:2)
在大多数情况下,否。但是,单元测试例外。
在1个目录(mypackage
)中有2个不同的程序包(mypackage_test
和mypackage
)。编译器不会对此抱怨。
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...
两个软件包必须具有以下名称:
_test
。 _test
包中文件的名称必须以_test.go
如果您收到found packages "foo" and "bar"
这样的令人困惑的编译器错误,则说明您可能违反了其中一个或多个规则。
答案 3 :(得分:1)
在一个目录中不能有两个包含两个软件包的golang文件。因此,您需要将1x3
从y
中移出。
移动前的目录结构
11x1
移动后
main.go
您需要更改myproject
的导入路径。如果模块名称为whatever.io/
go.mod
myproject/
main.go
myproject.go
之前
whatever.io/
go.mod
main.go
myproject/
myproject.go
需要对此进行更改
main.go