Go 项目结构以在单个存储库中生成具有相同名称的库和 cli

如何设置项目结构以在单个存储库中生成具有相同名称的库和 cli?


假设我的项目名称是project. 我想使它可以使用名称导入, 并在安装时 project具有名称的可执行二进制文件。我目前的设置是这样的:projectgo get


host.com/project/

    project/

        main.go

    core/

        project.go

然后,当安装时:


go get host.com/project/project

它安装project为可执行文件,core作为依赖项。在 core/project.go文件中,包有这个:


package project

问题是它是通过以下方式导入的:


import (

    "host.com/project/core"

)

project它作为名称空间导出,不core违反 go 的约定。我怎样才能做到这一点?


翻阅古今
浏览 91回答 1
1回答

ibeautiful

这不是惯例,您可以随心所欲地做,但通常的做法是cmd在项目根目录中有一个文件夹,所有可执行文件都在该文件夹下,每个文件夹都是自己的文件夹。因此,在您的情况下,一个好的解决方案可能很简单:host.com/project/    cmd/        project/            project.go    filea.go    fileb.go在filea.go和fileb.go包声明应该是:package project在cmd/project/project.go包和导入声明中应该是:package mainimport "host.com/project"当然如果你的项目比较复杂,你可以在项目根目录下创建更多的包,它可能有多个命令(多个main包),例如:host.com/project/    cmd/        project/            project.go        prjtool/            prjtool.go    packagex/        x.go    packagey/        y.go    filea.go    fileb.go遵循此布局的示例是非常流行的 Go Delve 调试器(目前 4.5k 星),可在https://github.com/derekparker/delve获得。一个非常复杂的存储库示例是golang.org/x/tools包,它是多个基本 Go 工具的集合,可在https://github.com/golang/tools/获得。它的cmd文件夹包含 20 多个子文件夹(命令),许多工具(main包)甚至由多个.go文件组成(但每个文件都使用package main声明,形成一个可执行文件的包)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go