开放网络干扰观测站(OONI) 是一个非营利自由软件项目,旨在赋能去中心化的 努力,记录世界各地的互联网审查情况。
本仓库包含以下 Go 包:
ooniprobe 命令行客户端(cmd/ooniprobe);
测试辅助服务器(internal/cmd/oohelperd);
移动端库(pkg/oonimkall);
测量引擎库(internal);
miniooni 实验性命令行客户端(internal/cmd/miniooni)。
本仓库中的每个顶层目录都包含一个说明性的 README 文件。
请按照 ooni.org/install/cli 上的说明
安装适用于 Windows、macOS 和
Debian/Ubuntu 的 ooniprobe 预编译二进制文件。安装 ooniprobe 后,请参阅
用户指南。
我们使用滚动发布标签发布每日构建。这些
构建使用 master 分支的最新提交。
要为本仓库搭建开发环境,你需要 Go >= 1.15。
./script/go.bash 脚本会自动下载 GOVERSION 文件中提到的
预期 Go 版本(即
go1.27.3)并将其用于构建。
你也可以绕过 ./script/go.bash,使用
go build ... 手动构建 ooniprobe,但在这种情况下,请注意:
使用比 GOVERSION 中提到的版本更旧的版本 绝对不推荐,且_甚至可能无法编译_;
使用更新的版本_应该_能按预期实现核心功能, 但额外功能可能被禁用或无法按预期工作。
原因如下:我们依赖从标准库分叉出来的包;因此, 使用与分叉这些包时相同的 Go 版本更为稳健。
你还需要一个 C 编译器。在 Linux 和其他 Unix 系统上,GCC 和 Clang 都可以使用。如果你使用的是 Windows,我们建议在 Windows Subsystem for Linux 上安装 Ubuntu 或 Debian。如果你的目标平台是 Windows,还应该安装 mingw-w64 交叉编译器。
以下命令展示了如何使用 Debian 12(“bookworm”)搭建开发环境。同样的步骤也适用于 Ubuntu 22.04 LTS。
# install the compilers, git, and the root CA
sudo apt install golang build-essential ca-certificates git
# [optional] install mingw-w64 if you're targeting windows
sudo apt install mingw-w64
以下命令展示了如何使用 Fedora 搭建开发环境,前提是你的 Fedora 使用的 Go 版本 >= 1.15。
# install the compilers and git
sudo dnf install golang make gcc gcc-c++ git
# [optional] install mingw-w64 if you're targeting windows
sudo dnf install mingw64-gcc mingw64-gcc-c++
以下命令展示了如何在 macOS 上配置开发环境。我们假设你已经安装了 Homebrew,它应该也会安装 Xcode 命令行工具。
然后,你需要按照以下说明操作:
# install the compiler
brew install go
./script/go.bash 脚本./script/go.bash 脚本需要 Go >= 1.15,并自动安装和使用正确版本的 Go。按如下方式运行此脚本:
./script/go.bash build -v -ldflags '-s -w' ./internal/cmd/miniooni
等同于运行以下命令:
go install -v golang.org/dl/go1.27.3@latest
$HOME/go/bin/go1.27.3 download
export GOTOOLCHAIN=local
$HOME/sdk/go1.27.3/bin/go build -v -ldflags '-s -w' ./internal/cmd/miniooni
本节介绍如何使用 ./script/go.bash 进行构建。如果你想绕过该脚本,只需运行 go 而不是 ./script/go.bash。
你可以使用以下命令编译 ooniprobe:
./script/go.bash build -v -ldflags '-s -w' ./cmd/ooniprobe
此命令将在顶层目录中生成一个名为 ooniprobe 的精简二进制文件。
同样,你可以使用以下命令编译 miniooni:
./script/go.bash build -v -ldflags '-s -w' ./internal/cmd/miniooni
此命令将在顶层目录中生成一个名为 miniooni 的精简二进制文件。
并使用以下命令生成 oohelperd:
./script/go.bash build -v -ldflags '-s -w' ./internal/cmd/oohelperd
此命令将在顶层目录中生成一个名为 oohelperd 的剥离二进制文件。
ooniprobe 和 miniooni 二进制文件链接了一个由
ooniprobe-rs 构建的 Rust 静态库
(libuniffi_ooniprobe.a)。make CLI/* 目标通过 userauth 目标获取它,
该目标会运行 buildtool,并且默认从固定版本的 ooniprobe-rs 发布版下载预构建的包。
设置 USERAUTH_FROM_SOURCE=1 可改为从固定版本的
ooniprobe-rs 源码构建静态库,例如:
make USERAUTH_FROM_SOURCE=1 CLI/ooniprobe
从源码构建是我们在发布时采用的方式,因为预构建的 bundle 基于 glibc,无法链接到 musl 静态 Linux 构建或交叉编译的 Windows/darwin 构建中。预构建下载速度更快,是本地开发的合适默认选择。
请参阅 CONTRIBUTING.md。
SPDX-License-Identifier: GPL-3.0-or-later
我们使用 Makefile 构建发布版本,这需要 GNU make。运行
make help 查看详细用法。
另请参阅 CONTRIBUTING.md 中的相关章节。
移动库之所以是公开包,是出于技术原因。Go 移动工具需要
从公开包构建。然而,我们并不认为此类包中发生的 API 破坏性变更
足以提升我们的主版本号。对我们而言,移动
库只是实现 OONI Probe Android 和 OONI Probe iOS 的一种手段。我们
只有在更改 ./cmd/ooniprobe 的 CLI 时才会提升主版本号。