【问题标题】:Why can't I add a main to my library in golang?为什么我不能在 golang 中向我的库中添加 main?
【发布时间】:2014-10-08 17:26:52
【问题描述】:

我无法完成本应轻松的任务。我了解用于代码组织的 GitHub 模型(即库存储库和使用该库的应用程序存储库)。我认为这太棒了。但我经常发现我希望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.gopackage main,在运行 go install 时会生成 bin/mylibpkg/mylib.a

main.go 应该导入 "github.com/me/mylib"(如果我现在这样做,我会收到周期性导入错误)或 go 会理解正在发生的事情,因为应该内置此功能并且回购中的 main.go 生成执行官。可能需要导入(并删除循环错误)是更好的方法。

现在,我必须这样做

$GOPATH/src/github.com/me/mylib
    mylib/
        mylib.go
    main.go

所以我必须导入 github.com/me/mylib/mylib 这太荒谬了。

总之,go install 应该允许一个包的特殊情况和一个导入包并提供一个简单的 cli 来演示包 API 的 main。 GitHub模型推广了两个repos,不过简单的clis合二为一应该很容易吧!

【问题讨论】:

    标签: go package main code-organization


    【解决方案1】:

    每个文件夹不能有多个包。 Go 在包级别而不是文件级别上运行。

    在这种情况下的约定(使用您的库的二进制文件)是使用您的主包创建一个 cmd 文件夹 - 即按照 https://github.com/bradfitz/camlistore/tree/master/cmdhttps://github.com/boltdb/bolt

    在你的情况下,这将是:

    $GOPATH/src/github.com/me/mylib
        mylib/
          mylib.go
          README.md
          cmd/
            your-lib-tool/
              main.go
    

    【讨论】:

    • 这似乎正是我想要的。我之前尝试过使用main 而不是cmd,但是使用main/main.gomain/mylib.go 我得到了名为main 的二进制文件。我猜它需要降低两层?
    • package main 采用其所在文件夹的名称(默认情况下) - 如果需要,您可以只设置一个级别并将其命名为 yourlib-cli
    【解决方案2】:

    如果你只是想要一个方便的小包装器,只需要一些命令行接口到你的 lib 用于演示目的,如果主程序不是构建在 go get 上也没关系(而不是在简单的 go build 和 @987654324 @) 但是您可以通过go run main.go 运行它或手动构建它,例如with 6g:只需在 main.go 中使用构建标签(参见 http://golang.org/pkg/go/build/#hdr-Build_Constraints):

    // +build ignore
    

    而且您不需要其他文件夹或存储库。

    【讨论】:

    • 这会给我一个 $GOPATH/bin/mylib 吗?我希望能够通过一次安装即可获得所有内容
    • 没错。我想安装可执行文件。上面的解决方案可以解决。
    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多