在Go中构建CLI应用程序/包

时间:2015-06-29 20:51:25

标签: go

我可能会错误地解决这个问题(我已经阅读了如何编写Go代码),但这是我想要实现的目标:我想写一个golang包,它也来了使用CLI,用户可以在自己的程序中使用该程序包,也可以使用我用它构建的CLI。

所以到目前为止我所拥有的是这种结构:

mypackage/
  -api/
    -account.go // package api
    -node.go    // package api
  -main.go // package main - this is where I want
           // the executable code to be that is put in the `bin` folder.

这是一个非常粗糙的文件结构,因为我刚开始这个项目,但这是我试图实现的,而不是构建一个包含可用代码的包,然后用我的CLI构建一个单独的repo。但是当我尝试运行main.go时,它会显示undefined: Accountaccount.go中的结构)。

我的代码内容现在并不重要,它非常基础,因为我只是想让代码运行起来。这就是我所拥有的。

account.go

package api

import (
    "io/ioutil"
    "net/http"
)

type Account struct {
    email         string
}

main.go

package main

import (
    "github.com/username/mypackage/api"
    "fmt"
)

func main() {
    a := Account{}

    fmt.Printf("%T", a)
}

如果这是完全不好的做法,我想我只会做2个回购,一个用CLI,另一个用我的实际包代码(再次,可以通过导入用于其他人的开发),但我'我真的很喜欢它是一个多功能的回购。

1 个答案:

答案 0 :(得分:3)

没有“单向”,但常见的方法是让您的顶级仓库成为您的库 - 即github.com/you/somelib,然后在其下面有一个cmd目录,其中包含您的CLI(包主电源) - 甚至可能有很多。

e.g。

yourlib/
    api.go
    api_test.go
    handler.go
    handler_test.go
    cmd/
        command-name/
            main.go // Builds a "command-name" binary
        other-command/
            main.go // Builds a "other-command" binary

您的CLI应用只是您图书馆的消费者。用户可以通过go get github.com/you/yourlib/...检索它,它会将lib和二进制文件安装到他们的GOPATH上。

Go source itselfCamlistoreBoltDB都使用此方法(在许多其他库中)。