求教:写好了一个Package,如何注册到官方使之可以直接Pkg.add?

包写好了,想要上传发布,希望使得成果能通过Julia本身的Pkg安装,目测是要把名字注册到Julia的METADATA,哪位了解具体操作?求指导,最好有详细步骤,谢谢!

Julia的包管理体系正在更新换代的过程中,所以下面的流程仅仅适用于最近几个月,而且你会发现有些繁琐,但是等我们完全更新到Pkg3以后就会非常简单。

创建仓库

首先创建一个GitHub repository:

然后给你的repository设置名字啥的

包的配置

一般来说要至少设置travis CI,它会为你提供Linux和Mac OS的测试。建议打开code coverage,配置文件可以用PkgTemplates自动生成,我们下面用这个来生成一个Example.jl的package。

打开REPL,安装PkgTemplates,然后使用它

julia> using PkgTemplates

julia> t = interactive_template() 

就会产生一个交互式的设置选项

我们按照提示填写自己的信息,然后最后这里是多选,按回车选择,d是完成,a是全选,n是什么都不选,我们一般至少选择TravisCI和Codecov(建议注册的package做好完整的测试)。AppVeyor是Windows的CI测试,如果有这个需求也可以选上。

后面会弹出问你是否使用自定义的配置模板,直接回车跳过即可。

然后你就获得了一个模板,我们再用 generate 函数产生一个Package

我们看看这个package里有什么

注意Manifest不需要发布,这个只是本地的依赖解析缓存,PkgTemplates已经给你生成了.gitignore

然后剩下的都是标准的package文件,但是多出一个REQUIRE是什么呢?这是因为目前attobot还没有更新,不能直接解析Project.toml的缘故。我们向Project.toml里添加依赖的时候注意复制一份依赖到REQUIRE里。REQUIRE的规则很简单,列出你的依赖即可

# REQUIRE
julia 1.0
Plots
PyCall

或者你也可以只写一个REQUIRE文件,不写Project.toml文件。

注册包

我们现在注册包其实是向METADATA里注册,METADATA是Pkg2时代的遗留,新的Registry会自动和METADATA同步。我们通过一个叫attobot的机器人来自动注册包,当你按照以上的方式生成package的时候你会发现这个过程非常简单,只要点一下就可以完成注册。

我们点击attobot最上面的链接来安装:

进入后点击右边的按钮即可。然后记得对你的仓库开启服务。以后每次发布新版本在你的仓库首页点击release进入发布新的release即可

注意我们要求所有package的版本号严格依照 vx.y.z的方式发布,x, y,z 可以是任意正整数(包括0)但是不允许发布 v0.0.0

此外,如果你使用新的Pkg3的Project.toml注意以下两件事:

  1. 你在Project.toml里的版本号是否和你tag的版本一致
  2. Project.toml在生成的时候会为每个package产生一个识别码,暂时为了兼容需要适用兼容METADATA的识别码,否则会造成依赖解析错误。产生方法如下

关于Package的质量控制

Julia过去是要求所有的package要通过CI测试,但是现在没有严格的要求有CI测试。但是Package至少要写清楚README,每个包注册完成之后会有三天的时间公示,这期间允许有人提出异议和建议。如果遇到按照建议修改即可。

6 个赞

补充一下PkgTemplate现在generate出来的Project.toml不需要修改了已经。直接用就好。会自动产生METADATA compatible的uuid

非常详尽,感谢!

干货建议置顶。。

X-ref:

如果有人试用了新的注册系统,可以再更新下这个帖子

1 个赞

我试了一下最新的注册系统,只要满足要求就可以被自动approve,然后公示一段时间没人反对就自动合入了

这里是自动合入的要求:GitHub - JuliaRegistries/RegistryCI.jl: Continuous integration (CI) tools for Julia package registries, including registry consistency testing, automatic merging (automerge) of pull requests, and automatic TagBot triggers
很简单,大概来说就是包名、版本号符合要求,pkg test能过,所有依赖项都要有带上界的compat
现在好像不要求CI,但是最好配上

然后这里是注册包的入口:GitHub - JuliaRegistries/Registrator.jl: Julia package registration bot
用WebUI就可以了,填入github地址和分支就行了,会自动给JuliaRegistries/General创建PR

2 个赞