跳转到主要内容

介绍


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

在 Go 中,将源代码转换为二进制可执行文件的过程称为构建。构建此可执行文件后,它将不仅包含您的应用程序,还包含在目标平台上执行二进制文件所需的所有支持代码。这意味着 Go 二进制文件不需要系统依赖项(例如 Go 工具)在新系统上运行。将这些可执行文件放在您自己系统上的可执行文件路径中将允许您从系统上的任何位置运行该程序。这与将程序安装到系统上是一样的。

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

先决条件


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

  • 按照如何安装 Go 和设置本地编程环境设置的 Go 工作区。


第 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


您将收到以下输出:

Output
Hello, World!


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

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


Go 程序和库是围绕模块的核心概念构建的。模块包含有关程序使用的库以及要使用的这些库的版本的信息。

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

go mod init greeter


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

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

Go 将提示您运行 go mod tidy 以便在将来更改此模块的要求时更新它们。现在运行它不会有额外的效果。

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


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

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

go build


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

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

ls


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

Output
greeter  main.go  go.mod


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

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

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

./greeter


在 Windows 上,运行:

greeter.exe


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

Output
Hello, World!


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

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

第 4 步 — 更改二进制名称


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

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

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

go.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


您将收到以下输出:

Output
Hello, World!


您现在可以自定义可执行文件的名称以满足项目的需要,完成我们对如何在 Go 中构建二进制文件的调查。但是使用 go build,您仍然只能从当前目录运行二进制文件。为了在系统上的任何地方使用新构建的可执行文件,您可以使用 go install 安装它们。

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


到目前为止,在本文中,我们已经讨论了如何从 .go 源文件生成可执行二进制文件。这些可执行文件有助于分发、部署和测试,但它们还不能从其源目录之外执行。如果您想在 shell 脚本或其他工作流程中积极使用您的程序,这将是一个问题。为了使程序更易于使用,您可以将它们安装到您的系统中并从任何地方访问它们。

要了解这意味着什么,您将使用 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 的内容:

Output
greeter


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

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

cd $HOME


使用以下命令运行程序:

greeter


这将产生以下结果:

Output
Hello, World!


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

结论


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

现在您已经了解了 go build 的基础知识,您可以通过使用构建标签自定义 Go 二进制文件教程来探索如何制作模块化源代码,或者如何通过为不同的操作系统和架构构建 Go 应用程序来为不同的平台构建。如果您想了解有关 Go 编程语言的更多信息,请查看整个 How To Code in Go 系列。

文章链接