فا نیکسی

Perl

اجرای برنامه‌های Perl در شل

هنگام اجرای یک اسکریپت Perl، ممکن است با خطایی مانند ./myscript.pl: bad interpreter: /usr/bin/perl: no such file or directory مواجه شوید. این اتفاق زمانی می‌افتد که اسکریپت انتظار دارد Perl در /usr/bin/perl نصب شده باشد، که هنگام استفاده از Perl از Nixpkgs این‌طور نیست. می‌توانید با تغییر سطر اول به شکل زیر، اسکریپت را برطرف کنید:

#!/usr/bin/env perl

تا نصب Perl از متغیر محیطی PATH گرفته شود، یا Perl مستقیماً با:

$ perl ./myscript.pl

هنگامی که اسکریپت از یک کتابخانه Perl استفاده می‌کند که به صورت سراسری نصب نشده است، ممکن است با خطایی مانند Can't locate DB_File.pm in @INC (you may need to install the DB_File module) مواجه شوید. در این صورت، می‌توانید از nix-shell برای راه‌اندازی یک شل آنی (ad-hoc) به همراه آن کتابخانه نصب‌شده استفاده کنید، برای نمونه:

$ nix-shell -p perl perlPackages.DBFile --run ./myscript.pl

اگر همیشه از اسکریپت در محیط‌هایی استفاده می‌کنید که nix-shell در دسترس است، می‌توانید فراخوانی nix-shell را به این شکل در شبانگ قرار دهید:

#!/usr/bin/env nix-shell
#! nix-shell -i perl -p perl perlPackages.DBFile

بسته‌بندی برنامه‌های Perl

Nixpkgs تابع buildPerlPackage را ارائه می‌دهد؛ یک تابع عمومی سازنده بسته برای هر بسته Perl که دارای یک Makefile.PL استاندارد باشد. این تابع در [pkgs/development/

{
  ClassC3 = buildPerlPackage rec {
    pname = "Class-C3";
    version = "0.21";
    src = fetchurl {
      url = "mirror://cpan/authors/id/F/FL/FLORA/Class-C3-${version}.tar.gz";
      hash = "sha256-/5GE5xHT0uYGOQxroqj6LMU7CtKn2s6vMVoSXxL4iK4=";
    };
  };
}

به استفاده از mirror://cpan/ و همچنین pname و version در تعریف URL دقت کنید تا مطمئن شوید صفت pname با سورس واقعی که در حال بارگیری آن هستیم سازگار است. بسته‌های Perl در all-packages.nix از طریق متغیر perlPackages در دسترس قرار می‌گیرند. برای نمونه، اگر بسته‌ای دارید که به ClassC3 نیاز دارد، معمولاً این‌گونه می‌نویسید:

{
  foo = import ../path/to/foo.nix {
    inherit
      stdenv
      fetchurl # ...
      ;
    inherit (perlPackages) ClassC3;
  };
}

در all-packages.nix. می‌توانید ساخت یک بسته Perl را به صورت زیر تست کنید:

$ nix-build -A perlPackages.ClassC3

برای نصب آن با nix-env در عوض: nix-env -f. -iA perlPackages.ClassC3.

بنابراین buildPerlPackage چه کاری انجام می‌دهد؟ موارد

{
  buildPerlPackage,
  fetchurl,
  db,
}:

buildPerlPackage rec {
  pname = "BerkeleyDB";
  version = "0.36";

  src = fetchurl {
    url = "mirror://cpan/authors/id/P/PM/PMQS/BerkeleyDB-${version}.tar.gz";
    hash = "sha256-4Y+HGgGQqcOfdiKcFIyMrWBEccVNVAMDBWZlFTMorh8=";
  };

  preConfigure = ''
    echo "LIB = ${db.out}/lib" > config.in
    echo "INCLUDE = ${db.dev}/include" >> config.in
  '';
}

وابستگی‌ها به سایر بسته‌های Perl را می‌توان در صفات buildInputs و propagatedBuildInputs مشخص کرد. اگر موردی منحصراً یک وابستگی زمان ساخت است، از buildInputs استفاده کنید؛ اگر (همچنین) یک وابستگی زمان اجرا است، از propagatedBuildInputs

{
  ClassC3Componentised = buildPerlPackage rec {
    pname = "Class-C3-Componentised";
    version = "1.0004";
    src = fetchurl {
      url = "mirror://cpan/authors/id/A/AS/ASH/Class-C3-Componentised-${version}.tar.gz";
      hash = "sha256-ASO9rV/FzJYZ0BH572Fxm2ZrFLMZLFATJng1NuU4FHc=";
    };
    propagatedBuildInputs = [
      ClassC3
      ClassInspector
      TestException
      MROCompat
    ];
  };
}

تولید از CPAN

عبارت‌های Nix برای بسته‌های Perl می‌توانند (تقریباً) به طور خودکار از CPAN تولید شوند. این کار توسط برنامه nix-generate-from-cpan انجام می‌شود که می‌توان آن را به صورت زیر نصب کرد:

$ nix-env -f "<nixpkgs>" -iA nix-generate-from-cpan

برای استفاده از آخرین نسخه، <nixpkgs> را با مسیر کلونی از nixpkgs جایگزین کنید.

این برنامه نام یک ماژول Perl را

$ nix-generate-from-cpan XML::Simple
  XMLSimple = buildPerlPackage rec {
    pname = "XML-Simple";
    version = "2.22";
    src = fetchurl {
      url = "mirror://cpan/authors/id/G/GR/GRANTM/XML-Simple-2.22.tar.gz";
      hash = "sha256-uUUO8i6pZErl1q2ghtxDAPoQW+BQogMOvU79KMGY60k=";
    };
    propagatedBuildInputs = [ XMLNamespaceSupport XMLSAX XMLSAXExpat ];
    meta = {
      description = "API for simple XML files";
      license = with lib.licenses; [ artistic1 gpl1Plus ];
    };
  };

ور غیرمستقیم) یک ماژول بومی را درون‌ریزی کند. در این حالت، باید یک استاب (stub) برای آن ماژول بسازید که Makefile.PL را