[Linux] nix: 함수형 패키지 관리자

nix는 unix 기반의 함수형 패키지 관리자다.
패키지 관리자와 shell, shell 스크립트 환경을 통합한 독특한 플랫폼이다.

자체적인 신택스를 통해 패키지 단위를 구조화하고, 이를 통해 멀티 버전 관리나 의존성 관리 등을 명확하게 관리하는 것이 주요 목표이자 장점이다.

nix를 기본 쉘과 패키지매니저를 사용하는 리눅스 배포판 "nixOS"가 또 존재하나, 여기서는 다루지 않는다.




구조와 원리

nix의 장점들은 shell의 사용을 전제하지 않고서는 성립되지 않는다.

특정 shell 컨텍스트에 필요한 종속성 목록을 nix 스크립트로 정의해둔 다음, shell로 실행하면 필요한 종속성 목록을 설치해서 shell을 띄우는 것이다.
이 때 설치한 종속성들은 호스트에서는 노출되지 않으며, 해당 shell 컨텍스트 내에서만 유효하게 동작한다.

이를 통해서 별도의 종속성 버전들이 필요한 실행 컨텍스트들을 shell이라는 단위로 추상화하고 분리해서 관리할 수 있는 것이 장점이다.




설치

MacOS, Linux에서 사용할 수 있다. Windows는 WSL2에 한해서만 사용 가능하다.

상세 가이드는 설치 페이지에서 확인할 수 있다.
https://nixos.org/download/#download-nix

fish shell에 대한 설치 가이드가 없는데, bash가 아니라면 좀 다르게 사용해야 한다.

# bash의 경우 
sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install)

# fish
sh ( curl -L https://nixos.org/nix/install | psub) --daemon

뭐가 좀 많다.

설치가 다 끝나고

주요 도구인 nix와 nix-shell이 잘 실행된다면, 잘 설치된 것이다.




사용해보기

먼저 디렉터리에 shell.nix라는 예약된 이름의 파일을 작성해야 한다.
Dockerfile처럼 암묵적으로 정해진 이름이다.

vi shell.nix
let
  pkgs = import <nixpkgs> {};
in pkgs.mkShell {
  nativeBuildInputs = [
    pkgs.python3
    pkgs.nodejs
  ];
}

이런 식으로, 필요한 종속성을 정의해준다.
내 경우에는 python3와 nodejs를 설치하도록 했다.

지원되는 패키지 목록을 다음 사이트에서 참조할 수 있다.
https://search.nixos.org/packages
저건 원래 있던 언어는 아니고, nix expression language라는 자기들만의 고유 언어다.
문법에 대한 것은 대충 넘어가겠다.

그리고 shell.nix 파일이 있는 위치에서 nix-shell을 실행하면, 바로 시작된다.

필요한 종속성들을 설치하고

shell 컨텍스트가 실행된다.

그럼 여기서는 바깥, host의 종속성들을 사용하되, 여기서 추가로 설치한게 있다면 그걸 우선으로 사용하게끔 처리된다.

그래서 바깥과의 버전을 확인해보면

실제로 다른 버전이 설치되어서 실행될 것이다.

그리고 나갔다 들어와도, 해당 shell 종속성은 그대로 유지된 채다.

내부적으로, nix를 통해 설치된 파일들은 /nix/store라는 경로에 배치된다.

그렇다.



참조
https://discourse.nixos.org/t/how-is-the-state-of-nix-support-for-fish-shell/9260/3
https://blog.sapzil.org/2021/05/09/nix/
https://blog.sapzil.org/2021/05/09/nix/