فا نیکسی

وابستگی‌ها در شل توسعه

هنگام بسته‌بندی نرم‌افزار در default.nix، احتمالاً می‌خواهید یک محیط توسعه در shell.nix داشته باشید تا بتوانید به راحتی با nix-shell یا به‌طور خودکار با direnv وارد آن شوید.

چگونه می‌توان وابستگی‌های بسته را در default.nix با محیط توسعه در shell.nix به اشتراک گذاشت؟

خلاصه

از صفت inputsFrom در pkgs.mkShellNoCC استفاده کنید:

# default.nix
let
  pkgs = import <nixpkgs> {};
  myPackage = pkgs.callPackage ./package.nix {};
in
{
  inherit myPackage;
  shell = pkgs.mkShellNoCC {
    inputsFrom = [ myPackage ];
  };
}

صفت shell را در shell.nix درون‌ریزی کنید:

# shell.nix
(import ./.).shell

مثال کامل

فرض کنید بستهٔ شما در package.nix تعریف شده است:

# package.nix
{ cowsay, runCommand }:
runCommand "cowsay-output" { buildInputs = [ cowsay ]; } ''
  cowsay Hello, Nix! > $out
''

در این مثال، cowsay با استفاده از buildInputs به عنوان یک وابستگی ساخت اعلام می‌شود.

علاوه بر این، فرض کنید پروژه شما در default.nix تعریف شده است:

# default.nix
let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-23.11";
  pkgs = import nixpkgs { config = {}; overlays = []; };
in
{
  myPackage = pkgs.callPackage ./package.nix {};
}

یک صفت (attribute) برای تعیین یک محیط به default.nix اضافه کنید:

 let
   nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-23.11";
   pkgs = import nixpkgs { config = {}; overlays = []; };
 in
 {
   myPackage = pkgs.callPackage ./package.nix {};
+  shell = pkgs.mkShellNoCC {
+  };
 }

صفت myPackage را به درون اتصال let منتقل کنید تا امکان استفاده مجدد از آن فراهم شود. سپس وابستگی‌های بسته را با استفاده از inputsFrom وارد محیط کنید:

 let
   nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-23.11";
   pkgs = import nixpkgs { config = {}; overlays = []; };
+  myPackage = pkgs.callPackage ./package.nix {};
 in
 {
-  myPackage = pkgs.callPackage ./package.nix {};
+  inherit myPackage;
   shell = pkgs.mkShellNoCC {
+    inputsFrom = [ myPackage ];
   };
 }

در نهایت، صفت shell را در فایل shell.nix درون‌ریزی کنید:

# shell.nix
(import ./.).shell

محیط توسعه را بررسی کنید، این محیط حاوی وابستگی ساخت cowsay است:

$ nix-shell --pure
[nix-shell]$ cowsay shell.nix

گام‌های بعدی

nix.dev/guides/recipes/sharing-dependencies

نیکسی · یادداشت‌های فارسی Nix local fonts