fetchFromGitHub,过滤并用作environment.etc。“ file” .source

时间:2018-12-06 19:24:15

标签: nixos

我在从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

为了进行比较,我可以直接使用.source运行fetchFromGitHub,这将按预期将git repo下拉到/etc/sb_hosts/

到目前为止,我已经尝试使用Nix manual: 15.5. Builtin functions中记录的builtins.filterSource,并且我还尝试使用cleanSourceWith-主要是因为我找不到builtins.filterSource的来源。即使我访问.outPath的{​​{1}}(回想起来,它只是在调用lib.cleanSourceWith时),这两个错误也会产生相同的错误。


如果这不可能,那么推荐的方法是这样做的?最终输出是,我想从网络上收集已知版本的广告块托管文件,然后将其与我自己的本地托管文件合并。

编辑:发布后我意识到filterSource遵循标记的版本;使用raw.githubusercontent.com可以回答我的原始问题。现在我只是想知道为什么上面的代码块不起作用,以及我将如何达到相同的效果。

1 个答案:

答案 0 :(得分:1)

您可以使用path + string-串联来获得单个文件/子目录。

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,这远远超出了我的理解。

解决实际问题

您可以使用networking.extraHosts选项将额外的条目添加到/etc/hosts中。此属性期望内容直接作为字符串,但是可以使用builtins.readFile来解决。

因此:

networking.extraHosts = builtins.readFile
  (fetchFromGitHub {
    owner = "StevenBlack";
    repo = "hosts";
    rev = "v2.1.19";
    sha256 = "1wrwlgcy46vwji0n1imnmlci03ln0v4qd27cw8cwpag57w06n4z7";
  } + "/hosts");