发布包
写好的代码可以发布成包,让别人用 tianjia 安装。包体放在 GitHub 的 release 附件里,cpro 的包索引只登记下载地址和校验值。
准备
发布者与包名
包的全名是 发布者/包名。发布者就是 GitHub 仓库所有者的用户名,例如仓库 github.com/bill-mark/shuxue 的发布者是 bill-mark。
发布者:
- 3 到 39 个字符,只能是小写字母、数字、
.、- - 首尾不能是
.或-,不能有连续的..
包名:
- 必须和 GitHub 仓库名相同,例如仓库
github.com/bill-mark/shuxue的包名是shuxue。仓库名带大写字母时,包名写成对应的小写 - 一个仓库只发布一个包
- 1 到 64 个字符,小写字母开头,只能包含小写字母、数字、
-、_,不以-或_结尾 - 不能是保留名:
conprnauxnulcom1–com9lpt1–lpt9cprobiaozhunceshibaoguanfangfabuzhefabuzhe_xinxi
第一次发布时会记下发布者和仓库对应的 GitHub 账号。之后账号对不上会被拒绝,所以删掉仓库再重建,只能换一个新包名。
cpro.json
包就是一个普通的 cpro 项目,cpro.json 里多写几个字段:
{
"mingzi": "shuxue",
"fabuzhe": "bill-mark",
"baoming": "shuxue",
"banben": "0.1.4",
"cpro": "26.10.1",
"cangku": "https://github.com/bill-mark/shuxue",
"xuke": "MIT",
"rukou": "src/rukou.cp",
"yilai": {}
}| 字段 | 必填 | 说明 |
|---|---|---|
mingzi | 是 | 本地开发、编译时用的项目名,别人安装时不读 |
fabuzhe | 是 | 发布者,必须和 GitHub 仓库所有者一致 |
baoming | 是 | 包名,必须和 GitHub 仓库名相同 |
banben | 是 | 版本号,三段数字,如 1.0.0 |
rukou | 是 | 入口文件,别人导入的就是这个文件里 daochu 的函数 |
yilai | 是 | 你的包自己用到的其他包 |
cangku | 是 | 本包所在的仓库地址,形如 https://github.com/发布者/包名,必须和发布用的附件是同一个仓库 |
cpro | 否 | 最低 cpro 版本。用了新版本才有的功能时记得调高 |
xuke | 否 | 许可证,如 MIT、Apache-2.0 |
以上面的 cpro.json 为例,fabuzhe、baoming、cangku 三处要对得上同一个仓库:
| 仓库 | fabuzhe | baoming | cangku |
|---|---|---|---|
github.com/bill-mark/shuxue | bill-mark | shuxue | https://github.com/bill-mark/shuxue |
入口文件就是公开 API
别人只能导入入口文件里 daochu 的函数,包里的其他文件外面碰不到,可以随意重构:
// src/rukou.cp
daoru { jia_impl } laizi "./neibu.cp"
daochu hs int_jia(a z64, b z64) z64 {
fanhui jia_impl(a, b)
}// src/rukou.cp
导入 { jia_impl } 来自 "./neibu.cp"
导出 函数 int_jia(a i64, b i64) i64 {
返回 jia_impl(a, b)
}// src/rukou.cp
import { jia_impl } from "./neibu.cp"
export fn int_jia(a i64, b i64) i64 {
return jia_impl(a, b)
}打包
可以自己手动把当前项目打包成.tar.gz文件,也可以参考下面的打包命令.
在包的根目录(cpro.json 所在目录)执行:
tar -czf ../shuxue.tar.gz --exclude=./.git --exclude=./.gitignore --exclude=./cpro_bao --exclude=./mubiao .会在上一级目录生成 shuxue.tar.gz。.git、安装的依赖 cpro_bao/ 和编译产物 mubiao/ 不需要打进包里。
cpro.json 必须在压缩包根部
不要多套一层目录:解压后应该直接看到 cpro.json 和 src/。按上面的命令在包根目录执行就是对的。
上传到 GitHub
- 在 GitHub 仓库里新建一个 release(打上 tag,如
0.1.4) - 把
shuxue.tar.gz作为附件(asset)上传 - 复制附件的下载地址,形如:
https://github.com/bill-mark/shuxue/releases/download/0.1.4/shuxue.tar.gz不要用 GitHub 自动生成的源码压缩包
release 页面自带的 "Source code (tar.gz)" 每次下载内容可能不同,会被拒收。必须用自己上传的附件。
发布
把附件地址提交给注册服务:
把下面的示例包线上地址换成你的github生成的包地址
curl -X POST https://api.cpro-lang.com/fabu \
-H 'Content-Type: application/json' \
-d '{"url":"https://github.com/bill-mark/shuxue/releases/download/0.1.4/shuxue.tar.gz"}'curl -X POST https://api.cpro-lang.com/fabu -H "Content-Type: application/json" -d "{\"url\":\"https://github.com/bill-mark/shuxue/releases/download/0.1.4/shuxue.tar.gz\"}"服务端会下载包体、读取 cpro.json、计算校验值并写入索引。成功后,别人就可以:
cpro tianjia bill-mark/shuxue@0.1.4版本规则
- 版本号发布后不能修改,也不能删除。改了内容就发一个新版本号
- 版本号是三段非负整数,不能有前导零,不能带
-beta这类后缀 - 建议的递增方式:
- 改了公开函数的签名、删了公开函数、改变了行为 → 第一段 +1
- 新增了公开函数,原有的都不变 → 第二段 +1
- 只修 bug 或改内部实现 → 第三段 +1
写包的注意事项
用到的包都要写进自己的 yilai。即使某个包碰巧已经装在磁盘上,没有声明也不能导入。
包只能导入自己目录里的文件。不能用相对路径读包外面的文件,否则这个包到了别人的项目里就用不了。
模块级变量每个版本各有一份。用户的程序里可能同时装着你的包的两个版本,它们的模块级变量互不相通。不要假设"整个程序里只有一个我"。
