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

问题描述

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

android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"

其中pkgs.stdenv.mkDerivation { resource = [ (fetchResource { url = ...; sha256 = ...; }) ... ]; } 只是减少了样板以使用fetchResources

nix是否有适当的方法来打包通常在fetchzip中使用的这类不可执行的资源?例如,/usr/sharebinlibApplications(?)看起来分别具有硬编码含义,可以在环境路径等中正确设置事物。

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

谢谢。

解决方法

每个下载的项目的存储路径确实具有在复制闭包(例如使用)时对数据进行重复数据删除的好处。二进制缓存。因此,如果对您的数据有意义,则可以编写一个派生类,该派生类通过symlink引用各个未打包的资源。 仅当您的数据项很小或要在dockerTools.buildLayeredImage中使用它们时,存储路径的数量才是考虑因素。buildInputs中存储路径的成本较高(截至2020年)。

派生大约有两种形式。一个人在其存储路径中使用FHS,与nix-env -ienvironment.systemPackagesPATH等一起使用时,可以发现其内容。 另外,派生可以将其数据直接放在其输出路径的根部,当您仅在脚本中引用路径时,这既简单又方便。

选择取决于您的集成测试是否希望FHS位置中的数据可被发现。发现通常通过类似symlinkJoin-的环境变量来工作,但是您也可以使用例如checkPhase = "${testRunner}/bin/run-tests ${testData}"; “覆盖”测试和数据,以便相对路径起作用。

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

for row in bs4.find_all('<td class="series-column"'):
    for link in bs4.find_all('a'):
        if link.has_attr('href') and (link.has_attr('class') == 'formatted-title external-link result-url'):
            print(link.attrs['href'])