После многих предложений от пользователей IRC я смог собрать следующий скрипт, который принимает выражение nix в качестве единственного аргумента, копирует файл деривации и записывает версии nixpkgs локально при установке указанной среды:
#!/bin/bash
if [ -z "$1" ] || [ "${1: -4}" != ".nix" ] || [ ! -f "$1" ]
then
echo "No .nix file supplied"
exit -1
fi
ENV_DRV=$(nix-instantiate "$1")
cp "$ENV_DRV" ./env_backup.drv
chmod u+rw ./env_backup.drv
nix-env --set "$ENV_DRV"
NIXPKGS_VERSION=$(nix-instantiate --eval '<nixpkgs/lib>' -A version)
NIXOS_VERSION=$(nix-instantiate --eval '<nixos/lib>' -A version)
printf "nixpkgs: %s\\nnixos: %s" "$NIXPKGS_VERSION" "${NIXOS_VERSION}" > .nix_versions
Предупреждение : в вашем выражении nix должен быть пакет nix
, поскольку мы используем nix-env --set
.
Я еще не пробовал использовать скопированный файл .drv, но его нужно каким-то образом восстановить в хранилище nix; Я в основном включил это в качестве крайней меры и для отладки. Вывод в .nix_versions
должен быть более полезным, поскольку они содержат хэши git commit (после последнего "."), Которые можно использовать для использования правильной ревизии nixpkgs (благодаря infinisil в IRC):
pkgs = import "${(import <nixpkgs> {}).fetchFromGitHub { owner = "NixOS"; repo = "nixpkgs"; rev = "<your revision hash>"; sha256 = "<the hash of the output>"; }}" {}
Чтобы заполнить хеш, либо предоставьте неправильный хеш, чтобы получить правильный хеш, либо просто используйте следующее: nix-prefetch-url --unpack github.com/nixos/nixpkgs/archive/<revision>.tar.gz
.
Или, если вы вручную проверяете nixpkgs, вы можете просто сделать, например ::
with import ((builtins.getEnv "HOME") + "/workspace/nixpkgs") { }; # or:
with import "../nixpkgs" { }; # or similar
Я еще не проверял подобные вещи с nix-shell
, но надеюсь сделать это в ближайшее время.