فا نیکسی

قلاب‌های patchRcPath

این قلاب‌ها ابزارهای مخصوص شل (با همان نام قلاب) ارائه می‌دهند تا اسکریپت‌های شل را که قرار است توسط کاربران نرم‌افزار سورس (source) شوند، پچ کنند.

کاربرد معمول آن‌ها پچ کردن اسکریپت‌های راه‌اندازی اولیه یا rc در داخل $out/bin یا $out/etc است. این اسکریپت‌ها هنگام سورس شدن، مسیر باینری برخی دستورات را در PATH وارد می‌کنند، متغیرهای محیطی دیگر را تغییر می‌دهند یا مجموعه‌ای از دستورات راه‌اندازی را اجرا می‌کنند. وقتی این اسکریپت‌ها از سوی آپ‌استریم (upstream) عرضه می‌شوند، گاهی از دستوراتی استفاده می‌کنند که ممکن است در محیطی که در آن سورس می‌شوند در دسترس نباشند.

شل‌های سازگار برای هر قلاب عبارت‌اند از:

  • patchRcPathBash: شل‌های Bash، ksh، zsh و سایر شل‌هایی که از بسط‌های پارامتر مشابه Bash پشتیبانی می‌کنند.
  • patchRcPathCsh: اسکریپت‌های Csh، مانند اسکریپت‌هایی که tcsh را هدف قرار می‌دهند.
  • patchRcPathFish: اسکریپت‌های Fish.
  • patchRcPathPosix: شل‌های منطبق با POSIX که از بسط‌های پارامتر محدودِ مشخص‌شده در استاندارد POSIX پشتیبانی می‌کنند. پیاده‌سازی فعلی تنها از بسط پارامتر $استفاده می‌کند.

برای هر شل پشتیبانی‌شده، اسکریپت با یک پیشوندPATH تغییر داده می‌شود که بعداً با پایان یافتن اجرای اسکریپت حذف می‌شود. این ابزار امکان پچ کردن تو‌در‌تو را فراهم می‌کند، که تضمین می‌نماید یک اسکریپت پچ‌شده می‌تواند اسکریپت پچ‌شده‌ی دیگری را سورس کند.

نحو استفاده از این ابزار برای یک اسکریپت:

patchRcPath<shell> <file> <PATH-prefix>

نمونه استفاده:

با داشتن یک بسته foo حاوی اسکریپت راه‌اندازی this-foo.fish که به coreutils، man و which وابسته است، اسکریپت راه‌اندازی را طوری پچ کنید که کاربران بتوانند بدون داشتن وابستگی‌های بالا در PATH خود، آن را سورس کنند:

{
  lib,
  stdenv,
  patchRcPathFish,
}:
stdenv.mkDerivation {

  # ...

  nativeBuildInputs = [ patchRcPathFish ];

  postFixup = ''
    patchRcPathFish $out/bin/this-foo.fish ${
      lib.makeBinPath [
        coreutils
        man
        which
      ]
    }
  '';
}

نکته

پیاده‌سازی patchRcPathCsh و patchRcPathPosix برای انجام پردازش رشته به sed وابسته است. بقیه موارد در شل ساده (vanilla shell) نوشته شده‌اند و هیچ وابستگی به ابزارهای شخص ثالث ندارند.