我使用过GOPATH,但对于目前我面临的这个问题,它没有帮助。我希望能够创建特定于项目的包:

myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go

我尝试了多种方法,但我怎么得到package1 ?在二进制中工作。Go或者binary2。等等?

例如;我希望能够导入“package1”,然后能够运行去构建binary1。go,一切正常工作,而不会抛出在GOROOT或GOPATH上找不到包的错误。我需要这种功能的原因是大型项目;我不想引用多个其他包或将它们保存在一个大文件中。


当前回答

要向项目中添加“本地”包,请添加一个文件夹(例如“package_name”)。然后把你的实现文件放到那个文件夹里。

src/github.com/GithubUser/myproject/
 ├── main.go
 └───package_name
       └── whatever_name1.go
       └── whatever_name2.go

在你的包main中这样做:

import "github.com/GithubUser/myproject/package_name"

其中package_name是文件夹名,它必须与whatever_name1文件中使用的包名匹配。Go和whatever_name . Go。换句话说,带有子目录的所有文件应该属于同一个包。

只要在导入中指定父文件夹的整个路径,就可以进一步嵌套更多子目录。

其他回答

要向项目中添加“本地”包,请添加一个文件夹(例如“package_name”)。然后把你的实现文件放到那个文件夹里。

src/github.com/GithubUser/myproject/
 ├── main.go
 └───package_name
       └── whatever_name1.go
       └── whatever_name2.go

在你的包main中这样做:

import "github.com/GithubUser/myproject/package_name"

其中package_name是文件夹名,它必须与whatever_name1文件中使用的包名匹配。Go和whatever_name . Go。换句话说,带有子目录的所有文件应该属于同一个包。

只要在导入中指定父文件夹的整个路径,就可以进一步嵌套更多子目录。

你可以使用replace

go mod init example.com/my/foo

foo / go.mod

module example.com/my/foo

go 1.14

replace example.com/my/bar => /path/to/bar

require example.com/my/bar v1.0.0

foo / main.go

package main
import "example.com/bar"

func main() {
    bar.MyFunc()
}

酒吧/ go.mod

module github.com/my/bar

go 1.14

酒吧/ fn.go

package github.com/my/bar

import "fmt"

func MyFunc() {
    fmt.Printf("hello")
}

导入本地包就像导入外部包一样

除了在里面走。Mod文件将外部包名称替换为本地文件夹。

文件夹的路径可以是完整的或相对的/path/to/bar或../bar

https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/

Run:

go mod init yellow

然后创建一个文件yellow.go:

package yellow

func Mix(s string) string {
   return s + "Yellow"
}

然后创建一个文件orange/orange.go:

package main
import "yellow"

func main() {
   s := yellow.Mix("Red")
   println(s)
}

然后构建:

go build

https://golang.org/doc/code.html

在bash终端中

mkdir <module name>  
cd <module name>  
go mod init <module name>  
touch <module name>.go

在<模块名>.go中创建go包

cd ..  
mkdir main  
cd main  
go mod init main  
touch main.go

创建导入<模块名>的主包

go mod edit -replace=<module name>=<module path>
go mod tidy

看看每一个动作。Mod,如果你想了解go的后台发生了什么 你的文件夹结构如下所示:

- Project  
  - <module name>  
    - <module name>.go  
    - go.mod  
  - main  
    - main.go  
    - go.mod  
go run .

OR

go build && 
./main.exe

我有一个类似的问题,我目前使用的解决方案使用Go 1.11模块。我有如下结构

- projects
  - go.mod
  - go.sum
  - project1
    - main.go
  - project2
    - main.go
  - package1
    - lib.go
  - package2
    - lib.go

我能够从project1和project2导入package1和package2

import (
    "projects/package1"
    "projects/package2"
)

运行go mod init项目后。我可以使用从project1和project2目录构建或者我可以使用build -o project1/exe project1/*。从项目目录。

这种方法的缺点是你所有的项目最终都会在go.mod中共享相同的依赖项列表。我仍在寻找这个问题的解决方案,但它看起来可能是根本性的。