【问题标题】: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 mainfunc 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 移动到另一个包吗?

【问题讨论】:

    标签: go package


    【解决方案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 包含可执行命令。

    【讨论】:

    【解决方案3】:

    在大多数情况下,。但是,单元测试有一个例外

    工作示例:

    这里有 2 个不同的包(mypackagemypackage_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...
    

    规则:

    1. 这 2 个包必须具有以下名称:

      • 目录名称。
      • NameOfDirectory + _test.
    2. _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"
    

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      相关资源
      最近更新 更多