我可以拥有一个同名的库和二进制文件吗?

时间:2013-01-11 18:25:12

标签: build go

我正在构建一个库,但我也希望它可以作为一个独立的二进制文件使用。

例如,假设我正在构建Tar的实现。 Tar通常用作命令,但也可以用作库。直观地说,我会做这样的事情:

src/
    tar/
        tar.go # belongs to package tar
        main.go # imports tar and provides a main function

这似乎不起作用。从documentation开始,“命令”似乎应该与库中有一个单独的名称。根据此示例调整示例,我有以下目录结构:

src/
    tar/
        tar.go # belongs to package tar
    tarbin/
        main.go # imports tar and provides a main function

但是,这会在tarbin中创建一个名为tar的命令,而不是$GOPATH/bin。我找到的解决方法是做go build -o $GOPATH/bin/tar tar,但我觉得我做的事情非常糟糕。还有更好的方法吗?

注意:我很清楚tar包含在标准库中,我只是以它为例。

1 个答案:

答案 0 :(得分:21)

我可能会这样做

src/
    tar/
        tar.go         # tar libary
        tar/
            main.go    # tar binary

这将为您提供名为tar的二进制文件和名为tar

的库

假设你在github上托管这个,那么你想要

src/
    github.com/
        you/
            tar/
                tar.go         # tar libary
                tar/
                    main.go    # tar binary

当你执行go get install github.com/you/tar/tar时会给你一个叫做tar的二进制文件,当你github.com/you/tar时会给你一个名为go get install github.com/you/tar的库

根据您认为哪个更重要,您可以通过

交换库和二进制文件
src/
    github.com/
        you/
            tar/
                main.go            # tar binary
                tar/
                    tar.go         # tar libary

将所有代码保存在一个树中使您可以从根目录go install ./...构建所有包和子包,这是一个优势。 go test|fmt ./...也是。 (注意,实际上是3个点!)