我在完成一件应该很容易的任务时遇到了麻烦。我了解GitHub模型的代码组织(即库的repo和应用程序的repo,消耗的库)。我觉得这太棒了。但是我发现我经常希望mylib
与一个简单的可执行文件捆绑在一个main.go
文件中。main.go
应为package main
,并导入mylib
。换句话说,它应该是一个关于如何构建一个使用这个库的应用程序的确切文档。
我的观点是,因为提供一个简单的命令行接口来包装你的库通常是足够方便的,所以应该有一种简单的方法来做到这一点,而不必制作另一个repo,而golang应该会有所帮助。
我想要以下内容:
$GOPATH/src/github.com/me/mylib
mylib.go
mylib_also.go
main.go
其中mylib
是库(package mylib
), main.go
是package main
,运行go install
生成bin/mylib
和pkg/mylib.a
。
main.go
应该导入"github.com/me/mylib"
(如果我现在这样做,我得到循环导入错误)或go
会理解发生了什么,因为这个功能应该是内置的,而一个main.go
在repo中生成exec。可能需要导入(并去掉循环错误)是更好的方法。
现在,我必须做
$GOPATH/src/github.com/me/mylib
mylib/
mylib.go
main.go
所以我必须导入github.com/me/mylib/mylib,这是荒谬的
总而言之,go install
应该允许包和main的特殊情况,main导入包并提供一个简单的cli来演示包的API。GitHub模型支持两个仓库,但在一个仓库中完成简单的命令应该很容易!
每个文件夹不能有多个包。Go在包级操作,而不是文件级。
在这种情况下,使用库的二进制文件的约定是使用包main创建一个cmd
文件夹-即按照https://github.com/bradfitz/camlistore/tree/master/cmd或https://github.com/boltdb/bolt
在你的例子中,这将是:
$GOPATH/src/github.com/me/mylib
mylib/
mylib.go
README.md
cmd/
your-lib-tool/
main.go
如果你只是想要一个方便的小包装器,只是一些命令行接口到你的库用于演示目的,如果主程序不是建立在go get
上(而不是在简单的go build
和go install
期间),但你可以通过go run main.go
运行它或手动构建它,例如与6g
:只需使用构建标签(参见http://golang.org/pkg/go/build/#hdr-Build_Constraints) main.go:
// +build ignore