nixos: накладывает вызовы накладывает - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть оверлей, определенный в nix, в моем ~ / .config / nixpkgs / overlays / tmft.nix, который выглядит следующим образом:

self: super: {
  tfmt = import ../dists/tfmt/default.nix {};
}

Хорошо, я могу установить его отлично.Это пакет haskell, и я хочу установить его как часть моей установки ghc.Таким образом, у меня есть еще один оверлей в myHaskellEnv.nix, который выглядит следующим образом:

self: super: {
  myHaskellEnv = super.haskellPackages.ghcWithHoogle
                   (haskellPackages: with haskellPackages;
                   [ tfmt ]);
}

Только, который жалуется, что не может видеть tfmt (error: undefined variable 'tfmt').

Я могуЧтобы обойти эту проблему, импортируйте пакет напрямую:

let tfmt = import ../dists/tfmt/default.nix {};
 in self: super: {
  myHaskellEnv = super.haskellPackages.ghcWithHoogle
                   (haskellPackages: with haskellPackages;
                   [ tfmt ]);
}

, но это препятствует повторному использованию.

Как я могу использовать один оверлей из другого?Я попытался сослаться на super.tfmt, но это показывает ту же проблему.

1 Ответ

0 голосов
/ 29 ноября 2018

Наложение - это просто функция от self и super до набора атрибутов (обычно пакетов).Применяются те же правила определения области действия, что и в любом определении функции Nix.Поэтому, когда вы хотите использовать что-то из предыдущего наложения, это не волшебно по объему;вы должны получить его из self или super, которые представляют окончательный набор пакетов и определение только из более ранних наложений.

Изменив [ tfmt ] на [ self.tfmt ], вы сможете вставить окончательное определениеtfmt - так как он может быть переопределен в последующих наложениях.В качестве альтернативы вы можете получить tfmt из super, что не рекомендуется, поскольку оно менее гибкое, но иногда вам нужно super, чтобы избежать создания циклических определений, которые приводят к бесконечным рекурсиям во время оценки.


При написании оверлеев следует избегать повторного импорта Nixpkgs, прямо или косвенно.Это важно, потому что <nixpkgs> может быть неправильной версией Nixpkgs для чьего-либо использования, и если вы все сделаете правильно, вы переоцените точку фиксации Nixpkgs, что займет время, вы потеряете любую конфигурацию, которая была в исходном Nixpkgs,как config и overlays и аргументы кросс-компиляции.

Вместо этого вы должны использовать атрибуты self и super.В частности, super.callPackage пригодится, но для пакетов на Haskell вам лучше переопределить набор пакетов haskell, дополняя его своими собственными пакетами, для согласованности.

Вот пример изthis.

Кроме того, я рекомендую свести количество оверлеев к минимуму.Разбивайте их только в том случае, если это имеет смысл с точки зрения распространения программного обеспечения - для этого они и были предназначены.

...