我可能会错误地解决这个问题(我已经阅读了如何编写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: Account
(account.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,另一个用我的实际包代码(再次,可以通过导入用于其他人的开发),但我'我真的很喜欢它是一个多功能的回购。
答案 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 itself,Camlistore和BoltDB都使用此方法(在许多其他库中)。