jvc.sh-另一个(yet another)纯shell的jill.sh/jill.py

jvc (Julia version control) 可以考虑为 jill.sh 的 heavy 版,jill (Julia installer 4 Linux Light). 目前只针对 Linux 系统的安装。

为什么有了jill.pyjill.sh 我还想写一个纯shell的?

  • 我想用尽量少的依赖来做这件事情 (不想要pip…先有python后有Julia?(虽然大部分Linux发行版已经预装python了)
  • jill.sh对于版本的控制略有不足。
  • 我想更灵活的切换版本?(Julia非常迅速,版本迭代快,有时候希望能快速切换版本,因为多次碰到小版本之间翻车的经历…)
  • 更为激进的IonCli.jl,直接使用了binary,暂时体积较大。

安装和自定义配置:

  1. git clone下来到你喜欢的地方,比如~/.jvc
    git clone https://github.com/songxianxu/jvc ~/.jvc
  2. 对你的shell rc文件(.bashrc.zshrc)添加环境变量
    export PATH=$PATH:~/.jvc:~/.local/bin/jvc/
    第二个路径~/.local/bin/jvc/是针对julia的symlink的路径,如果没有在.jvcrc中修改则无需修改。

如果你想自定义下载路径,安装路径,可以修改.jvcrc文件中的环境变量

  • JULIA_DOWNLOAD_DIR 下载Julia安装文件的文件夹
  • JULIA_INSTALL_DIR Julia的安装文件夹
  • JULIA_SYMLINK_DIR Julia的符号链接路径
  • UPSTREAM_NAME Upstream的名称,一般无需手动设置,直接通过jvc upstream调整。

安装Julia

jvc install # 默认安装最新的稳定版 (现在是1.5.3)
jvc install 1 # 默认安装major版本1的最新版(也是1.5.3)
jvc install 1.5 # 现在还是 1.5.3
jvc install 1.5.3
jvc install 1.6.0 # 安装1.6.0 (但现在是rc)
jvc install 1.6.0-rc1
jvc installed # 列出所有已安装的版本

仅下载安装文件
jvc download [版本号]

加载/移除某个版本的符号链接
jvc load 1.5.3 这样julia-1.5.3就可以使用了
jvc unload 1.5.3julia-1.5.3不可见 (并不是卸载)
jvc loaded 显示所有已加载

切换主版本
jvc switch 1.5.3julia符号链接使用julia 1.5.3
即命令行中输入julia直接使用1.5.3

移除所有符号链接 (除julia)
jvc purge
由于每次安装都默认加载符号链接,如果安装过多版本,可能会想移除。(移除所有诸如julia-x.y.z等)

安装nightly
jvc nightly
以后可能会考虑合并到jvc install nightly

显示状态
jvc status
显示安装的,加载的,下载的,还有upstream

搜索版本
jvc search [x.y.z]

查询所有可以安装的版本
jvc avail/available
jvc avail all 包括rc和beta

卸载某个版本的Julia
jvc remove
会列出已安装版本供卸载。

Julia版本移植 (升级)
jvc migrate 1.5 to 1.6
会复制 Project.tomlManifest.toml到对应版本的环境目录
移植前会先比较对应Project.toml

切换下载源
jvc upstream
也许你会需要切换下载源…
源信息记录在upstream.conf
最初直接查询jill.py中的sources.json但万万没想到…github的rawfile似乎经常无法访问。

结语

  • 第一次写这么长的shell脚本,主要参考的nvm-shjill.sh
  • 还有很多细节没有完善,感谢大家能提供更多的意见。

几个相关的项目

7赞

有没有可能兼容 Windows ?
更现实地说,基于 Powershell 脚本做个类似的?(甚至兼容安装了powershell的非Windows系统)

:+1: 之所以写 jill.py 就是因为我的shell能力无法驾驭这种超长的脚本… 所以做了这样一个取舍… 另外考虑到用 python 的话也可以直接支持 windows…

另,Julia官方提供一个 https://julialang-s3.julialang.org/bin/versions.json 可以用来查询版本,各个镜像站也有同步,用这个的话可能会更可靠一些?似乎jvc目前是查询github的样子。

1赞

另,好像社区里用 asdf 的也挺多的。

我对于Windows上的使用Julia开发的流程没有什么概念…对Powershell也不是很熟,感觉需求不是特别大?而且Windows下更好的选择可能是 jill.py?

如果要兼容Windows可能最有可能的是考虑基于msys2的兼容…这样不需要完全重写个Powershell版的。

WSL下jvc应该是可以用的,还没有深度测试过。

Mac理论上是可以直接兼容的。但是Mac上的安装还没搞懂 (似乎是hdimount?) (没有Windows和Mac的开发环境…所以这些测试都没做)

:+1: 之所以写 jill.py 就是因为我的shell能力无法驾驭这种超长的脚本… 所以做了这样一个取舍… 另外考虑到用 python 的话也可以直接支持 windows…

我的shell也写的不好…写的时候很多都是边查编写…比如现在的arguments都没有用到shift…现在的confirm也没有默认Yes… (不过写完shell之后真的可以极大增加写Julia的幸福感…)

另,Julia官方提供一个 https://julialang-s3.julialang.org/bin/versions.json 可以用来查询版本,各个镜像站也有同步,用这个的话可能会更可靠一些?似乎jvc目前是查询github的样子。

主要的查询用的是官方的versions.json…
除了一个情况…就是jvc install 默认安装最新的stable的情况。
这个是查询了github的release tag…(之后我也更改下…)
其他的都是使用官方的versions.json. (之后应该会根据upstream一起替换)

另,好像社区里用 asdf 的也挺多的。

之前也考虑了用类似的工具,但是写的时候最开始的想法就是提供最少的依赖…

  • 比如没有选择用 jq 来处理 json 文件 (因为很多系统没有预装)
  • 如果有可能最好连 .jvcrcupstream.conf 也不要,upstream.conf 本来是没有的…直接查询了 jill.py 的sources.json…但是 github raw 文件的访问似乎不稳定…
1赞

我这是基于Nix https://github.com/GTrunSec/my-julia2nix-env 实现的julia版本和包依赖的使用,可以云部署复现支持direnv。但目前就是没写好的readme,方式比较hack.(支持macos 和linux安装有nix的机器。)

目前,我这个环境是部署了pluto锁了相应deps julia pkgs环境,开放给一些学生用户和自己使用的。

注意:目前我的环境对别人其实是相当不友好的,这里仅仅是一个展示说明。

1赞

不是很了解…Nix,给我的感觉是 可以打包了一个独立的julia环境通过Nix派发?

可以这么讲,是通过完全Nix构建的完全独立的环境。包括julia或者依赖环境都是要在当前的架构平台x86 darwin aarch64进行源码编译,生成hash的。如果对特定或者master版本都是随时可以编译。而且对julia deps每个包的project arts也进行了hash的锁定构建,每个环境都是唯一的解析成packages.nix去下载构建。

目前我的环境是 cd 到每个包含有project.toml Manifest.toml的dir自动activate 当前的包和julia版本,并且run pluto也可以得到相似的环境。

只要一台相同平台下构建成功,其他机器如果使用相同的包环境和julia版本是直接可以拉去编译缓存和下载缓存。

对于我Repo的环境使用也仅仅需要1-2条简单的命令就可以,但是 如果你想后期自己修改各种版本,就需要一个我去写一个README去说明了。

这样对应的用户群体似乎限定于使用 Nix 用户了?虽然 Nix 的概念 (哲学) 看起来的确很有意思(准备试试),只是这和我初衷似乎不太一样。。。

很多用户和shell版本依赖各种管理都是基于传统管理和解决,但这个也是主流。Nix只是管理和部署更加先进的方式,至于你说的限定于Nix用户其实不然,Nix只是个包管理类似pcam apt-get docker综合等等。更多的时间花费和维护是我这种maintainer去做的去写框架测试等等,对于普通用户来讲,甚至第一次接触NIx的只要写好README,简简单单一条命令就可以使用了。

我这里说明一下,jill.sh这类方式依然是主流,但我解决的是更加复杂,稳定,可控,可复现的整个develop julia环境,无论是新手和还是老手,
都可以直接拿来用,或者部署。

我录制了一效果

1赞

因为Nix种种机制,如sandbox每次生成都是唯一hash且不能修改。任何版本的切换和修改都需要重新编译生成,而且各种独立复杂依赖都及其不友好。
所以我不建议别人去使用我的环境,在没有好的README的情况下。这里仅仅是一个展示和讨论。

我Repo初步面向用户,是想学Julia的学生或者其他群体。因为整个的封装环境对这些群体非常有好,甚至(activate “DIR” add(“PKGS”) apt-get julia) 什么都不用做,一条命令就可以得到一个完美的环境。

当然如果有人帮助我去写一个有好的README,那就是另外一回事情。其次若每次修改Julia版本就意味着要重新编译一次,如果没有CI或者binary cache的提供,对用户也是麻烦事情。

:+1: :+1:
以后可能会考虑合并到jvc install nightly
现在 jvc switch nightly还不能用?

是的,jvc swtich nightly暂时是没法用的 (今晚之后应该可以…)。之前我没有考虑会有人想把 nightly 版本link到 julia 这个 alias… 还有个原因是nightly游离在官方versions.json之外,所以写的时候是直接分开了。

感谢解释。这个大概就是我的意思,这个 repo 解决的问题更像是快速部署一个包括了 binary 和 package 的 demo 环境。。但是在没开始尝试Nix前,可能没法评论更多…另外 Nix 对 Windows 似乎也只能在 WSL上?

你这个可以开新帖详细介绍一下了

介绍如何用Nix安装iJulia和其他kernels在Jupyter或者环境(支持Linux和MacOS) :laughing:

京ICP备17009874号-2