【问题标题】:How best to create a resource-only package in nix?如何最好地在 nix 中创建仅资源包?
【发布时间】:2020-09-29 06:29:35
【问题描述】:

对于集成测试,我必须获取一些资源。我的想法是拥有一个集成测试数据包可能会很好。我现在做的大概是这样的:

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

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

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

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

谢谢。

【问题讨论】:

    标签: nix


    【解决方案1】:

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

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

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

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

    checkPhase = "${testRunner}/bin/run-tests ${testData}";
    

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 2021-05-04
      • 2018-08-18
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多