julia的包管理新手入门(After V1.4)

喜大普奔,北外镜像上线,使用简单。
julia | 镜像站使用帮助 | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror


本人julia新手,开始学习时安装包时也遇到很多困难。鉴于新手学习julia遇到最多的困难是包的安装,因此写下自己的理解,希望以下内容对julia新手能略有帮助。
同时本人并不专业,抛砖引玉,希望大神们能够不吝纠正错误,增加内容等,以便帮助众多julia新手跨过包安装这个门槛。

当我们安装包时,会有3个限速步骤。

    1. update registry 同步
    1. Pkg.add 下载源码
    1. pkg.build 下载依赖的二进制文件。

1.julia的package默认存放在哪?

julia的package的源码仓库存是放在github上的一个个项目,可以由任意人员开发。

2.Pkg.Registry

julia官方收录的package,由github上的juliaRegistries中的general 仓库维护。registry其实仅仅是个目录,包名字列表,记录了包的各个版本信息,依赖关系等。windows该列表会下载到个人目录的.julia/registries文件夹中。
每次Pkg.add是会先 update /get-repo 所有的general,然后在registries仓库中查找要安装的包。

最基本的registries是general,默认同步地址是github上的 JuliaRegistries/General项目。在github, 科大,浙大均有此文件可以同步。

Pkg.Registry.add(Pkg.RegistrySpec(url="https://mirrors.zju.edu.cn/julia/registries/General.git"))

该过程会替换掉默认的general。然后每次安装包前的updata general就会改为国内镜像。但注意这仅仅是获取包目录列表的地址改了,Pkg.add下载包源码仍然从默认的github下载。

3. Pkg.add

Pkg.add(“xxx”)会先在resistry先查找该包,找出该包的依赖关系。然后从github xxxx项目下载该包及该包的依赖包。

注意,add仅仅是下载了该xxx在github上的包及依赖包到.julia下的package文件夹。
PkgMirror可以更改获取源码包的地址为国内镜像。

4.Pkg.build

Pkg.add仅仅是下载了包,并未安装。一般来说,纯julia代码写的包,第一次使用时可直接编译。
非纯julia的包则还需要build。build针对是非纯julia包,如GR包。gr是一个底层绘图库,可能是C/C++写的绘图基础设置。GR包是使用julia对gr库的封装。Pkg.add时仅仅是下载了GR包的julia代码部分,并未下载其引用的gr.tar.gz或者gr.exe二进制文件。而在build时,则会下载该gr库的二进制文件。

build过程实际上是运行了包目录下build.jl文件。该build一般是为了解决二进制依赖,当然,也可做任何事情,这取决于build.jl怎么写。一般来说,build.jl过程是下载依赖的二进制底层库,并解压到合适的位置。在build.jl文件中,只给出了gr的链接,大多在github项目的asset部分,存放在s3.amazon AWS云服务器上。实际上国内安装package,遇到的最大问题就在于此,amazon AWS的S3服务器在国内无法访问。


以gr为例,默认下载是github 的asset(实际上是amazon S3服务器)。gr的build文件还提供了其他下载地址,即gr的官网下载。不幸的是,这两个链接国内均难以下载。

设置PkgServer可以更改二进制文件的下载地址。

5.artifacts

artifact为为了解决二进制依赖文件难以下载而设置的。julia官方设置了一个服务器,该server专门用于存放依赖的二进制文件。因此,在build时,下载二进制文件会转为从artifact服务器下载。

artifact的一个好处是可以设置镜像,这解决了下载二进制文件难这个问题。

但是为什么安装GR时依然困难?前面说了,build时干什么取决于build.jl文件怎么写。gr包的下载地址依然是gtihub和官网,而不是artifact服务器。GR尚未 更改自己的build文件。。

5.package镜像和artifact镜像

package包镜像,国内有中科大和浙大。参考

artifact镜像,可以设置为韩国新加坡或者个人搭建的artifact服务器。参考
https://discourse.juliacn.com/t/topic/2969/20
如在startup.jl中添加
ENV[“JULIA_PKG_SERVER”] = “https://blog.iyu.icu/myjuliapkgserver

注意:设置PkgMirror只能解决pkg.add步骤问题。此时下载的仅是源码,这些文件一般较小。
设置PKgServer解决build时二进制依赖下载困难问题。

6.关于GR包安装

