Вы можете получить один файл / подкаталог, используя path
+ string
-concatenation.
environment.etc."sb_hosts".source =
fetchFromGitHub {
owner = "StevenBlack";
repo = "hosts";
rev = "v2.1.19";
sha256 = "1wrwlgcy46vwji0n1imnmlci03ln0v4qd27cw8cwpag57w06n4z7";
} + "/hosts";
Почему это работает?
Вы можете объединить путь со строкойдля ссылки на подпуть (это также будет path
).Производные (такие как fetchFromGitHub args
) неявно приводят к пути, который они будут производить после построения.
Почему не сработало предлагаемое решение в вопросе?
builtins.filterSource
(и егобратья и сестры, lib.cleanSource{,With}
) скопирует path
в хранилище после удаления всех файлов, которые не проходят предикат.Примечательно, что копия хранилища (и соответствующее кеширование) происходит после применения предиката.
Это в первую очередь полезно для определений Nix, которые встроены в исходный код, который они упаковывают, чтобыизбегайте повторных сборок при изменении не относящихся к делу файлов (таких как __pycache__
или папка .git
).
Это не имеет большого смысла для дериваций, поскольку они уже в Nixсохраняются и идентифицируются по входным данным сборки, а не по выходным.
Что означает сообщение об ошибке?
/nix/store/r3xnh6ricqa7lnnbb0ka5vb0h6rw28ap-source
- это вывод деривации, поэтому Nix обеспечивает его существование(или создается), прежде чем все, что использует его, может быть построено по очереди.Почему они решили назвать это отношение refers
, далеко за пределами моего понимания.
Решение актуальной проблемы
Вы можете добавить дополнительные записи в вашу /etc/hosts
, используя network.extraHosts опция.Это свойство ожидает содержимое непосредственно в виде строки, но это можно решить с помощью builtins.readFile .
Таким образом:
networking.extraHosts = builtins.readFile
(fetchFromGitHub {
owner = "StevenBlack";
repo = "hosts";
rev = "v2.1.19";
sha256 = "1wrwlgcy46vwji0n1imnmlci03ln0v4qd27cw8cwpag57w06n4z7";
} + "/hosts");