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

例如,假设我正在构建Tar的实现.tar通常用作命令,但也可以作为库使用.凭直觉,我会这样做:

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

不过,这似乎不管用.从documentation开始,似乎"命令"应该有一个与库不同的名称.将那里给出的示例改编为此示例,我有以下目录 struct :

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

但是,这会创建一个名为tarbin的命令,而不是$GOPATH/bin中的tar.我发现的解决办法是时速go build -o $GOPATH/bin/tar tar,但我感觉我做的事情大错特错.有没有更好的方法?

我很清楚标准库中包含了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

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

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

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

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

Go相关问答推荐

Go程序在并发Forking 循环中停留在syscall.Wait4

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

在不耗尽资源的情况下处理S3文件下载

在Uber FX中实现后台进程正常关闭的正确方式是什么?

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

关于如何使用 Service Weaver 设置多个不同侦听器的问题

Go 中将 int 切片转换为自定义 int 切片指针类型的函数

Kafka golang 生产者在错误后更改分区计数

Go 中的 Azure JWT 验证不起作用

当客户端同时是服务器时,需要什么 mTLS 证书?

具有两个参数的动态规划:天数和优惠券

使用 golang 生成 vim

通过环境变量配置 OTLP 导出器

此代码如何生成内存对齐切片?

try 运行 docker-compose up -d 时出现错误

Golang prometheus 显示自定义指标

如何正确为 Go 中的值设置多种类型?

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者

Golang 泛型

如何允许可转换为指针的泛型类型参数化另一种可转换为指针的泛型类型?