동음이의어에 대한 내용은 닉스(동음이의어) 문서 참고하십시오.
<colbgcolor=#7eb9e3><colcolor=#fff> Nix | |
종류 | 패키지 매니저, 프로그래밍 언어 |
출시 | 2003년 6월 15일 |
최초 개발자 | 엘코 돌스트라 |
개발 | NixOS Team |
언어 | C++ |
플랫폼 | Linux, Darwin, FreeBSD |
버전 | 2.25.4 |
라이선스 | GNU 약소 일반 공중 사용 허가서 2.1 |
링크 |
[clearfix]
1. 개요
리눅스 및 Darwin 운영체제용 선언적, 재현적 패키지 관리자.2. 특징
전역 설치밖에 할 수 없는 다른 리눅스 패키지 관리자들과는 다르게, 모든 패키지를/nix/store
하위의 독립된 디렉토리에 설치한다. 개별 버전의 패키지는 전부 고유한 해시 값을 가지며, 따라서 버전이 올라가면 store
하위의 폴더 이름도 바뀌어, 새로운 공간에 설치된다. 종속성 또한 이러한 해시를 가지고 있으며, 따라서 같은 이름의 서로 다른 버전의 라이브러리를 동시에 설치하거나, 여러 프로그램이 각각이 찾는 버전의 라이브러리를 링크하는 일도 가능하다.3. 문법
튜토리얼패키지를 정의하기 위해 자체적인 도메인 특화 언어를 가지고 있으며, 이를 이용해 패키지와 설정을 모두 정의한다. JSON과 매우 닯았다.
속성 집합(attribute sets)이 핵심적인 자료구조로, 다음과 같이 정의한다.
{ key1 = val1; key2 = val2; }
이 때 집합을 정의하면서 자신이 이미 가진 key의 값을 참조해 다른 key의 값을 정의하는 것도 가능한데, 이를 재귀적 정의라고 한다. 재귀적 정의를 하기 위해선 rec
키워드를 붙여야 한다.rec {
one = 1;
two = one + 1;
}
함수는 으레 함수형 언어들이 그렇듯 커링(currying) 활용을 위해 단 하나의 인자만 받는다.[1]
:
의 왼쪽에 오는 식별자가 인자, 우측에 오는 식별자가 치환(replace)될 표현식(expression)이다.x: x + 1
여러 인자를 받는다면 커링을 활용한다.x: y: x + y
4. 환경
5. 패키징
6. nixpkgs
Nix 패키지들의 중앙 레지스트리.
.nix
패키지들의 Git 저장소 형태로 구성되어 있으며, 현재 약 10만개가 넘는 패키지를 보유하고 있다. nixpkgs 저장소 자체는 패키지 정의 소스 파일들만 포함하고, 실제 각 플랫폼별로 빌드된 derivations 바이너리는 자체 CI 시스템인 hydra에 캐시된다.6.1. channel
#안정 상태 정책에 따라 nixpkgs 저장소의 특정 리비전을 가르키는 브랜치. 대표적으로 매일 업데이트되는
unstable
이 있으며, nixos기준으로 6개월마다 한번씩 관리되는 메이저 버전이 존재한다.nixpkgs가 아닌 추가(extra) 채널도 사용할 수 있는데, 대표적인 예시가 home-manager. primary채널을 설정하기 위해선 channel alias를
nixpkgs
또는 nixos
로 설정해야 한다.7. flakes
공식 위키2019년부터 개발되어 2021년부터 실험적 기능(experimental feature)으로 도입된 신기능으로, 핵심적으로 nixpkgs에서 모든 종속성의 버전을 고정하는 기능을 추가한다.
8. 파생 소프트웨어
- home-manager
- nix-search-cli
- lix - Nix 구현체
- GUIX - GNU의 Sheperd init사용# NixOS 구현체
- lazamar nix-versions - nixpkgs의 채널별 패키지를 인덱싱한 데이터베이스. 주로 호환성 이슈로 과거 패키지 버전을 찾아야 하지만 flake가 없을 때 사용된다.
8.1. NixOS
자세한 내용은 NixOS 문서 참고하십시오.8.2. nix-darwin
Nix 패키지 매니저 및 NixOS 정의 구조를 Darwin 커널에도 적용하는 프로젝트.
[1] A function always takes exactly one argument. Argument and function body are separated by a colon