首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将nixpkgs签出传播到NixOps机器

将nixpkgs签出传播到NixOps机器
EN

Stack Overflow用户
提问于 2017-12-24 14:36:41
回答 2查看 619关注 0票数 2

我在nixpkgs上维护我的个人更改,我使用它来进行系统重建(通过NixOps)和工作站上的开发(主要是通过nix-shell)。这些更改将重新提交到nixos-17.09通道的顶部,并存储在私有的git服务器上。部署中的所有机器都具有对该git服务器的读取访问权限。

当在远程计算机上使用nix-shell时,我会得到源自机器安装时间的旧包(在我的例子中是nixos-17.03)。

是否有任何方法可以对用于远程计算机部署的nixpkgs进行完全相同的修订?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-01 20:19:37

出现问题的原因是,由于NixOps在本地构建,然后将闭包复制到远程计算机,因此无法在远程计算机上运行nix-channel --update,因此无法在远程计算机上更新nixpkgs (nixpkgs)。

nix-envnix-shell等命令依赖于$NIX_PATH指向的nixpkgs (或通过-I参数提供的任何路径)。

解决方案

解决方案是将您的nixpkgs版本放到远程计算机中,并确保$NIX_PATH指向它。默认情况下,$NIX_PATH如下所示:

代码语言:javascript
复制
nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

所以我们的想法是让它看起来像这样:

代码语言:javascript
复制
nixpkgs=/nix/store/blah-blah-blah:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

这是你的nixpkgs Git回购插入尼克斯商店。下面是一个如何做到这一点的例子:

代码语言:javascript
复制
let
    # This will point to whatever NIX_PATH states on the local machine,
    # unless overwritten with -I.
    hostNixpkgs = import <nixpkgs> {};

    # Some other nixpkgs from a GitHub repo
    romildo = hostNixpkgs.pkgs.fetchFromGitHub {
         owner = "romildo";
         repo = "nixpkgs";
         rev = "b167ba35987c2e69dc1bb91d5c245a04421ee7ed";
         sha256 = "02d8dfvginz45h2zhq745kynzygnsy760qh7yy152wpfhczag180";
    };
in
{
    network.description = "My NixOS VMs";

    vm0 = { config, lib, pkgs, ... }:
    {
      ...

      # This is really hacky, but it works.
      # I'd prefer to set environment.etc.NIX_PATH, but that's not allowed,
      # because that value is "read-only".
      environment.extraInit = "export NIX_PATH=nixpkgs=${romildo}:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels";
    };
}

它是如何工作的

Nix创建了/nix/store/BLAH-set-environment,它导出了一堆环境变量,以及其他东西。此文件可在所有shell会话中使用。environment.extraInit使您可以将任何您想要的shell中性(sh)代码附加到这个环境中。因为这个任意代码是在脚本的末尾插入的,所以它可以用来覆盖环境变量,比如NIX_PATH

请注意,部署后必须重新登录,才能使更改生效。但是得到的NIX_PATH看起来会是这样的:nixpkgs=/nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels。因此,在本例中,nix-shell将在/nix/store/mzxkszfv05np2f6rgdi2kwxd937f0sxa-source上查找nixpkgs

票数 4
EN

Stack Overflow用户

发布于 2021-11-19 03:27:29

configuration.nix中设置它(或者不管您如何构造您的配置):

代码语言:javascript
复制
{
  nix.nixPath = [ "nixpkgs=${pkgs.path}:/other/custom/paths/you/need" ];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47961494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档