菜单

构建系统

相关源文件

本文档介绍了 go-ethereum 项目的构建系统,包括如何从源代码构建、CI 流水线、发布流程和打包机制。构建系统旨在支持多种平台、架构和构建配置,使开发人员能够为各种部署场景编译代码库。

概述

Go Ethereum 构建系统主要使用 Go 的原生构建工具,并结合自定义构建脚本来自动化复杂任务。构建系统支持:

  • 所有项目可执行文件的源代码编译
  • 多平台和多架构的交叉编译
  • 持续集成和测试
  • 发布打包(存档、安装程序、Docker 镜像)
  • 开发工具管理

来源:build/ci.go42-176 Makefile1-57 .travis.yml1-115 appveyor.yml1-59

构建工具和依赖项

核心构建工具

go-ethereum 项目主要依赖以下构建工具:

  • Go 编译器:最低要求版本为 1.23
  • C 编译器:某些特定于平台的优化需要
  • make:提供方便的构建目标

开发中可能需要额外的工具:

  • protoc:Protocol Buffers 编译器
  • solc:Solidity 编译器
  • gencodec:Go 代码生成器

来源:README.md16-26 build/ci.go179-227 Makefile41-48

安装依赖项

Makefile 中的 devtools 目标会安装所需的开发工具。

make devtools

这会安装 stringergencodecabigen 等工具,这些工具在构建过程中用于代码生成。

来源:Makefile41-48

基础构建命令

使用 Makefile

Makefile 提供了常用构建操作的便捷目标:

目标描述
make geth仅构建 geth 可执行文件
make all构建所有包和可执行文件
make test运行测试套件
make lint运行 Linter
make fmt格式化代码
make clean清理构建产物

来源:Makefile5-37

直接构建命令

您也可以直接使用 Go 命令:

go run build/ci.go install ./cmd/geth

这会执行 build/ci.go 中的构建脚本来构建和安装 geth 可执行文件。

来源:build/ci.go140-176

构建配置

构建标志

构建系统支持各种标志来控制二进制文件的构建方式。

来源:build/ci.go230-268

构建标签

构建系统使用多个构建标签来控制功能的包含。

  • urfave_cli_no_docs:禁用 CLI markdown 文档生成
  • ckzg:启用与 CKZG 加密库的链接
  • integrationtests:启用集成测试

来源:build/ci.go197-202 build/ci.go300-306

交叉编译

构建系统支持为不同的目标架构和操作系统进行编译。

支持的平台

  • Linux:amd64, 386, arm, arm64, mips, mips64, ppc64, riscv64
  • Windows:amd64, 386, arm64
  • macOS:amd64, arm64
  • FreeBSD, OpenBSD, NetBSD 等

可以通过指定目标架构进行交叉编译。

go run build/ci.go install --arch arm64 --cc aarch64-linux-gnu-gcc ./cmd/geth

来源:build/ci.go179-227 .travis.yml36-57

持续集成

go-ethereum 项目使用多种 CI 系统来确保代码质量和构建可靠性。

Travis CI

Travis CI 用于:

  • 在 Linux 上构建和测试
  • 针对各种架构的交叉编译
  • 创建和上传发行包
  • 构建和推送 Docker 镜像

来源:.travis.yml1-115

AppVeyor

AppVeyor 用于:

  • 在 Windows 上构建和测试
  • 针对不同 Windows 架构的交叉编译
  • 创建 Windows 安装程序

来源:appveyor.yml1-59

发布管理

发行打包

构建系统可以创建多种类型的发行包:

  1. 存档文件 (zip, tar.gz)
  2. Debian 包
  3. Windows 安装程序 (NSIS)
  4. Docker 镜像

来源:build/ci.go563-601 build/ci.go739-781

签名发布

发行包使用以下方式进行签名:

  • 用于存档和 Debian 包的 PGP 签名
  • 用于额外验证的 Signify 签名

当存在包含签名密钥的适当环境变量时,签名过程会在 CI 构建过程中自动进行。

来源:build/ci.go617-632

Docker支持

go-ethereum 项目提供了 Docker 镜像作为替代部署方法。

Docker 镜像构建

Docker 镜像分两个阶段构建:

  1. 使用 Go 编译器的构建阶段
  2. 具有最少依赖项的部署阶段

Dockerfile 定义了此过程,并且生成的镜像仅包含 geth 可执行文件和必要的证书。

来源: Dockerfile1-34 Dockerfile.alltools1-33

多架构 Docker 镜像

构建系统支持为多种架构创建 Docker 镜像

  • linux/amd64
  • linux/arm64
  • linux/riscv64

这些镜像在 CI 过程中构建并推送到 Docker Hub。

来源: .travis.yml22

高级主题

测试

构建系统包含全面的测试能力

go run build/ci.go test [packages]

测试功能包括

  • 自动下载测试夹具
  • 运行带竞态检测的测试
  • 测量代码覆盖率
  • 运行集成测试

来源: build/ci.go274-329 .golangci.yml1-16

代码检查和质量

构建系统集成代码质量检查,以维护代码质量

go run build/ci.go lint

这会运行 golangci-lint 并使用项目特定的配置。

来源: build/ci.go429-471 .golangci.yml1-16

创世区块配置

为了初始化区块链,构建系统包含了处理创世区块创建和验证的工具

geth init [genesis.json]

此命令使用指定的创世配置初始化一个新区块链。

来源: cmd/geth/chaincmd.go206-256 core/genesis.go279-370

构建输出

构建过程产生以下主要输出

输出描述
geth主要的以太坊客户端可执行文件
abigen合约绑定生成器
clef外部签名工具
evmEVM 执行工具
rlpdumpRLP 数据格式解码器

所有可执行文件默认放置在 build/bin 目录中。

来源: build/ci.go66-81 README.md36-45

环境变量

构建系统响应多个环境变量

可变目的
GOPATHGo 工作区路径
GOROOTGo 安装路径
CC要使用的 C 编译器
GOOS目标操作系统
GOARCH目标架构
CGO_ENABLED启用/禁用 cgo
AZURE_BLOBSTORE_TOKEN上传到 Azure 的令牌

来源: build/ci.go188-193 build/env.go

结论

go-ethereum 构建系统提供了一套全面的工具,用于构建、测试和打包以太坊客户端。它支持各种平台和架构,可在广泛的环境中进行开发和部署。无论您是开发代码库还是构建生产环境,该构建系统都提供了有效处理 go-ethereum 项目所需的灵活性和功能。