首页
/ Ollama 开源贡献实战指南:从本地构建、Issue 分类到符合规范的 Pull Request

Ollama 开源贡献实战指南:从本地构建、Issue 分类到符合规范的 Pull Request

2026-09-04 15:21:30作者:凤尚柏Louis

本文基于 Ollama 仓库的 CONTRIBUTING.md 展开,系统梳理 Ollama 的完整贡献工作流:如何搭建本地开发环境并编译运行 Ollama、哪类 Issue 更容易被维护者接收、非平凡改动(non-trivial change)在提交 PR 前应如何提案、Commit Message 应遵循什么格式、测试与新增依赖有哪些硬性要求。读完本文,你可以在当前仓库状态下独立跑起 Ollama 开发环境,并按维护者的实际评审标准写出一次可被合入的 Pull Request。

本地开发环境:先跑起来,再谈贡献

CONTRIBUTING.md 的 "Set up" 章节将构建细节全部委托给 docs/development.md,因此贡献者的第一步是完整掌握该文档中的构建链路。仓库中面向 AI 助手的 AGENTS.md 也给出了同一份权威指引:

前置依赖

  • Go(当前 go.mod 声明 go 1.26.0
  • CMake 3.24 或更新版本(根目录 CMakeLists.txt 首行即为 cmake_minimum_required(VERSION 3.24)
  • C/C++ 编译器:macOS 使用 Clang,Windows 使用 Visual Studio 2022 C++ 工具,Linux 使用 GCC/Clang
  • 建议将 Ninja 加入 PATH,在 Windows 上尤其必要

两种构建路径

纯 Go 快速迭代:如果本机已经存在原生运行库(native payload),只改 Go 代码时可直接在仓库根目录执行:

go run . serve

完整原生构建(全新 checkout 或修改了原生代码后):

cmake -B build .
cmake --build build --parallel 8
./ollama serve

在 macOS arm64 上默认构建 Metal 推理后端,其他平台默认构建 CPU 推理。Go 二进制产出在仓库根目录,原生运行库 payload 安装到 build/lib/ollama。需要装入标准前缀目录时:

cmake --install build --prefix /path/to/install

[!NOTE] Ollama 包含通过 CGO 编译的原生代码。数据结构变更可能导致 CGO 不同步并引发意外崩溃,此时可先执行 go clean -cache 强制完整重建原生代码。

GPU 后端选择

除 macOS arm64 外,GPU 后端需要显式通过 CMake 变量指定:

cmake -B build . -DOLLAMA_LLAMA_BACKENDS="cuda_v13;vulkan"
cmake --build build --parallel 8

支持的取值:cuda_v12cuda_v13rocm_v7_1rocm_v7_2vulkancuda_jetpack5cuda_jetpack6。也可以用标准 CMake 架构变量收窄目标硬件,例如:

# CUDA
cmake -B build . -DOLLAMA_LLAMA_BACKENDS=cuda_v13 -DCMAKE_CUDA_ARCHITECTURES=native

# ROCm / HIP
cmake -B build . -DOLLAMA_LLAMA_BACKENDS=rocm_v7_2 -DCMAKE_HIP_ARCHITECTURES=gfx1100

调试时还可以透传 GGML_* 选项微调 GGML 编译,例如关闭 CUDA flash attention:

cmake -B build . -DOLLAMA_LLAMA_BACKENDS=cuda_v12 -DGGML_CUDA_FA=OFF

可选的 MLX 引擎(运行 safetensors 模型)通过 OLLAMA_MLX_BACKENDS 选择,如 cmake -B build . -DOLLAMA_MLX_BACKENDS=cuda_v13;本地 MLX/MLX-C 源码覆盖则用 OLLAMA_MLX_SOURCE / OLLAMA_MLX_C_SOURCE 环境变量。各平台的完整前置条件(Xcode Metal toolchain、Vulkan SDK、ROCm、cuDNN、OpenBLAS 等)以 docs/development.md 为准。Docker 构建为 docker build .,ROCm 变体为 docker build --build-arg FLAVOR=rocm .

哪些问题值得提:维护者的 Issue 分级

CONTRIBUTING.md 把 Issue 分成三个梯队,这实际上就是维护者优先级的公开声明。

理想 Issue(Ideal issues)

  • Bug:Ollama 停止工作或产生意外错误的场景。
  • Performance:让模型推理、下载或上传更快的方向。
  • Security:可能导致安全漏洞的问题。按 SECURITY.md 的约定,安全漏洞不得公开披露,应通过邮件(hello@ollama.com)私有报告,报告需包含漏洞描述、复现步骤、影响评估与可能的缓解措施。

评审较困难的 Issue(Harder to review)

  • 新功能:新增功能(如 API 字段、环境变量)会扩大 Ollama 的维护面,且未来无法在不破坏用户的前提下移除;
  • 大规模重构:有价值的代码改进,但评审与合入耗时更长;
  • 文档:补齐或纠错的小更新很有帮助,但大体量文档新增长期维护困难。

可能不会被接收的改动

  • 破坏 Ollama API(包括 OpenAI 兼容 API,其实现位于 middleware/openai.goopenai/openai.go)向后兼容性的变更;
  • 给用户体验带来明显摩擦的变更;
  • 给维护者留下大量未来维护负担的变更。

这三条红线解释了为什么 Ollama 对"顺手加的 API 字段"持保守态度——对本地推理服务端而言,API 一旦被下游工具依赖,就形成长期契约。

提案非平凡改动:先开 Issue,再开 PR

CONTRIBUTING.md 对 "non-trivial" 的定义很明确:不属于 bug fix 或小文档更新的一切改动。不确定是否算 non-trivial 时,先与维护者沟通。

在开非平凡 PR 之前,必须先开 Issue 讨论方案并获取维护者反馈。目的有二:让维护者理解改动上下文、判断其是否符合 Ollama 路线图;避免重复劳动,也避免你在一个最终不会被接收的改动上浪费时间。

提案写作要点(原文四条,建议逐条对照检查):

  1. 说明你要解决的问题,而不是你打算做什么;
  2. 说明这个改动为什么重要
  3. 说明这个改动将如何被使用
  4. 说明这个改动将如何被测试

加分项:直接附上改动若被接收后你预期会看到的草稿文档。

Pull Request 规范

Commit Message 格式

标题应遵循:

<package>: <short description>

其中 package 是受影响最大的 Go 包;不涉 Go 代码时改用目录名;根目录下单个知名文件的修改可以直接用文件名。描述部分以小写字母开头,且应能接在 "This changes Ollama to..." 之后构成完整句子。

文档给出的正反示例:

llm/backend/mlx: support the llama architecture
CONTRIBUTING: provide clarity on good commit messages, and bad

反面示例(不应模仿):

feat: add more emoji
fix: was not using famous web framework
chore: generify code

这条约定在当前仓库的提交历史中执行得非常一致,例如近期的真实提交:app: list account cloud models for Claudemlx: dedup dependency filesbuild: go depsdocs: correct typos found during code reviewproxy: continue requests when the model catalog changes——包名/目录名在前、小写描述在后,与上述规范完全吻合。

测试要求

PR 必须包含测试,并且测试行为,而非测试实现细节。在 Ollama 中这有两层含义:

单元测试:默认通过 go test ./... 运行,CI 在 test.yaml 中对 PR 触发(注意 !docs/** 被排除,纯文档改动不跑测试)。

集成测试integration/README.md 定义了端到端验证入口,默认在 go test ./... 中是禁用的,需要显式指定 build tag:

go test -tags=integration,fast -v -count 1 ./integration/
go test -tags=integration,release -v -count 1 -timeout 30m ./integration/
go test -tags=integration,library -v -count 1 -timeout 120m ./integration/
  • fast:快速的 runner/模型冒烟覆盖;
  • release:发布回归覆盖;
  • library:大范围库覆盖,约需 2.5 TiB 磁盘空间。

作用域配置分别位于 integration/reg_fast_test.gointegration/reg_release_test.gointegration/reg_library_test.go。运行约定:

  • Unix 上默认由测试自行在随机端口拉起服务器;Windows 上必须让服务器运行在 OLLAMA_HOST 上;
  • 设置 OLLAMA_TEST_EXISTING 为非空字符串后,测试会针对已有服务器(可经 OLLAMA_HOST 指向远端)运行;
  • OLLAMA_TEST_LOG_SERVER=1 可在每个测试后打印托管服务器日志,即使测试通过;
  • 本地运行前必须先在源码树顶层 go build .(如有 GPU 支持还需 cmake 构建),集成测试期望在树顶找到 ollama 二进制。

如果你在实现新模型架构,可以用 OLLAMA_TEST_MODEL 让套件直接针对你的模型验证:

go build .
OLLAMA_TEST_MODEL=mymodel go test -tags=integration,fast -v -count 1 ./integration/

代码风格与 Lint

仓库根目录的 .golangci.yaml 声明了 lint 基线:启用了 asasalintbidichkbodyclosemisspellnilerrwhitespacewastedassign 等检查器,并强制 gofmtgofumpt 格式化。提交 PR 前保持 go fmt/gofumpt 干净是隐含的合入前提。

新增依赖

CONTRIBUTING.md 要求克制地新增依赖:确有必要时,必须在 PR 中说明为什么需要它,以及你尝试过哪些无此依赖的替代方案但未成功。对照 go.mod 可以看到当前直接依赖面相当窄(gin、cobra、go-sqlite3、tree-sitter 等),维护者对依赖树的态度可见一斑。

求助渠道

CONTRIBUTING.md 原文中,Discord 服务器是官方求助渠道。需要注意其原文指向外部社区链接,本地仓库不包含该社区的信息;在提出环境类问题时,附上你的平台(macOS/Linux/Windows、架构)、CMake/Go 版本以及 docs/development.md 中对应平台章节的排查结果,能显著加快定位速度。

小结:贡献 Ollama 的自检清单

  1. 本地已能通过 cmake -B build . && cmake --build build --parallel 8 完成完整构建,或确认纯 Go 迭代场景下 go run . serve 可运行;
  2. Bug/性能/安全类问题按 SECURITY.md 规则分级处理,安全漏洞走私有邮件报告;
  3. 非平凡改动先开 Issue,按"问题—重要性—用法—测试"四要素提案,并附草稿文档;
  4. Commit 标题符合 <package>: <lowercase description> 且描述可接 "This changes Ollama to...";
  5. 变更包含行为级测试,Go 变更可通过 go test ./...,模型/引擎变更可通过对应 tag 的集成测试;
  6. 依赖新增有充分论证,代码通过 .golangci.yaml 声明的 lint 与 gofumpt 格式化。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388