[英]Does it make sense to have two packages in the same directory?
我有一個項目,它提供了一個庫(導出一些函數)並且還必須提供一個命令行界面(必須有一個可執行文件)。
目錄結構示例:
whatever.io/
myproject/
main.go
myproject.go
go 編譯器需要包 main和func main才能開始執行。 我的圖書館需要myproject 包,我在上面放東西。 這是 go 工具在我構建另一個嘗試導入 myproject 的項目時所說的:
main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject
所以我相信沒有辦法做到這一點。
我應該將庫或 CLI 移動到另一個包嗎?
只需將您的包移動到 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$
有用的鏈接:
每個目錄不能有兩個包,因此會出現錯誤。 所以@Larry Battle 所說的解決方案將您的myproject.go
移動到一個新目錄。
Go 代碼必須保存在工作區中。 工作區是一個目錄層次結構,其根目錄包含三個目錄:
src 包含組織成包的 Go 源文件(每個目錄一個包),
pkg 包含包對象,以及
bin 包含可執行命令。
在大多數情況下,沒有。 但是,單元測試有一個例外。
這里有兩個不同的包( mypackage
和mypackage_test
在1個目錄() 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"
收到令人困惑的編譯器錯誤,則您可能違反了這些規則中的一個或多個。
一個目錄中不能有兩個 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.