GR包add时会从github下载GR包的julia部分。build是会从aws s3服务器或者gr官网下载依赖的二进制底层库。该包尚未采用最新的artifact管理方式,因此目前不会从julia的atrifact服务器下载依赖的二进制gr库。
解决的办法之一,自行下载gr.tar.gz文件,并按照build.jl提示解压到GR包的deps/gr下。

7.本地安装。

julia对本地安装并不友好(依赖的包还需要从网络下载,仍然需要git同步包项目地址)。

Pkg.add(PackageSpec(url=“带git头的包文件夹”))

或者可考虑 ]dev 包文件夹

8. .julia文件夹的内容

9.conda相关

参考

综上

    1. update registry 同步慢 ----->使用国内镜像的gerneral
    1. Pkg.add 下载源码慢。-----> 使用PkgMIirror设置镜像
    1. pkg.build 下载依赖的二进制文件。-----> 设置PkgServer

实际上往往设置PkgServer就可以了。

8 个赞

那这个怎么办? :yum:

(v1.3) pkg> add CompilerSupportLibraries_jll
 Resolving package versions...
 Installed CompilerSupportLibraries_jll ─ v0.3.2+0
┌ Error: Tree Hash Mismatch!
│   Expected git-tree-sha1:   7d75120b68b8c62549d18fd6b7fab7444efa1d3d
│   Calculated git-tree-sha1: 20f22ddd4637faf3409c3ba3277f440f72d73cac
└ @ Pkg.Artifacts /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Pkg/src/Artifacts.jl:724
ERROR: Unable to automatically install 'CompilerSupportLibraries' from '/home/steiner/.julia/packages/CompilerSupportLibraries_jll/bjj0c/Artifacts.toml'

sha1不同,看样子是包文件或者依赖的文件未下载全。

怎么办?? :rofl:

网络问题吧。V1.4可以使用aritfact镜像,要又好一些。

梯子都用上了,不知道是不是梯子的问题

试试在Julia 里面使用代理吧,我的是这样

ENV["JULIA_PKG_SERVER"] = "https://kr.pkg.julialang.org"
ENV["HTTP_PROXY"] = "http://127.0.0.1:12333"
ENV["HTTPS_PROXY"] = "http://127.0.0.1:12333"

但是变成这样了

 Resolving package versions...
   Cloning [e66e0078-7015-5450-92f7-15fbd957f2ae] CompilerSupportLibraries_jll from https://github.com/JuliaBinaryWrappers/CompilerSupportLibraries_jll.jl.git
ERROR: Git repository not found at 'https://github.com/JuliaBinaryWrappers/CompilerSupportLibraries_jll.jl.git'

能上谷歌的话,梯子应该就没问题。不过你的梯子应该需要开启允许来自局域网的连接,然后把端口改成你的端口。比如我的clash端口是 12333, allow-lan: true 允许局域网连接。

好了,不用多此一举设置https代理
不过在Resolving package versions...这里卡了半天

还一样啊

 Resolving package versions...
┌ Error: Tree Hash Mismatch!
│   Expected git-tree-sha1:   7d75120b68b8c62549d18fd6b7fab7444efa1d3d
│   Calculated git-tree-sha1: 20f22ddd4637faf3409c3ba3277f440f72d73cac
└ @ Pkg.Artifacts /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Pkg/src/Artifacts.jl:724
ERROR: Unable to automatically install 'CompilerSupportLibraries' from '/home/steiner/.julia/packages/CompilerSupportLibraries_jll/bjj0c/Artifacts.toml'

V1.4下,无代理。
ENV[“JULIA_PKG_SERVER”] = “https://blog.iyu.icu/myjuliapkgserver”
没啥问题.

或者你考虑下本地安装吧。
]dev 包文件夹

借楼放一个设置自己的 registry 的教程,适用于私有 repo:

2 个赞

这个对私有repo还是蛮有用的,之前还得手动改。

话说,注册时候的version conflict是怎么处理的呢?(比如两个commit都注册了1.0)

注册的时候要求:

The package must be stored as a git working copy, e.g. having been cloned with Pkg.develop .

也就是说必须在本地。所以注册的时候得到的就是本地当前的commit sha。你要是在不断更新的话,在 add <package> 的时候要加上 #master 的 tag。

1 个赞

你好,我在安装的时候,遇到类似的问题,julia1.4.1,无法解决,你解决了吗?

用梯子,加PkgServer