如何最好地在 nix 中创建仅资源包?

How best to create a resource-only package in nix?

为了集成测试,我必须获取一些资源。我的想法是,拥有一个集成测试数据包可能会很好。我现在正在做的事情大致如下所示:

pkgs.stdenv.mkDerivation {
  resource = [ (fetchResource { url = ...; sha256 = ...; }) ... ];
}

其中 fetchResources 只是减少样板文件以使用 fetchzip

nix 是否有适当的方法来打包这些通常会放在 /usr/share 中的不可执行资源?例如,binlibApplicationsinclude(?) 似乎每个都有硬编码的含义,可以在环境路径等中正确设置事物

最终为每个下载的项目引用不同的 nix 存储路径似乎有点矫枉过正 - 生成一个包含所有数据的包似乎更有意义。但是,我需要一种从其他包中引用它的方法,如果可能的话,我想遵守现有的约定。

谢谢。

每个下载项目的存储路径确实具有在使用例如复制闭包时删除重复数据的好处。二进制缓存。因此,如果它对您的数据有意义,您可以编写一个推导,通过符号链接引用各个解压缩的资源。 如果您的数据项非常小,或者如果您想在存储路径成本更高的 dockerTools.buildLayeredImage 中使用它们(截至 2020 年),存储路径的数量才会成为一个考虑因素。

派生大致有两种形式。一个在其存储路径中使用 FHS,允许其内容在与 buildInputsnix-env -ienvironment.systemPackages 等一起使用时被发现。 或者,派生可以将其数据直接放在其输出路径的根目录下,这在您仅在脚本中引用路径时简单方便。

选择取决于您的集成测试是否需要 FHS 位置中的数据,使其可被发现。发现通常通过一些 PATH- 类似的环境变量来工作,但您也可以通过使用例如symlinkJoin“覆盖”测试和数据,以便相对路径起作用。

我通常建议不要在新应用程序中使用这种自动发现机制,除非有理由,例如与 non-Nix 安装的兼容性。 为了使其易于理解,您几乎无法击败例如

的简单性
checkPhase = "${testRunner}/bin/run-tests ${testData}";