개발 셸의 의존성

개발 셸의 의존성#

default.nix에서 소프트웨어를 패키징할 때는 nix-shell로 편리하게 들어가거나 direnv로 자동으로 들어갈 수 있는 shell.nix의 개발 환경이 필요합니다.

default.nix에 있는 패키지의 의존성을 shell.nix의 개발 환경과 어떻게 공유할 수 있습니까?

요약#

pkgs.mkShellNoCC의 inputsFrom 속성을 사용하십시오:

 1# default.nix
 2let
 3  pkgs = import <nixpkgs> {};
 4  myPackage = pkgs.callPackage ./package.nix {};
 5in
 6{
 7  inherit myPackage;
 8  shell = pkgs.mkShellNoCC {
 9    inputsFrom = [ myPackage ];
10  };
11}

shell.nix에서 shell 속성을 가져오십시오:

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

전체 예제#

패키지가 package.nix에 정의되어 있다고 가정합니다:

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

이 예제에서 cowsay는 buildInputs를 사용하여 빌드 시점 의존성으로 선언되어 있습니다.

또한 프로젝트가 default.nix에 정의되어 있다고 가정합니다:

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

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.nix에서 shell 속성을 가져오십시오:

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

개발 환경을 확인하십시오. 빌드 시점 의존성인 cowsay가 포함되어 있습니다:

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

다음 단계#