在Go中构建和引用我自己的本地包

时间:2012-05-02 15:22:32

标签: compilation package go

我正在玩Google Go,我很开心(!),但我在使用包子系统时遇到了一些问题。

我在Mac OS X Lion上运行 Go 1.0.1 。我还构建了各种单个文件程序而没有任何问题(我还使用html / templates构建一个小的webapp而没有任何问题,它编译并运行时没有任何错误。)

我已经定义了一个“可重用”的包(even.go):

package even

func Even(i int) bool {
    return i % 2 == 0
}

func Odd(i int) bool {
    return i % 2 == 1
}

和消费者计划(useeven.go):

package main

import (
    "./even"
    "fmt"
)

func main() {
    a := 5
    b := 6

    fmt.Printf("%d is even %v?\n", a, even.Even(a))
    fmt.Printf("%d is odd %v?\n", b, even.Odd(b))
}

但是当我使用

编译“库”时
go build even.go

我什么都没有......没有错误,没有消息......会发生什么?

我该怎么做?

4 个答案:

答案 0 :(得分:11)

你的问题的答案,“我该怎么做?”在How to Write Go Code.中解释了这是非常重要的东西,值得一看。

go build的行为可能看起来令人费解,但实际上对于命令行程序来说是常规的 -​​ 没有输出意味着程序成功运行。那它做了什么?为此,您的答案在go help build

  

...否则build会编译包但丢弃结果,   仅用作检查包装是否可以构建。

什么,你想要更多?当然。 “如何编写Go代码”解释了这样做的好方法。为了快速修复程序,我将解释go命令期望每个包和每个可执行程序都在一个单独的目录中。如果你只是在useeven.go的位置下创建一个名为even的目录,并将even.go移动到它,那么go run useeven.go应该就像你拥有它一样。

答案 1 :(得分:3)

go build仅在构建"单个主包时生成输出文件"。如果要为其他包输出文件,则应使用go install。这将构建并将该软件包安装到您的pkgs目录。

答案 2 :(得分:0)

此处未生成输出的原因是因为您正在运行

go build even.go
package 中的

命令,而不是 main go文件中的

命令。在软件包上执行此操作将检查软件包上的错误,但是由于它不是带有输出的主文件,因此不会生成成功消息。如果软件包的内容有问题,将显示错误,否则,如果编译良好将没有输出

相反,您应该运行:

go build useeven.go

要创建二进制文件,然后执行二进制文件并从程序中获取输出:

./useeven

答案 3 :(得分:0)

如OP的评论中所述,将go build放在其自己的文件夹go run useeven.go中之后,even.go./even/even.go可以正常工作。 ./(在导入中)中有一些 Go magic 变魔术),它可以自动构建“本地软件包”版本,而无需将其安装在任何地方。

useeven/
├── even
│   └── even.go
└── useeven.go

如果您想在没有魔术./的情况下完成这项工作,则需要安装该库。为项目执行此工作的一种快捷方法(冒着污染库名称空间的风险)是使用这样的符号链接简单地注册库的源位置(在此示例中,GOPATH是{ {1}}):

~/go

现在,在构建程序时,它会自动执行[ useeven ] $ ln -s $(pwd)/even ~/go/src 以安装库的最新版本。

请注意,这无法使go get even *在图书馆工作,而只是使此工作变得不必要。


如果您不着急的话,还有更多惯用的方法:How to import local packages in go?