Golang:安装目录错误?

21

我遇到了以下错误:

go install: no install location for directory /Users/xwilly/Dropbox/go/project/src outside GOPATH 

我正在使用OS X操作系统下的Go版本1.1。

我可以构建和运行程序,但无法安装包。

我的开发环境:

GOPATH=/Users/xwilly/Dropbox/go/project
PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/go/bin:/Users/xwilly/Dropbox/go/project/bin

项目树:

/Users/xwilly/Dropbox/go/project
bin
pkg
src

我可以无错误地构建:

..:src xwilly$ go build test.go 
..:src xwilly$ go install test.go
go install: no install location for directory /Users/xwilly/Dropbox/go/project/src outside GOPATH

这是一个简单的例子:

xwilly$ cat test.go 
package main

import (
    "fmt"
)

func main() {
    fmt.Println("Bonjour")
}
xwilly$ go run test.go 
Bonjour
xwilly$ go install test.go 
go install: no install location for directory /Users/xwilly/Dropbox/go/project/src/learning outside GOPATH

test.go文件中的包名是什么? - thwd
包名为 => package main - Xwilly
你不能安装 package main。请阅读 How to Write Go Code - thwd
2
@Tom:你可以使用go install命令安装package main。这是Go命令的安装方式。 - peterSO
有趣,我不知道 :) - thwd
1个回答

32

go 命令

GOPATH 环境变量

GOPATH 中列出的每个目录都必须遵循一定的结构:

src/ 目录存放源代码。路径中 src 下方的内容决定了导入路径或可执行文件名。

pkg/ 目录存放已安装的包对象。与 Go 树相同,每个目标操作系统和架构对应一个 pkg 的子目录(pkg/GOOS_GOARCH)。

如果 DIR 是在 GOPATH 中列出的目录,则其下的源代码目录为 DIR/src/foo/bar 的包可以作为 "foo/bar" 导入,并且编译后的形式将被安装到 "DIR/pkg/GOOS_GOARCH/foo/bar.a" 中。

bin/ 目录存放编译后的命令。每个命令的名称取自其源代码目录,但只保留最后一级,不包括整个路径。即 DIR/src/foo/quux 中的命令会被安装到 DIR/bin/quux 而不是 DIR/bin/foo/quux。因此,您可以将 DIR/bin 添加到 PATH 中,以便访问已安装的命令。如果设置了 GOBIN 环境变量,则命令将安装到指定的目录中,而不是 DIR/bin

下面是一个示例目录布局:

GOPATH=/home/user/gocode

/home/user/gocode/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)
您的目录结构不正确。您试图安装一个命令(package main),它应该在以您的命令命名的源代码目录中。请参阅上面的quux命令。
在您的情况下,假设您的命令将被命名为billy
$ mkdir -p /Users/xwilly/Dropbox/go/project/src/billy

这个目录在你的GOPATH下面。将你的test.go文件移动到这个目录中。运行

$ go install billy

除非您已经设置了GOBIN,否则命令billy应该被安装在

/Users/xwilly/Dropbox/go/project/bin

应该位于您的GOPATH内部的目录,该目录应该在您的PATH中。


1
+1 感谢您的出色解释。我在文档中错过了 gobin 部分。 - Rippo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接