跳到主要内容

社区扩展

把扩展注册进 duckdb/community-extensions,就把 「从 GitHub Release 下载一个文件」变成了:

INSTALL duckfn_quantstats FROM community; -- 只需一次,需要网络
LOAD duckfn_quantstats;

社区构建带签名、并且与用户的 DuckDB 版本匹配,所以不再需要 -unsigned。注册本身是一个 PR, 往仓库里加两个文件:

本仓社区仓
community-extension/description.ymlextensions/duckfn_quantstats/description.yml
community-extension/docs/function_descriptions.csvextensions/duckfn_quantstats/docs/function_descriptions.csv

目录名必须与 extension.name 逐字相同 —— 社区仓的 scripts/build.py 会检查这一点。

注册完成之后,下载就变成一句 SQL:

CSV​

社区扩展页那张 Added Functions 表里,函数的描述、注释与示例只有一个来源,就是这份 CSV: DuckDB 的 C 扩展 API 没法设置它们。文本来自 #[duck_*] 属性的 description / comment / example, 所以它紧挨着被描述的函数:

#[duck_aggregate_function(
description = "Renders one quantstats HTML report per symbol from a long table of periodic returns",
comment = "…",
examples = ["SELECT unnest(qs_html_reports(…)) FROM daily_returns", "…"]
)]

这些属性一改就重新生成并拷过去:

just docs_csv
cp target/function_descriptions.csv community-extension/docs/function_descriptions.csv

多条示例导出时用 "; " 拼接、去掉结尾分号;换行会压成空格,因为目标是 Markdown 表格。照「一句一条完整 SQL」写,一律英文。完整说明见函数描述。

description.yml​

这个文件会被原样复制到社区仓,所以里面只有字段、没有注释。需要拿主意的字段:

字段填什么
extension.nameduckfn_quantstats,与目录名、入口符号一致。
extension.description一行说明,展示在扩展列表里。
extension.version已发布的版本号,不带 -dev.N 后缀。
extension.language / buildRust 与 cargo。
extension.licenseMIT(仓库的 LICENSE)。注意社区文档页把它写成 licence,真正的 schema 是 license。
extension.requires_toolchains"rust;python3" —— 与 CI 工作流传给 extra_toolchains 的值一致。
extension.maintainers你的 GitHub 账号。
repo.githubshijianjs/duckfn-quantstats。
repo.ref该发布版本对应的提交 SHA(40 位)—— git rev-list -n 1 v0.1.0 —— 不是 main,也不是 tag 名。注册指向不可变的代码,从分支构建出来的东西会自称开发版本。
docs.hello_world一个可运行示例,会被渲染成代码块。不要在这里写 INSTALL / LOAD:页面自己会加。
docs.extended_description函数表周围的说明文字。

community-extension/AGENTS.md 里对每个字段的来历与提交步骤有更详细的说明。

提交​

# 1. 在你 fork 的 duckdb/community-extensions 克隆里
git checkout -b add-duckfn-quantstats

# 2. 把两个文件放到位
mkdir -p extensions/duckfn_quantstats/docs
cp <本仓>/community-extension/description.yml extensions/duckfn_quantstats/
cp <本仓>/community-extension/docs/function_descriptions.csv extensions/duckfn_quantstats/docs/

# 3. 提交、推送、开 PR
git add extensions/duckfn_quantstats
git commit -m "Add duckfn_quantstats: …"
gh pr create --repo duckdb/community-extensions --base main --head <你>:add-duckfn-quantstats

维护者会跑构建工作流(首次贡献者的运行会显示为 action_required,等有人批准 —— 这是正常的)。 合并之后 INSTALL duckfn_quantstats FROM community 就能用了。

让它跟上发版​

repo.ref 与 extension.version 都钉在某一次发布上。每次发版之后,在本仓的 community-extension/ 里把这两个都更新,拷进社区仓,推到同一个 PR 分支(或者新开一个)。just release_bump 已经会改写 version 字段;提交 SHA 那一段要人工填。