如何构建和安装Go程序

来自菜鸟教程
跳转至:导航、​搜索

介绍

到目前为止,在我们的 如何在 Go 系列中编写代码 中,您已经使用命令 go run 自动编译您的源代码并运行生成的可执行文件。 尽管此命令对于在命令行上测试您的代码很有用,但分发或部署您的应用程序需要您将代码构建为可共享的 二进制可执行文件 ,或包含可以运行您的应用程序的机器字节码的单个文件. 为此,您可以使用 Go 工具链 buildinstall 您的程序。

在 Go 中,将源代码转换为二进制可执行文件的过程称为 building。 构建此可执行文件后,它将不仅包含您的应用程序,还包含在目标平台上执行二进制文件所需的所有支持代码。 This means that a Go binary does not need system dependencies such as Go tooling to run on a new system. 将这些可执行文件放在您自己系统上的可执行文件路径中将允许您从系统上的任何位置运行该程序。 This is the same thing as installing the program onto your system.

在本教程中,您将使用 Go 工具链来运行、构建和安装示例 Hello, World! 程序,让您能够有效地使用、分发和部署未来的应用程序。

先决条件

要遵循本文中的示例,您将需要:

第 1 步 — 设置和运行 Go 二进制文件

首先,创建一个应用程序以用作演示 Go 工具链的示例。 为此,您将使用经典的“Hello, World!” 如何在 Go 教程中编写您的第一个程序。

src 目录中创建一个名为 greeter 的目录:

mkdir greeter

接下来,进入新创建的目录并在您选择的文本编辑器中创建 main.go 文件:

cd greeter
nano main.go

打开文件后,添加以下内容:

src/greeter/main.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

该程序运行时会在控制台打印出短语Hello, World!,然后程序将成功退出。

保存并退出文件。

要测试程序,请使用 go run 命令,就像您在之前的教程中所做的那样:

go run main.go

您将收到以下输出:

OutputHello, World!

如前所述,go run 命令将您的源文件构建为可执行二进制文件,然后运行编译后的程序。 但是,本教程旨在以您可以随意共享和分发的方式构建二进制文件。 为此,您将在下一步中使用 go build 命令。

第 2 步——创建一个 Go 模块来构建一个 Go 二进制文件

Go programs and libraries are built around the core concept of a module. A module contains information about the libraries that are used by your program and what versions of those libraries to use.

为了告诉 Go 这是一个 Go 模块,您需要 使用 go mod 命令创建一个 Go 模块

go mod init greeter

这将创建文件 go.mod,其中将包含模块的名称以及用于构建它的 Go 版本。

Outputgo: creating new go.mod: module greeter
go: to add module requirements and sums:
    go mod tidy

Go will prompt you to run go mod tidy in order to update this module’s requirements if they change in the future. Running it now will have no additional effect.

第 3 步 — 使用 go build 构建 Go 二进制文件

使用 go build,您可以为我们的示例 Go 应用程序生成可执行二进制文件,允许您将程序分发和部署到您想要的位置。

main.go 试试这个。 在您的 greeter 目录中,运行以下命令:

go build

如果您不为该命令提供参数,go build 将自动编译您当前目录下的 main.go 程序。 该命令将包含目录中的所有 *.go 文件。 它还将构建能够在具有相同系统架构的任何计算机上执行二进制文件所需的所有支持代码,无论该系统是否具有 .go 源文件,甚至是 Go 安装。

在这种情况下,您将 greeter 应用程序构建到一个可执行文件中,该文件已添加到当前目录。 通过运行 ls 命令检查这一点:

ls

如果您运行的是 macOS 或 Linux,您会发现一个新的可执行文件,该文件以您构建程序的目录命名:

Outputgreeter  main.go  go.mod

注意: 在 Windows 上,您的可执行文件将是 greeter.exe


默认情况下 go build 将为当前 平台和架构 生成可执行文件。 例如,如果构建在 linux/386 系统上,可执行文件将与任何其他 linux/386 系统兼容,即使没有安装 Go。 Go 支持为其他平台和架构构建,您可以在我们的 为不同的操作系统和架构构建 Go 应用程序 文章中了解更多信息。

现在,您已经创建了可执行文件,运行它以确保正确构建了二进制文件。 在 macOS 或 Linux 上,运行以下命令:

./greeter

在 Windows 上,运行:

greeter.exe

二进制文件的输出将与您使用 go run 运行程序时的输出相匹配:

OutputHello, World!

