Некоторое время назад у меня был flake.nix, который работал:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils, }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = import nixpkgs { inherit system; };
in {
packages = rec {
hello = pkgs.nim2Packages.buildNimPackage {
pname = "hello";
version = "0.1.0";
src = ./hello;
};
default = hello;
};
});
}
После запуска nix flake update
он перестал работать с этим сообщением об ошибке:
error: attribute 'nimPackages' missing
at /nix/store/rkp543s3nhhichwg03kffd515411mikm-source/test/samples/greeter/flake.nix:12:19:
11| packages = rec {
12| hello = pkgs.nimPackages.buildNimPackage {
| ^
13| pname = "hello";
Did you mean elmPackages?
Как я могу это исправить?
Я сделал git bisect и отследил его до этого пиара nixpkgs
Два изменения, первое — это просто переименование/реорганизация:
pkgs.nim2Packages.buildNimPackage
-> pkgs.buildNimPackage
Другой требовал, чтобы я создал файл блокировки:
❯ nix-shell -p nim_lk
$ nim_lk ./hello > ./hello/lock.json
$ exit
❯ git add ./hello/lock.json
Затем мне нужно было сослаться на файл блокировки при вызове buildNimPackage
. Вот flake.nix
после внесения изменений:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils, }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = import nixpkgs { inherit system; };
in {
packages = rec {
hello = pkgs.buildNimPackage {
pname = "hello";
version = "0.1.0";
src = ./hello;
lockFile = ./hello/lock.json;
};
default = hello;
};
});
}
Это было немного трудно. Я клонировал nixpkgs и запустил bisect с помощью git bisect bad
, затем проверил ссылку из flake.lock
, которая сработала и сделала git bisect good
. Затем я позволил git обрабатывать разделение пополам и каждый раз копировал ссылку с каждого шага во входной файл: nixpkgs.url = "github:NixOS/nixpkgs?ref=bisect-hash-goes-here";
. Затем я запустил nix build
, чтобы посмотреть, хорошо это или плохо, а затем пробежал git bisect good
или git bisect bad
в репозитории nixpkgs. Чтобы найти виновника, понадобилось около 15 шагов. Автоматическое разделение входов пополам было бы очень крутой функцией.
Оглядываясь назад, ваша идея лучше. Мне следовало просто указать ввод на мой локальный nixpkgs.
Как вы справились с флейк-зависимостью? Есть ли для этого команда, похожая на
git bisect
, или вы клонировали nixpkgs локально и каким-то образом указали свою флейк на локальную копию, которую выnix flake update
потом?