「源码包不用传,GitHub 自己会生成」,这句话对一半。github发布开源项目的时候,tag 一打、Release 一发,下载区立刻多出 Source code (zip) 和 Source code (tar.gz) 两个链接,你确实一根手指都不用动。不少人看到这俩链接就觉得活儿干完了,可下载的人解压出一堆源码,构建脚本跑到一半报错,回头在 issue 里问「安装包在哪」。所以 Release 附件是另一码事,那是你自己打包、自己上传、自己负责的东西,出了问题没人替你兜。

github发布开源项目,这两种包面向的不是同一批人
一类人想直接拿来用。他可能连命令行都不熟,看到 README 第一行写着「需要 Node 18、Python 3.11、CMake」就把页面关了,他要的是双击能跑的东西。另一类人正相反,他要看你那块边界条件是怎么处理的,要改成自己业务里能用的版本,甚至要拿代码去过一遍安全审计。前一种人你给他源码包,等于让他自己买菜做饭;后一种人你只给二进制,他会怀疑你在藏东西。
自动生成的源码包,坑在几个看不见的地方
最常被忽略的是 submodule。GitHub 打的那个 zip 是 tag 提交点的快照,子模块目录里空空如也,只留一个 .gitmodules 声明。用 git clone 的人跑一句 git submodule update –init 就补上了,下 zip 的人补不了,编译直接挂。
第二是 Git LFS。大文件在快照里只剩几百字节的指针文本,看着像个损坏文件。第三是行尾符和权限位,用 Windows 上那些第三方解压工具处理 tar.gz,可执行位经常丢。还有解压出来的目录名,一般是「项目名-tag名」这种形式,有些人的脚本里把路径写死了,一升级版本号全废。
什么时候必须自己传构建产物
判断标准挺简单:你的用户里有多少人不会编译。桌面软件、客户端、命令行工具,基本都得给二进制。尤其 C、C++ 这类需要一整套系统库的项目,Windows 上光凑齐编译环境就能劝退大部分人。
还有一种情况是交叉编译。Go 写的工具丢进 GitHub Actions 跑一遍,产出 linux-amd64、darwin-arm64、windows-amd64 几个包,加起来几十兆,挂上去以后用户少踩多少坑。这个投入产出比高得有点离谱。
反过来说,如果你的项目就是个几十行的脚本,或者纯前端库,就别费劲打包了。发到 npm、PyPI、Maven 这些地方去,Release 页留着写更新说明就行。别在一个本该放说明的位置堆上一堆重复的压缩包。
有人非要把源码自己再打一份传上去
行是行,但得清楚自己在干什么。用 git archive 打出来的那份和自动生成的没有本质区别,多占一份存储,还多一个可能过期的副本。除非你在打包的时候顺手塞进了编译好的前端静态文件——有些 PHP 项目就是这么干的,把 assets 目录一起塞进去,用户下完丢到虚拟主机上就能跑。这种属于有意为之,和稀里糊涂传两份不是一回事。
Release 正文别只写一句 bug 修复
见过太多项目的更新说明就一行「fix bugs」。这对搜索引擎没什么用,对用户更没什么用。至少得写清楚三件事:这版改了什么、有没有破坏性变更、升级要不要跑迁移脚本。破坏性变更那段单独拎出来加粗,别藏在第三行里等人自己发现。
校验和跟签名,比多传一个安装包更值
附件挂上去之后补一个 SHA256SUMS 文件,就那么几行命令的事。用户下完比对一下,能排掉下载链路被劫持、或者镜像站同步了半截文件这类情况。有条件再做 GPG 签名,公钥指纹写在 README 里,参数别照抄博客上的老文章,以官方文档为准。
Windows 和 macOS 的二进制现在还有系统签名这道门槛,没签名的会被拦下来,这个成本对个人项目来说不低,量力而行。
README 和 Release 页要互相指一下
Release 入口在仓库页面右边那一栏,位置不算显眼,第一次来的人经常找不到。README 开头放一句「点这里下载」,直接链到 releases 页面;反过来 Release 的说明里把安装步骤和 README 的对应章节点一下。这两处互相引一下,比你多传三个压缩包管用。
版本号在三处得对得上
tag 叫 v1.2.0,Release 标题写 1.2.0,附件文件名里又是 1.2,用户看一眼就晕。建议统一:tag 一律带 v 前缀,文件名用「项目名-1.2.0-linux-amd64.tar.gz」这种格式,不要空格不要中文,免得下载下来解压乱码。
有些东西不该往 Release 里塞
密钥、配置文件、内部测试数据、还有每次 CI 跑出来都长得不一样的产物。前几样不用解释。最后一样踩的人多:不同时间构建两次,产物哈希对不上,用户没法校验,你自己也没法复现。真要做到可复现构建,得把时间戳、绝对路径这些变量固定住,这事急不来,先把校验和发出来更实际。
顺序大概是这样:先确认 LICENSE 和 README 里把安装方式写明白了,然后打 tag、建 Release、把更新说明写清楚,再按目标平台决定传不传二进制,最后补校验和文件。至于页面上那两个自动生成的源码链接,不用管,它一直在。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!