在Go中使用pkg目录有什么用?

dvs*_*gec 12 go

如果我们已经有可执行文件的bin目录那么pkg目录需要什么?请解释.

pet*_*rSO 11

pkg目录包含从src目录Go源代码包编译的Go包对象,然后在链接时使用它来在bin目录中创建完整的Go可执行二进制文件.

我们可以编译一次包,但将该对象链接到许多可执行文件中.例如,该fmt程序包几乎出现在每个Go程序中.它编译一次但链接了很多次,节省了很多.


kya*_*kya 11

~/go/pkg

如何编写Go代码,我们知道~/go/pkg可以存储第三方库。例如:

  1. 创建两个文件main.gogo.mod
//main.go
package main

import (
    "fmt"
    "github.com/google/go-cmp/cmp"
)

func main() {
    fmt.Println(cmp.Diff("Hello World", "Hello Go"))
}
Run Code Online (Sandbox Code Playgroud)
//go.mod
module example.com/user/hello

go 1.13
Run Code Online (Sandbox Code Playgroud)
  1. 安装第三方库
$ ls ~/go/pkg/mod/github.com/google/
...

$ go install example.com/user/hello
go: finding github.com/google/go-cmp v0.5.2
go: downloading github.com/google/go-cmp v0.5.2
go: extracting github.com/google/go-cmp v0.5.2

$ ls ~/go/pkg/mod/github.com/google/
... go-cmp@v0.5.2

$ ls ~/go/pkg/mod/github.com/google/go-cmp@v0.5.2
Run Code Online (Sandbox Code Playgroud)

然后,你会看到很多go文件,而不是编译文件。

$ ls ~/go/pkg/mod/github.com/google/go-cmp@v0.5.2/cmp/
...  example_test.go   options.go   ...
Run Code Online (Sandbox Code Playgroud)

pkg在用户项目中

pkg是用户项目的目录/包。您可以将其视为库,并且可以供外部应用程序使用。更多内容,您可以查看这里

  • 这是最完整的答案。另请参阅 https://github.com/golang-standards/project-layout。此存储库中有许多有用的链接,可以进一步解释 pkg 目录并提供示例,包括 pkg 的历史以及使用它的优点/缺点。 (4认同)

Muh*_*man 6

您将源代码放在src目录中,而pkg目录是保存实际源代码编译输出的目录。如果您使用多个库/包.a,每个库/包都会有不同的输出和扩展名,Alinker应负责将所有库/包链接和组合在一起,以在bin目录中生成一个最终可执行文件。

由于pkgbin更具体到您构建实际源代码的机器或操作系统,因此不建议共享它们,您的存储库应仅包含您的实际代码。

附带说明,如果您打算使用 docker 容器,则pkgdir 应该被忽略,因为我们可能会在windows例如将import/mount您的代码放入linux容器时构建源代码;这时候pkg会有编译后的文件只对windows