Go:非本地包中的本地导入

时间:2015-06-17 07:34:27

标签: go

我有以下文件结构:

.
├── bin
│   └── hello
├── pkg
└── src
    └── jacob.uk.com
        ├── greeting
        │   └── greeting.go
        └── helloworld.go

5 directories, 3 files

使用以下GOPATH

/Users/clarkj84/Desktop/LearningGo

/usr/local/go/bin/go install jacob.uk.com文件夹中执行src后,我收到错误local import "./greeting" in non-local package

helloworld.go

package main;
import "./greeting"

func main() {

}

6 个答案:

答案 0 :(得分:34)

在为go install指定非本地包时,您无法使用本地导入。如果您希望本地导入有效,请先将工作目录更改为src/jacob.uk.com,然后执行go install(不指定包)。

当然,如果您提供helloworld.go,则会收到编译错误:imported and not used。但是一旦你使用导入的greeting包中的东西,它就应该编译。

但你根本不应该使用本地进口产品。而是写:

import "jacob.uk.com/greeting"

这样你就可以从任何地方编译/运行/安装它。

答案 1 :(得分:20)

键入go build不适用于相对导入路径;您必须输入go build main.go

go install根本不适用于相对导入路径。

记录于https://golang.org/cmd/go/#hdr-Relative_import_paths

解释。

答案 2 :(得分:3)

您可以在go 1.11中使用replace添加本地软件包。 转到go.mod并使用“ replace”关键字,如下所示(您无需创建github存储库,只需添加以下行即可)

module github.com/yourAccount/yourModule

go 1.15

require (
    github.com/cosmtrek/air v1.21.2 // indirect
    github.com/creack/pty v1.1.11 // indirect
    github.com/fatih/color v1.9.0 // indirect
    github.com/imdario/mergo v0.3.11 // indirect
    github.com/julienschmidt/httprouter v1.3.0
    github.com/mattn/go-colorable v0.1.7 // indirect
    github.com/pelletier/go-toml v1.8.0 // indirect
    go.uber.org/zap v1.15.0
    golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a // indirect
)

replace (
    github.com/yourAccount/yourModule/localFolder =>"./yourModule/localFolder"
    github.com/yourAccount/yourModule/localFolder =>"./yourModule/localFolder"
)

然后在您的main.go =>

import (
    alog "github.com/yourAccount/yourModule/localFolder"
    slog "github.com/yourAccount/yourModule/localFolder"
)

答案 3 :(得分:0)

可能有几处错误。我将提供以下设置。

检查您的GOPATH环境变量

GOPATH变量定义您的工作空间。如果键入“ go env”,则可以轻松识别当前值。

如果在Windows下安装Go,则会在安装过程中自动设置GOPATH环境变量。尽管如此:可能不是您首选的默认路径。您可以根据需要安全地将此变量设置为目标目录。

要在Windows中更改环境变量,请点击此处:https://www.architectryan.com/2018/08/31/how-to-change-environment-variables-on-windows-10/

检查工作区布局

如果您已确定工作空间应驻留在何处并设置GOPATH环境变量,则应在工作空间内创建三个文件夹:

src,pkg,bin

文件夹“ src”是源代码所在的目录。 “ pkg”包括外部进口。 “ bin”包含已编译的源。

示例项目

工作空间中的布局:

<workspace directory>
--> src
    --> oopexpertutil
        --> x.go
    --> y.go
--> pkg
    --> ...
--> bin
    --> ...

文件“ x.go”

package oopexpertutil

func checkMe(e error) {
    if e != nil {
        panic(e)
    }
}

文件“ y.go”

package main

import (
    "fmt"
    "io/ioutil"
    "oopexpertutil"
)

func main() {

    var data string = "Hello World!"
    var dataAsBytes = []byte(data)

    fmt.Println(data)

    err := ioutil.WriteFile("hello_world.txt", dataAsBytes, 0644)

    fmt.Println(err)

    oopexpertutil.checkMe(err)

}

失望...

此设置仍然无法使用。您可能已经尝试了所有其他坚持工作区或程序包布局或“转到模块”主题的答案。要完成这项工作的最后一点是:

将引用包的“ checkMe”功能的名称更改为“ CheckMe”并更新用法...

Go有一些约定,可从软件包 未导出函数 中识别 导出函数 >以大写字母开头 。

答案 4 :(得分:-1)

您可以使用供应商功能绕过此功能 将import "./greeting"更改为import "greeting"
创建供应商目录mkdir vendor并创建符号链接ln -s ../greeting vendor/greeting

答案 5 :(得分:-1)

如果您只想在单独的文件而不是单独的程序包之间共享代码,请按以下步骤操作:

您不需要import,只需将源文件放在相同的目录中,并在每个文件的顶部指定相同的package名称,然后就可以访问所有文件。公开(大写)函数和类型,方法是直接引用它们,即SomeFunction()而不是somepackage.SomeFunction()