Nix 是以函数式编程语言去组建可声明,可重复构建的,且信赖的包管理和操作系统。julia2nix 皆为 Julia 编程语言提供 友好的 Nix 的接口和探索可能性,方便以 Nix/NixOS 为生态基础的开发者和用户轻松且方便的使用 Julia 生态.
JuliaCN/Julia2Nix.jl: WIP The Nix interface to Julia Pkg 是我最近学习 Julia Lang 和基于一些社区已有的项目来进行二次开发和维护的,在 julia 语言使用方面非常生涩。所以 juliaCN 发帖的缘由是阐述一下项目思路和缘由,降低对 Nix 语言本身的需求,让一些 Julia 开发者加入进来,帮助 Julia2nix 有良好的发展。
Questions?
- 想要参与或者贡献 Julia2nix 需要对 Nix 的掌握的程度如何
如果有兴趣学习 Nix Lang 的一些语法会是非常好的,大部分 Nix 相关的工作和实现将由我来完成,所以 NixLang 的掌握不是必要条件。
- 在开始之前我需要下载什么依赖
Julia2nix 带有一个可声明式的 develop shell 将包含所有开发所需要的环境和配置,用户只需要下载 nix 就好,无需其他操作。
-
git clone GitHub - JuliaCN/Julia2Nix.jl: The Nix interface to Julia Ecosystem [maintainer=@GTrunSec]
cd Julia2Nix
nix develop
就会得到相应的开发环境,类似于 Python 的 poetry shell.
- 需要具备什么知识才能开发 Julia2nix
对 julia Pkg.jl 和包构建机制理解透彻,能够用 julia lang 实现相关的流程就可以,其次对 julia 在 common development tools 有想法和编写过相关工具的都会给 julia2nix 带来帮助如,Roger-luo/IonCLI.jl: The Ion CLI for Julia.
- Julia2nix 的基本内核是什么
由于 Nix 可重复构建的特性,和构建途中尽可能不引入不稳定的因素。如.git 文件和无网路的沙盒化构建(building step),所以一切依赖的引入都要声明和具有唯一 hash 值。
因此,解析 julia 的 manifest.toml and project.toml 将下载源转换为 Nix 可以下载的文件类型和生成 唯一 hash. 通过 msteen/nix-prefetch: Prefetch any fetcher function call, e.g. a package source 和 julia lang 的编写实现这一过程,是 julia2nix 的基本底层。且相关步骤已经在 julia2nix 实现, Julia2Nix.jl/Depot.nix at main · JuliaCN/Julia2Nix.jl.
对于 Julia2nix 基本功能的一些期望
- 更加方便且快速的解析 julia 的 manifest/project.toml 详细 (核心)
- 提升代码的整洁性,注释。
- 将解析数据和输出数据接口明确分离,提升 debugging 和 developinng 体验
- 为 Julia Project/package 提供基本工能 toolchain 和常用的功能如
- 打包为 DockerImage
- 提供 SnoopCompile 等的静态构建发布
- 提供可声明式的 develop shell 环境用于快速开发
- 提供 common developing commands 像 Roger-luo/IonCLI.jl: The Ion CLI for Julia. 一样。
Why Julia2nix ?
-
首先 NixOS/nixpkgs: Nix Packages collection 拥有非常庞大且完整的依赖和包管理库,基于 nix/nixos 的生态,可以为 julia packages/projects 封装成 拥有唯一 hash 的环境和打包格式,每次的构建和所属的依赖都将会生产唯一的 hash ,天然的给 sandboxing, reproducible,mutil-Arch and cross-compiling 提供了优势和可能性。
-
versioing control:
无论是 julia 在的各种版本号,和各个依赖的版本定制和改动在 Nix 里面都可以轻松实现,可以提供用户不同的开发体验和 不同于官方本身的 CI 测试需求。
- Actions · JuliaCN/Julia2Nix.jl 如何完全用 Nix 控制测试
如对于 CUDA 开发的同学可能需要不同版本和依赖的测试,那么 Julia2nix 也能提供非常方便的特性。如 hasktorch/flake.nix at master · hasktorch/hasktorch
做的那样。
- Julia2nix 具有模板性
随着未来维护和开发的可能性,julia2nix 可以提供不同环境下用户开发的依赖和需求,通过 nix develop 进入一下进入相应的 shell 环境.用可以在一个 common template 上进行自己的需求扩展
-
julia2default
将会包含常用的 commands, julia flow, env,开发工具的包含,像 Roger-luo/Ion.jl: REPL/CLI based Developer Toolchain for Julia 我们将直接封装在 develop shell 里面,用户无需多余下载。
-
julia2CUDA
将会包含 cuda10/ cud11, cup,gpu 的环境的 shell 为当前的 project
-
julia2data-science
将会包含 jupyterLab 和 julia pluto 等相关环境和一些常用包,并且提供 open blas/MLK 的 override 接口,方便用户对其各种定制化修改
Julia2nix 目前完成了那些工作?
- Julia2nix 目前实现了 codedownio/julia2nix: Generate Nix expressions for building a Julia depot with a set of packages 一些工作,和改进了流程。让用户可以使用 pure julia 去生成带有
Julia develop => shell Mode 的实现
基于 Nix 和 direnv – unclutter your .profile | direnv,julia2nix develop 对 Roger-luo/Ion.jl: REPL/CLI based Developer Toolchain for Julia, Roger-luo/IonCLI.jl: The Ion CLI for Julia. 进行了一些衔接和想法改进。
用户在当前的可以下或者运行 julia2nix 的相应模板和 shell 的名字就可以进入对于的开发环境.
nix develop github:JuliaCN/Julia2Nix.jl#devShell.x86_64-linux.default
# or
nix develop github:JuliaCN/Julia2Nix.jl#devShell.x86_64-linux.cuda