Skip to content

发布包 ​

写好的代码可以发布成包,让别人用 tianjia 安装。包体放在 GitHub 的 release 附件里,cpro 的包索引只登记下载地址和校验值。

准备 ​

发布者与包名 ​

包的全名是 发布者/包名。发布者就是 GitHub 仓库所有者的用户名,例如仓库 github.com/bill-mark/shuxue 的发布者是 bill-mark。

发布者:

  • 3 到 39 个字符,只能是小写字母、数字、.、-
  • 首尾不能是 . 或 -,不能有连续的 ..

包名:

  • 必须和 GitHub 仓库名相同,例如仓库 github.com/bill-mark/shuxue 的包名是 shuxue。仓库名带大写字母时,包名写成对应的小写
  • 一个仓库只发布一个包
  • 1 到 64 个字符,小写字母开头,只能包含小写字母、数字、-、_,不以 - 或 _ 结尾
  • 不能是保留名:con prn aux nul com1–com9 lpt1–lpt9 cpro biaozhun ceshi bao guanfang fabuzhe fabuzhe_xinxi

第一次发布时会记下发布者和仓库对应的 GitHub 账号。之后账号对不上会被拒绝,所以删掉仓库再重建,只能换一个新包名。

cpro.json ​

包就是一个普通的 cpro 项目,cpro.json 里多写几个字段:

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 三处要对得上同一个仓库:

仓库fabuzhebaomingcangku
github.com/bill-mark/shuxuebill-markshuxuehttps://github.com/bill-mark/shuxue

入口文件就是公开 API ​

别人只能导入入口文件里 daochu 的函数,包里的其他文件外面碰不到,可以随意重构:

cpro
// src/rukou.cp
daoru { jia_impl } laizi "./neibu.cp"

daochu hs int_jia(a z64, b z64) z64 {
    fanhui jia_impl(a, b)
}
cpro
// src/rukou.cp
导入 { jia_impl } 来自 "./neibu.cp"

导出 函数 int_jia(a i64, b i64) i64 {
    返回 jia_impl(a, b)
}
cpro
// 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 所在目录)执行:

bash
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 ​

  1. 在 GitHub 仓库里新建一个 release(打上 tag,如 0.1.4)
  2. 把 shuxue.tar.gz 作为附件(asset)上传
  3. 复制附件的下载地址,形如:
https://github.com/bill-mark/shuxue/releases/download/0.1.4/shuxue.tar.gz

不要用 GitHub 自动生成的源码压缩包

release 页面自带的 "Source code (tar.gz)" 每次下载内容可能不同,会被拒收。必须用自己上传的附件。

发布 ​

把附件地址提交给注册服务:

把下面的示例包线上地址换成你的github生成的包地址

bash
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"}'
bat
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、计算校验值并写入索引。成功后,别人就可以:

bash
cpro tianjia bill-mark/shuxue@0.1.4

版本规则 ​

  • 版本号发布后不能修改,也不能删除。改了内容就发一个新版本号
  • 版本号是三段非负整数,不能有前导零,不能带 -beta 这类后缀
  • 建议的递增方式:
    • 改了公开函数的签名、删了公开函数、改变了行为 → 第一段 +1
    • 新增了公开函数,原有的都不变 → 第二段 +1
    • 只修 bug 或改内部实现 → 第三段 +1

写包的注意事项 ​

用到的包都要写进自己的 yilai。即使某个包碰巧已经装在磁盘上,没有声明也不能导入。

包只能导入自己目录里的文件。不能用相对路径读包外面的文件,否则这个包到了别人的项目里就用不了。

模块级变量每个版本各有一份。用户的程序里可能同时装着你的包的两个版本,它们的模块级变量互不相通。不要假设"整个程序里只有一个我"。

cpro 目前处于测试阶段