我想建立一个几乎没有语言绑定的库,其中之一就是golang。将所有内容都放在一个存储库中是有意义的,因为例如可以在它们之间共享测试数据。但是我不确定如何组织它。我尝试过的是
+ $ tree .
.
└── go
├── go.mod
└── foo.go
1 directory, 2 files
+ $ cat go/go.mod
module github.com/bar/foo/go
go 1.13
+ $ cat go/foo.go
package foo
func Foo() int {
return 1;
}
然后我尝试使用它
+:( $ cat test.go
package main
import (
"github.com/bar/foo/go"
)
func main() {
fmt.Println(foo.Foo())
}
但是失败了
+ $ go run ./test.go
go: finding github.com/bar/foo latest
build command-line-arguments: cannot load github.com/bar/foo/go: module github.com/bar/foo@latest (v0.0.0-20191019071519-05aedbdfa600) found, but does not contain package github.com/bar/foo/go
我刚接触过golang,所以有人可以建议这样的项目通常是如何组织的吗?
答案 0 :(得分:2)
首先,在大多数情况下,以编程语言命名软件包是个坏主意。包裹实际上是做什么的?请记住,文档和程序包的布局应针对用户进行优化。
对于多部分项目,我个人倾向于建立一个名为foo
的新组织,并为第一部分(例如用Java编写的服务器)创建一个bar
回购。通过https://github.com/foo/bar。接下来,对于用Go编写的客户端,您需要设置下一个仓库,然后可以通过https://github.com/foo/baz-您的go模块进行访问。
最后但并非最不重要的一点是,您可以拥有一个“分发”存储库,该存储库将组织的项目通过CI管道放置,以确保互操作性。
这种方法有很多优点,恕我直言:您使用户更容易探索生态系统,存储库变得足够独立,同时仍被组织捆绑在一起,单个存储库变得更小。