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

Build 我可以有一个库和一个同名的二进制文件吗?,build,go,Build,Go,我正在构建一个库,但我也希望它可以作为一个独立的二进制文件使用 例如,假设我正在构建Tar的一个实现。Tar通常用作命令,但也可以用作库。直觉上,我会这样做: src/ tar/ tar.go # belongs to package tar main.go # imports tar and provides a main function 但这似乎不起作用。从中可以看出,“命令”应该与库有一个单独的名称。将此处给出的示例与此示例相适应,我有以下目录结

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

例如,假设我正在构建Tar的一个实现。Tar通常用作命令,但也可以用作库。直觉上,我会这样做:

src/
    tar/
        tar.go # belongs to package tar
        main.go # imports tar and provides a main function
但这似乎不起作用。从中可以看出,“命令”应该与库有一个单独的名称。将此处给出的示例与此示例相适应,我有以下目录结构:

src/
    tar/
        tar.go # belongs to package tar
    tarbin/
        main.go # imports tar and provides a main function
但是,这将在
$GOPATH/bin
中创建名为
tarbin
的命令,而不是
tar
。我发现的解决方法是执行
go build-o$GOPATH/bin/tar
,但我感觉自己做错了什么。有更好的办法吗

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

我可能会这样做

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
当你安装github.com/you/tar/tar时,它会给你一个名为tar的二进制文件,当你安装github.com/you/tar时,它会给你一个名为
github.com/you/tar
的库

根据您认为哪个更重要,您可以交换库和二进制文件

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

将所有代码保存在一个树中可以让您从根目录执行
go install./…
以构建所有包和子包,这是一个优势<代码>进行测试| fmt./…也进行测试。(请注意,实际上是3点!)

除了“go build”将失败之外,因为二进制文件的名称与本地目录(“tar”)相同。在这种情况下,您必须使用“go build-o”。@Gravis我明白您的意思。然而,
go-install
是您构建二进制文件所要使用的东西-几乎不要使用
go-build
,因为它不会缓存构建。我将编辑响应以删除对
go build
的引用。