Nixで1つの派生を隣の別の派生に依存させる方法は?

Nixで1つの派生を隣の別の派生に依存させる方法は?

現在、一部のプライベートソースソフトウェアをNixフォークにパッケージ化しようとしています。アプリケーションは.debファイルの束として配布され、ほとんどはアプリケーションの他の部分で利用可能なライブラリを含みます。

簡単にするために、app.deb実際のアプリケーションが含まれており、lib.debアプリケーションに必要なライブラリが含まれているとします。

現在私は以下を持っています:

# default.nix
let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-23.11";
  pkgs = import nixpkgs {
    config = { };
    overlays = [ ];
  };
in {
  lib = pkgs.callPackage ./lib.nix { };
  app = pkgs.callPackage ./app.nix { };
}
# lib.nix
{ lib, stdenv, autoPatchelfHook, dpkg, requireFile,
libcxx, libgcc, }:

stdenv.mkDerivation {
  pname = "myapp-lib";
  version = "1.0.0";
  src = requireFile {
    name = "lib.deb";
    sha256 = "313e8686118ccba397de0bdfca101f1053b758227fd9d3510ea78644f2450bfe";
    url = "https://softwarecorp.example/downloads";
  };

  nativeBuildInputs = [
    dpkg
    autoPatchelfHook
  ];

  unpackPhase = "dpkg-deb -x $src .";

  buildInputs = [ libcxx libgcc ];

  installPhase = ''
    cp -r lib $out/
  '';
}
# app.nix
{ lib, stdenv, autoPatchelfHook, dpkg, requireFile,
libcxx, }:

stdenv.mkDerivation {
  pname = "myapp-bin";
  version = "1.0.0";
  src = requireFile {
    name = "app.deb";
    sha256 = "f4abbdb3f83d982569c5cd30ce5ad63ec4e49011d165e17a2c59d9a613f163b9";
    url = "https://softwarecorp.example/downloads";
  };

  nativeBuildInputs = [
    dpkg
    autoPatchelfHook
  ];

  unpackPhase = "dpkg-deb -x $src .";

  buildInputs = [ libcxx ];

  installPhase = ''
    cp -r bin $out/
  '';

  runtimeDependencies = [ myapp-lib ];  # <-- how to do this?
}

派生は独自に構築され、派生libに含まれる内容を追加したいと思います。appファイルの上部にある一般パッケージの依存関係リストに追加することはできません。また、この時点でパッケージをnixpkgsに送信することを避けたいと思います。なぜなら、アプリケーションを完全にパッケージ化できるかどうかはわかりませんし、完了できることがわかるまで、管理者として機能したくないからです。

あるいは、そのようなクローズドソースソフトウェアをパッケージ化して広範な派生を必要としないようにするための良いパターンはありますか?私が知る限り、ここのライブラリはすべて同じバージョンを持っており、会社の製品の他の場所では絶対に使用されていないので、ここに単一のフォークを構築することは許可されています。

ベストアンサー1

ダブルブランチを防ぐために、ライブラリをパッケージ化せずinstallPhasepostUnpack

# app.nix
{
  stdenv,
  autoPatchelfHook,
  dpkg,
  requireFile,
  libcxx,
}: let
  myLib = requireFile {
    name = "lib.deb";
    sha256 = "313e8686118ccba397de0bdfca101f1053b758227fd9d3510ea78644f2450bfe";
    url = "https://softwarecorp.example/downloads";
  };
in
  stdenv.mkDerivation {
    pname = "myapp-bin";
    version = "1.0.0";
    src = requireFile {
      name = "app.deb";
      sha256 = "f4abbdb3f83d982569c5cd30ce5ad63ec4e49011d165e17a2c59d9a613f163b9";
      url = "https://softwarecorp.example/downloads";
    };

    nativeBuildInputs = [
      dpkg
      autoPatchelfHook
    ];

    unpackPhase = "dpkg-deb -x $src .";

    postUnpack = ''
      dpkg-deb -x ${myLib} .
      cp -r lib $out/
    '';

    buildInputs = [libcxx];

    installPhase = ''
      cp -r bin $out/
    '';
  }

コンボepson-alc1100これは実装の例です。

おすすめ記事