فا نیکسی

Gradle

Gradle یک ابزار ساخت محبوب برای Java/Kotlin است. خود Gradle در حال حاضر ابزارهایی برای بازتولیدپذیر کردن تفکیک وابستگی‌ها ارائه نمی‌دهد، بنابراین Nixpkgs دارای یک پروکسی طراحی‌شده برای رهگیری درخواست‌های وب Gradle است تا وابستگی‌ها را ثبت کند تا بتوان آن‌ها را به روشی بازتولیدپذیر بازیابی نمود.

ساخت یک بسته Gradle

در ادامه نحوه‌ی شکل‌گیری یک derivation معمولی آمده است:

stdenv.mkDerivation (finalAttrs: {
  pname = "pdftk";
  version = "3.3.3";

  src = fetchFromGitLab {
    owner = "pdftk-java";
    repo = "pdftk";
    tag = "v${finalAttrs.version}";
    hash = "sha256-ciKotTHSEcITfQYKFZ6sY2LZnXGChBJy0+eno8B3YHY=";
  };

  nativeBuildInputs = [
    gradle
    makeWrapper
  ];

  # if the package has dependencies, mitmCache must be set
  mitmCache = gradle.fetchDeps {
    inherit (finalAttrs) pname;
    data = ./deps.json;
  };

  # this is required for using mitm-cache on Darwin
  __darwinAllowLocalNetworking = true;

  gradleFlags = [ "-Dfile.encoding=utf-8" ];

  # defaults to "assemble"
  gradleBuildTask = "shadowJar";

  # will run the gradleCheckTask (defaults to "test")
  doCheck = true;

  installPhase = ''
    mkdir -p $out/{bin,share/pdftk}
    cp build/libs/pdftk-all.jar $out/share/pdftk

    makeWrapper ${lib.getExe jre} $out/bin/pdftk \
      --add-flags "-jar $out/share/pdftk/pdftk-all.jar"

    cp ${finalAttrs.src}/pdftk.1 $out/share/man/man1
  '';

  meta.sourceProvenance = with lib.sourceTypes; [
    fromSource
    binaryBytecode # mitm cache
  ];
})

برای به‌روزرسانی (یا مقداردهی اولیه) وابستگی‌ها، اسکریپت به‌روزرسانی را از طریق چیزی مانند $(nix-build -A <pname>.mitmCache.

{
  lib,
  stdenv,
  gradle,
  # ...
  pdftk,
}:

stdenv.mkDerivation (finalAttrs: {
  # ...
  mitmCache = gradle.fetchDeps {
    pkg = pdftk;
    data = ./deps.json;
  };
})

این به شما امکان می‌دهد هر یک از آرگومان‌های pkg مورد استفاده برای اسکریپت به‌روزرسانی را override کنید (برای مثال، pkg = pdftk.override {'{'}'{'{'}'{'}'} enableSomeFlag = true {'{'}'{'}'}'{'}'};).

روش دوم استفاده از finalAttrs.finalPackage به این صورت است:

stdenv.mkDerivation (finalAttrs: {
  # ...
  mitmCache = gradle.fetchDeps {
    pkg = finalAttrs.finalPackage;
    data = ./deps.json;
  };
})

derivation / اشتقاق ساختwhere appropriate, or justderivationwhen referring to concept/code). Wait, let's keepderivationorderivation / اشتقاق ساخت. "درایویشن‌های pkg" or "derivation این pkg". Let's writederivationorderivation / اشتق

آن true است. اگر ساخت به دلایل مبهمی با شکست مواجه شد، مقدار آن را روی false تنظیم کنید.

  • dontUseGradleConfigure / dontUseGradleBuild / dontUseGradleCheck - force disable the Gradle setup hook for certain phases.
    • dontUseGradleConfigure / dontUseGradleBuild / dontUse