如题。
- 对于那些基于 FHS 开发的/发行的软件,有哪些成熟的经验方法将它们移植到 Nix 上?
- 为 Nix 打包时有哪些注意事项?
如题。
我大概花了2周的时间,想把环境迁移到guix去。但是最后失败了,你说的FHS就是一个很大的原因。
因为GUIX为了保证隔离性和可复现性,所以需要为包做wrap。 比如用脚本wrap 执行文件的环境变量,patch interprete。就比较麻烦,而且有个risk, 如果移植的程序内部有调用一些/usr/bin/ls(硬编码进程序的) 这样的命令的话,就会比较麻烦。这种我暂时没想到解决办法。
另外guix 是不用systemd的,所以如果仍然是硬编码的而且没有源码的话,同样会比较头疼(nix好像是用systemd的?可能没这个问题)。
这些问题可能是可以被解决的,但是我一想到以后我找个软件要是没有guix的支持,我就得自己去做一遍这些patch的话,我就感觉很恐怖所以就放弃了…
你用Nix的话,可以参考一下。另外,guix因为有编译过程,所以安装软件可能没arch和ubuntu这种快, 不知道nix是不是这样的。
nix也有编译过程,大体上guix有的问题,nix也有(nix用systemd)
网络问题,打包问题,文档混乱问题 用起来成本太高了
guix 可以模拟出一个符合 FHS 环境 https://guix.gnu.org/en/blog/2023/the-filesystem-hierarchy-standard-comes-to-guix-containers/
nix 应该类似功能,我不太清楚,因为读 nix 的文档太痛苦了
至于打包其实跟别发型版区别不大,无非是 config, build, install 几个 phrase,往里面填 shell 脚本。对于使用典型的构建系统的软件也是自动处理,比如 autotools,CMake 和各个语言的 de facto 的构建系统。跟在别的发型版上打包没有本质区别,
其实只要是规范的 free and open source,打包没什么困难。至于私有软件就只能自求多福了。
我个人感觉的话,直接用 docker 跑应该是个最佳选择
网上也有人问过类似的问题
我自己尝试过构建一个 shell,参考官方文档最终还是放弃了。。。
https://nixos.org/manual/nixpkgs/stable/#sec-fhs-environments
没用过 Docker,有点疑惑:
你都用nix了,还考虑啥GFW啊 少不了从github直接拉文件下来,现编译,还有nixos的缓存机器国内直连也不太好
FHS 的话,nixos 有提供fhs环境,例如vscode 就有fhs包,可以安装任意插件,例如clangd插件,它会下载clangd的二进制包
注意事项,没啥注意事项,能编译过就基本没问题
运行二进制文件: 在一开始如果遇到没有移植的软件,看看有没有像 flatpak,appimage打包的版本。实在不行,用 steam-run
运行下。
日常开发:遇到的问题一般是动态链接库问题,可以用 LD_LIBRARY_PATH
环境变量解决。(一些二进制无法运行也可能是动态链接库问题)。ldd
命令非常实用。
遇到问题多上Nix论坛。
不用担心, 咱不是还有 HW 主导的开放原子开源基金会 搞了个国产绿色版 docker 镜像站吗?
这个概念在 Nix 里面叫什么名字?
好像叫 steam-run?
这个名字……好像最开始是用来解决 Nix 运行 Steam 的问题的?
哦哦,好像是的,我以前搞的已经忘记了 刚刚查了一下,好像更新的做法是用 nix-ld,你可以查一下 NixOS wiki 看看。
嗯,你说的前面那些点挺不错,但“Nix社区本身相当中心化”我不认同,而且nixos社区一直宣扬的包多的观点,也就笑笑,它那个分包的粒度,包不多才奇怪呢 nix很多人都是闭门造车,论中心化远不如aur这种,即使同样有nur,也没多少包 很多人自己打包都只在自己的nixos配置中使用,很少有人会单独提取出来作为单独包使用
另外,nixos的社区都已经把nix的作者踢出社区了,没考证过,我记得是在哪个群组有人提了一嘴
我在打包上还是新手,不过根据个人经验来说:
substituteInPlace
)。学习这些东西的最好方法是生成式人工智能。nix
命令,把channel和nix-
命令当作不存在,这样才能获得现代包管理器(conda, cargo, yarn, pkg.jl, etc)的体验。/nix/store
中搜索、调用甚至改动文件),属于严重的抽象泄漏,与Nix的设计背道而驰。不要信。nativeBuildInputs
并不是单纯的“构建时依赖”,而是包括了Nix-specific的东西,如wrapQtAppsHook
;hash
属性不知道的时候不能随便乱填,而是只能填固定的几个占位符)$out
目录,mkDerivation
不会帮你创建。mkDerivation
的大部分(所有?)属性都会变成环境变量,但是不要太依赖这个功能,因为它无法调用其他环境变量,比如out
。只用新命令的话,好像是完全没法儿命令式安装包了,只能靠声明式,修改 nixosConfigurations 和 homeConfigurations,感觉和这些现代包管理器没什么关系啊🥲