Наложение - это просто функция от 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.
Кроме того, я рекомендую свести количество оверлеев к минимуму.Разбивайте их только в том случае, если это имеет смысл с точки зрения распространения программного обеспечения - для этого они и были предназначены.