gpt4 book ai didi

nix - 如何在 nix 中记录可重现的配置文件(尤其是来自 nix-env)?

转载 作者:行者123 更新时间:2023-12-04 05:09:35 26 4
gpt4 key购买 nike

所以,终于开始获得一个稳定的 nix 环境,我基本上可以在其中进行所有的开发。万岁!

现在我想让它重现,如 yarn.lock (对于那些熟悉 javascript 领域中的 npm/yarn 的人)或 Pipfile.lock (与 Python 非常相似)。

基本上这个想法是,每当我运行 nix-env -if my-env.nix 时,我都会有一种方法来生成类似的锁定文件。 ,或者在运行此命令之后,如果这是它的工作方式。从这个锁定文件中,我可以准确地恢复我的 nix 配置文件,直到已安装配置文件的依赖项和子依赖项的确切版本。这可以在测试新的改进后检查到 git 或其他任何东西,因此将维护环境记录。

在我看来,这将是 Nix 最明显的用例之一,也是仅使用 Docker 的主要优势之一(尽管两者并不相互排斥),因此如果我错过了一些相关文档,我深表歉意。

最佳答案

您可能正在寻找的是 shell.nix像这样的文件:

let
pkgs = import (fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/696c6bed4e8e2d9fd9b956dea7e5d49531e9d13f.tar.gz";
sha256 = "1v3yrpj542niyxp0h3kffsdjwlrkvj0mg4ljb85d142gyn3sdzd4";
}) {};
in pkgs.mkShell {
buildInputs = with pkgs; [
git
hello
];
}

来电后 nix-shell (默认情况下使用当前目录中的 shell.nix 文件),您将处于具有 git 的环境中。和 hello来自特定给定的 nixpkgs 修订版。这可以在所有 nix 用户之间复制(几乎可以*)。我真的可以推荐使用 shell.nix用于所有开发的文件。

或者,还有一个鲜为人知的 -r标志到 nix-env ,这表明

--remove-all, -r

Remove all previously installed packages first. This is equivalent to running nix-env -e '.*' first, except that everything happens in a single transaction.



您可以有效地使用它来替换有状态的 ~/.nix-profile/manifest.nix .创建文件 env.nix包含:
let
pkgs = import <nixpkgs> {};
in {
inherit (pkgs) git hello;
}

正在运行 nix-env -ir env.nix将完全安装 githello并删除其他所有内容,以便您可以使用此单个文件重现您的 nix-env 安装。安装其他东西:将它添加到文件中并再次运行命令。您还可以将 nixpkgs 固定到上面文件中的特定版本,而不用关心您的 nix-channel设置(也是有状态的)。

编辑 :也可以从您的 channel 获取一些软件包和一些特定的 nixpkgs 修订版:
let
pkgs = import <nixpkgs> {};
fixed = import (fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/696c6bed4e8e2d9fd9b956dea7e5d49531e9d13f.tar.gz";
sha256 = "1v3yrpj542niyxp0h3kffsdjwlrkvj0mg4ljb85d142gyn3sdzd4";
}) {};
in {
inherit (pkgs) git;
inherit (fixed) hello;
}

*:nix 配置、覆盖和您的系统 (Linux/Mac) 仍然可以影响这一点。最好使用 import <nixpkgs> { config = {}; overlays = []; }为了避免这种情况的发展。

关于nix - 如何在 nix 中记录可重现的配置文件(尤其是来自 nix-env)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com