개발 셸의 의존성#
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