代码之家  ›  专栏  ›  技术社区  ›  stites James

从GitHub获取、过滤并用作环境等“file”.source

  •  1
  • stites James  · 技术社区  · 6 年前

    我在从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 manual: 15.5. Builtin functions ,我也尝试使用 cleanSourceWith --主要是因为我找不到 .outPath lib.cleanSourceWith (回想起来,这只是一个电话 filterSource ).


    如果这是不可能的,什么是建议的路线做这样的事情?最后的输出是,我希望从整个web收集已知的、版本化的ad块主机文件,然后将它们与我自己的本地主机文件合并。

    编辑:我在发布后意识到了这一点 raw.githubusercontent.com fetchurl 这将回答我最初的问题。现在我只是想知道为什么上面的代码块不起作用,我怎么会得到同样的效果。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Teo Klestrup Röijezon    6 年前

    您可以使用 path string -串联。

    environment.etc."sb_hosts".source =
      fetchFromGitHub {
        owner = "StevenBlack";
        repo = "hosts";
        rev = "v2.1.19";
        sha256 = "1wrwlgcy46vwji0n1imnmlci03ln0v4qd27cw8cwpag57w06n4z7";
      } + "/hosts";
    

    为什么这样做有效?

    您可以将路径与字符串连接以引用子路径(它也将是 路径 ).派生(例如 fetchFromGitHub args )隐式强制到构建后将生成的路径。

    为什么问题中提出的解决方案不起作用?

    builtins.filterSource lib.cleanSource{,With} )我会复印一份 路径 之后 谓词被应用。

    __pycache__ 或者 .git

    已经

    错误消息是什么意思?

    /nix/store/r3xnh6ricqa7lnnbb0ka5vb0h6rw28ap-source 是派生的输出,因此Nix强制它存在(或已构建),然后才能依次构建使用它的任何对象。为什么他们选择称之为这种关系 refers 这远远超出我的理解。

    解决问题 实际的 问题

    您可以将额外的条目添加到 /etc/hosts 使用 networking.extraHosts 选择权。此属性要求内容直接作为字符串,但可以使用 builtins.readFile .

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