现在您已经创建了一个可执行二进制文件,其中不仅包含您的程序,还包含运行该二进制文件所需的所有系统代码。 您现在可以将此程序分发到新系统或将其部署到服务器,因为您知道该文件将始终运行相同的程序。

在下一节中,本教程将解释如何命名二进制文件以及如何更改它,以便您可以更好地控制程序的构建过程。

第 4 步 — 更改二进制名称

现在您已经知道如何生成可执行文件,下一步是确定 Go 如何为二进制文件选择名称并为您的项目自定义此名称。

当您运行 go build 时,Go 默认会自动决定生成的可执行文件的名称。 它通过使用您之前创建的模块来完成此操作。 当运行 go mod init greeter 命令时,它创建了名为“greeter”的模块,这就是生成的二进制文件依次命名为 greeter 的原因。

让我们仔细看看模块方法。 如果您的项目中有一个 go.mod 文件,其中有一个 module 声明,如下所示:

去.mod

module github.com/sammy/shark

然后生成的可执行文件的默认名称将是 shark

在需要特定命名约定的更复杂的程序中,这些默认值并不总是命名二进制文件的最佳选择。 在这些情况下,最好使用 -o 标志自定义您的输出。

要对此进行测试,请将您在上一节中创建的可执行文件的名称更改为 hello,并将其放在名为 bin 的子文件夹中。 您不必创建此文件夹; Go 将在构建过程中自行完成。

使用 -o 标志运行以下 go build 命令:

go build -o bin/hello

-o 标志使 Go 将命令的输出与您选择的任何参数相匹配。 在这种情况下,结果是一个名为 hello 的新可执行文件位于名为 bin 的子文件夹中。

要测试新的可执行文件,请切换到新目录并运行二进制文件:

cd bin
./hello

您将收到以下输出:

OutputHello, World!

您现在可以自定义可执行文件的名称以满足项目的需要,完成我们对如何在 Go 中构建二进制文件的调查。 但是使用 go build,您仍然只能从当前目录运行二进制文件。 In order to use newly built executables from anywhere on your system, you can install them using go install.

第 5 步 — 使用 go install 安装 Go 程序

到目前为止,在本文中,我们已经讨论了如何从我们的 .go 源文件生成可执行二进制文件。 这些可执行文件有助于分发、部署和测试,但它们还不能从其源目录之外执行。 This would be a problem if you wanted to actively use your program in shell scripts or in other workflows. 为了使程序更易于使用,您可以将它们安装到您的系统中并从任何地方访问它们。

要理解这意味着什么,您将使用 go install 命令来安装您的示例应用程序。

go install 命令的行为几乎与 go build 相同,但不是将可执行文件留在当前目录或 -o 标志指定的目录中,而是将可执行文件放入$GOPATH/bin 目录。

要查找 $GOPATH 目录所在的位置,请运行以下命令:

go env GOPATH

您收到的输出会有所不同,但默认是 $HOME 目录中的 go 目录:

Output$HOME/go

由于 go install 会将生成的可执行文件放入名为 bin$GOPATH 的子目录中,因此必须将此目录添加到 $PATH 环境变量中。 这在先决条件文章 如何安装 Go 和设置本地编程环境创建 Go 工作区 步骤中有所介绍。

设置 $GOPATH/bin 目录后,移回 greeter 目录:

cd ..

现在运行安装命令:

go install

这将构建您的二进制文件并将其放置在 $GOPATH/bin 中。 要对此进行测试,请运行以下命令:

ls $GOPATH/bin

这将列出 $GOPATH/bin 的内容:

Outputgreeter

注意: go install 命令 支持 -o 标志,因此它将使用前面描述的默认名称来命名可执行文件。


安装二进制文件后,测试程序是否会从其源目录之外运行。 移回您的主目录:

cd $HOME

使用以下命令运行程序:

greeter

这将产生以下结果:

OutputHello, World!

现在您可以将您编写的程序安装到您的系统中,让您可以随时随地使用它们。

结论

在本教程中,您演示了 Go 工具链如何使从源代码构建可执行二进制文件变得容易。 这些二进制文件可以分发到其他系统上运行,甚至是那些没有 Go 工具和环境的系统。 您还使用 go install 自动构建和安装我们的程序作为系统的 $PATH 中的可执行文件。 使用 go buildgo install,您现在可以随意共享和使用您的应用程序。

现在你已经了解了 go build 的基础知识,你可以通过 Customizing Go Binaries with Build Tags 教程探索如何制作模块化源代码,或者如何使用 为不同平台构建为不同的操作系统和架构构建 Go 应用程序。 如果您想全面了解 Go 编程语言的更多信息,请查看整个 Go 编程语言系列