【问题标题】:Reproducible nix-env -i with only Nix, no NixOS可重现的 nix-env -i 只有 Nix,没有 NixOS
【发布时间】:2018-06-11 17:09:25
【问题描述】:

我只使用Nix 作为包管理器,而不是使用所有NixOS。我想要一个可复制的nix-env -i 软件包安装,可以共享和备份。

我知道将config.nix 用于NixOS,但我正在寻找仅使用Nix 包的类似功能。

【问题讨论】:

    标签: nix


    【解决方案1】:

    在 Nixpkgs 中,您可以使用 buildEnv 函数来构建符号链接场,类似于 nix-env 生成它们的方式。

    这使您可以将软件包组合到要单独更新的组中。当然,如果适合您的应用程序,单个组是完全有效的。

    这是一个例子greeting-tools.nix

    let
      pkgs = import <nixpkgs> {};
      inherit (pkgs) buildEnv;
    
    in buildEnv {
      name = "greeting-tools";
      paths = [ pkgs.hello pkgs.cowsay pkgs.figlet ];
    }
    

    您可以按如下方式安装和删除它

    $ nix-env -i -f greeting-tools.nix
    installing 'greeting-tools'
    $ hello
    Hello, world!
    $ nix-env -e greeting-tools
    uninstalling 'greeting-tools'
    $ hello
    The program ‘hello’ is currently not installed. [...]
    

    要更新您的软件包,您必须重新运行安装命令。 nix-env -u 将无法正常工作,因为它只查看 Nixpkgs,可能没有类似的名称。

    另一种可能是home manager

    【讨论】:

    • 谢谢,这比我见过的其他解决方案完美且简单得多!我现在使用 nix 作为我的全局包管理器,所以我绝对可以利用它并将我的安装文件备份到 github。
    【解决方案2】:

    我还是新手,但发现 https://nixos.org/manual/nixpkgs/stable/#sec-building-environment 应该做的完全一样,并且被问到了什么。

    例如里面~/.config/nixpkgs/config.nix

    {
      packageOverrides = pkgs: with pkgs; {
        myPackages = pkgs.buildEnv {
          name = "greeting-tools";
          paths = [
            hello
            cowsay
            figlet
          ];
        };
      };
    }
    

    并通过nix-env -iA nixpkgs.myPackages安装

    另一种方法是定义一个新的叠加层,例如在 ~/.config/nixpkgs/overlays/greeting-tools/default.nix:

    self: super: {
      greetingTools = super.buildEnv {
        name = "greeting-tools";
        paths = [
          self.hello
          self.cowsay
          self.figlet
        ];
      };
    }
    

    然后可以像任何其他软件包一样安装:nix-env -i my-packages

    【讨论】:

    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 2016-12-05
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多