我在从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
可以回答我的原始问题。现在我只是想知道为什么上面的代码块不起作用,以及我将如何达到相同的效果。
答案 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");