fetchFromGitHub, отфильтруйте и используйте в качестве environment.etc. "file" .source - PullRequest
0 голосов
/ 06 декабря 2018

У меня возникли некоторые проблемы при извлечении файла из github, и мне интересно, может ли кто-нибудь помочь мне снять его и обработать как текст (или источник) в моей папке /etc.В идеале я пытаюсь сделать что-то вроде следующего (но используя .text):

environment.etc."sb_hosts".source = (builtins.filterSource
  (path: type: path == "hosts" && type == "regular")
  (fetchFromGitHub {
    owner = "StevenBlack";
    repo = "hosts";
    rev = "v2.1.19";
    sha256 = "1wrwlgcy46vwji0n1imnmlci03ln0v4qd27cw8cwpag57w06n4z7";
  }));

Но я получаю сообщение об ошибке:

string '/nix/store/r3xnh6ricqa7lnnbb0ka5vb0h6rw28ap-source' cannot refer to other paths, at /etc/nixos/configuration.nix:13:38

Для сравнения, я могу запустить fetchFromGitHub напрямую с .source, и это приведет к тому, что git-репо до /etc/sb_hosts/, как и ожидалось.

До сих пор я пытался использовать builtins.filterSource, как описано в Руководство по Nix: 15.5.Встроенные функции , и я также пытался использовать cleanSourceWith - главным образом потому, что не могу найти источник builtins.filterSource.Оба они генерируют одну и ту же ошибку, даже когда я получаю доступ к .outPath из lib.cleanSourceWith (который в ретроспективе просто вызывает filterSource).


Если это невозможноКакой маршрут рекомендуется сделать что-то подобное?В итоге я хотел бы собрать известные, версионные хост-файлы рекламного блока со всей сети, а затем объединить их с моим собственным локальным хост-файлом.

Редактировать: я понял после публикации этого raw.githubusercontent.com подчиняется теговым версиям;с fetchurl это ответило бы на мой первоначальный вопрос.Теперь мне просто интересно, почему вышеприведенный кодовый блок не работает и как я мог бы добиться чего-то такого же.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете получить один файл / подкаталог, используя 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");
...