Nix 推导捆绑多个程序

Nix derivation to bundle multiple programs

我正在尝试编写一个派生程序来安装一些可执行文件。我可以使用 symlinkJoin

轻松做到这一点
{pgm-a, pgm-b, symlinkJoin}: symlinkJoin {
  name = "pgm-env";
  paths = [pgm-a,pgm-b]; }

但是,如果 pgm-apgm-b 已经安装,我会收到一个涉及包冲突的错误...

...'<pgm-a>/bin/pgm-a' and '<pgm-env>/bin/pgm-a' have the same priority 5; use 'nix-env --set-flag priority NUMBER INSTALLED_PKGNAME' ...

有没有办法使一套可执行文件在环境中可用,但只会向环境添加所需的内容(或以其他方式避免此错误)?

一些背景: 我已经开始为我的实验室策划一个私有存储库。我们设置 VM 网络,安装一些软件,进行一些测试,冲洗并重复。除了我以外,没有人是 Nix 用户,所以我想尽可能低调地使用 Nix——我不希望用户必须设置优先级标志,也不想让他们使用 nix-shell .他们都习惯于做 apt-get install ... 所以我的计划是让他们做 nix-env -i 而不是提供像 ourExperiment-x 这样的包,让他们在大多数情况下正确配置 VM。

是的,你可以像这样直接声明时设置包的优先级:

{pgm-a, pgm-b, symlinkJoin}: symlinkJoin {
  name = "pgm-env";
  paths = [pgm-a,pgm-b];
  meta.priority = 10;
}

默认优先级为5,低优先级优先于高优先级,因此设置为10,本次派生的文件将仅作为后备。