최근 수정 시각 : 2025-12-08 11:48:41

Nix


파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 동음이의어}}}에 대한 내용은 [[닉스(동음이의어)]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[닉스(동음이의어)#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[닉스(동음이의어)#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
동음이의어: }}}[[닉스(동음이의어)]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[닉스(동음이의어)#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[닉스(동음이의어)#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

[[프로그래밍 언어|'''프로그래밍 언어
{{{#!wiki style="font-family: Times New Roman, serif; display: inline;"
]]
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px"
{{{#!wiki style="display: inline-table; min-width: 40%; min-height: calc(1.5em + 5px)"
{{{#!folding [ 목록 ]
{{{#!wiki style="margin: -5px -1px"
<colbgcolor=royalblue><colcolor=#fff> ※ 나무위키에 등재된 프로그래밍 언어 목록
AActionScript · AdaT · AgdaTP · ALGOLT · ApexT · APL · awk · AssemblyT
BBASIC
C파일:C언어 로고.svg CT · 파일:C C#T · 파일:C++ 로고.svg C++T · CarbonT · 파일:clojure_logo.png ClojureS · COBOLT · CoffeeScript · Common LispS · CrystalT
D파일:external/upload.wikimedia.org/D_programming_language_logo.png DT · 파일:Dart 심볼.svg DartT
EElixir · 파일:Elm_logo.svg.png elmT · Erlang
F파일:fsharp-logo.png F#T · Factor · 파일:fennel-logo.svg FennelS · 파일:forth.png Forth · FortranT
GGNU Octave · 파일:Go 로고.svg GoT · Groovy
H파일:Haskell 로고 심볼.svg HaskellT · HolyCT · Haxe
I
J파일:Java 로고.svg JavaT · 파일:JavaScript 로고.svg JavaScript · 파일:julia-dots.svg Julia
K파일:Kotlin 심볼.svg KotlinT
LLeanTP · 파일:LISP_logo.svg LISPS · 파일:Lua 로고.svg Lua
MMATLAB · MaxV · MojoT · Moonlight
N파일:Nim 왕관 로고.svg NimT · 파일:Nix 로고.svg Nix
OOberonT · Objective-CT · 파일:ocaml.svg OCamlT
PPascalT · Perl · 파일:PHP 로고.svg PHP · Processing · Prolog · 파일:Python 심볼.svg Python
QQ#T · QML
R파일:R 로고.svg R · 파일:racket-logo.svg RacketS · Raku · ReasonMLT · 파일:rocq.png RocqTP · 파일:Ruby 로고.svg Ruby · 파일:Rust 로고.svg파일:Rust 로고 화이트.svg RustT
SSAS · 파일:Scala 로고.png ScalaT · SchemeS · 파일:스크래치(교육 플랫폼) 로고.svg ScratchV · sed · Shell Script · Smalltalk · SQL · 파일:Swift 심볼 배경.svg SwiftT
T파일:Typescript_logo_2020.svg TypeScriptT
UUdon
VVisual Basic · Visual Basic .NET · Visual Basic for Applications · vvvvV
WWave
XXSharp
Y
ZZenScript · 파일:Zig 로고마크.svg ZigT
한글누리 · V · 씨앗 · 약속 · 파일:엔트리 아이콘.svg 엔트리V · 창조
T: 정적 타입 프로그래밍 언어 · P: 증명 보조 언어 · S: LISP 방언 및 S-표현식 기반 언어 · V: 시각적 프로그래밍 언어 }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 40%; min-height: calc(1.5em + 5px)"
{{{#!folding [ 순위 ]
{{{#!wiki style="margin: -5px -1px -10px"
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px"
{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ IEEE Spectrum 2025 ]
{{{#!wiki style="margin: -5px -1px"
<tablewidth=100%><tablebgcolor=transparent><colbgcolor=#11a500><colcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 <colbgcolor=#ff1100><colcolor=#fff> 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 Python
2 Java 2 SQL
3 C++ 3 Java
4 SQL 4 JavaScript
5 C# 5 TypeScript
6 JavaScript 6 C#
7 TypeScript 7 C++
8 C 8 HTML
9 Shell 9 Go
10 Go 10 Shell }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ Stack Overflow 2025 ]
{{{#!wiki style="margin: -5px -1px"
<colbgcolor=#ffa500><colcolor=#fff> 2025년 Stackoverflow 설문조사 상위 25개 프로그래밍 언어
1 JavaScript <colbgcolor=#ffa500><colcolor=#fff> 14 Rust
2 HTML & CSS 15 Kotlin
3 SQL 16 Lua
4 Python 17 어셈블리어
5 Bash/Shell 18 Ruby
6 TypeScript 19 Dart
7 Java 20 Swift
8 C# 21 R
9 C++ 22 Groovy
10 PowerShell 23 Visual Basic
11 C 24 VBA
12 PHP 25 MATLAB
13 Go }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ TIOBE 2025 ]
{{{#!wiki style="margin: -5px -1px"
<colbgcolor=#2777c2><colcolor=#fff> 2025년 10월 TIOBE 검색어 점유율 상위 20개 프로그래밍 언어
1 Python <colbgcolor=#2777c2><colcolor=#fff> 11 Fortran
2 C 12 Perl
3 C++ 13 R
4 Java 14 PHP
5 C# 15 Assembly language
6 JavaScript 16 Rust
7 Visual Basic 17 MATLAB
8 Go 18 Scratch
9 Delphi / Object Pascal 19 Ada
10 SQL 20 Kotlin }}}}}}}}}{{{#!wiki style="display: inline-table; min-width: 25%; min-height: calc(1.5em + 5px)"
{{{#!folding [ PYPL 2025 ]
{{{#!wiki style="margin: -5px -1px -10px"
<colbgcolor=green><colcolor=#fff> 2025년 11월 PYPL 검색어 점유율 상위 20개 프로그래밍 언어
1 Python <colbgcolor=green><colcolor=#fff> 11 Ada
2 Java 12 TypeScript
3 C++ 13 MATLAB
4 Objective-C 14 Kotlin
5 R 15 PowerShell
6 JavaScript 16 Go
7 C# 17 Dart
8 Swift 18 Ruby
9 PHP 19 Lua
10 Rust 20 VBA }}}}}}}}}}}} }}}}}}}}}}}}
실행 방식 · 분류 · 언어 목록(분류:프로그래밍 언어 문법) · 언어별 예제 · 틀:프로그래밍 언어 문법 · 틀:난해한 프로그래밍 언어
<colbgcolor=#7eb9e3,#4f73bc><colcolor=#fff,#fff> Nix
<nopad>파일:nix.svg
종류 패키지 매니저, 프로그래밍 언어
출시 2003년 6월 15일
최초 개발자 엘코 돌스트라
개발 NixOS Team
언어 C++
플랫폼 Linux, Darwin, FreeBSD
버전 2.32.4
라이선스 GNU 약소 일반 공중 사용 허가서 2.1
링크 파일:홈페이지 아이콘.svg 파일:GitHub 아이콘.svg파일:GitHub 아이콘 화이트.svg
1. 개요2. 특징3. 문법4. 환경5. 패키징6. nixpkgs
6.1. channel
7. flakes8. 파생 소프트웨어
8.1. NixOS8.2. nix-darwin8.3. home-manager
9. 기타10. 단점11. 외부 링크

1. 개요

리눅스Darwin 운영체제용 선언적, 재현적 패키지 관리자.

2. 특징

전역 설치밖에 할 수 없는 다른 리눅스 패키지 관리자들과는 다르게, 모든 패키지를 /nix/store 하위의 독립된 디렉토리에 설치한다. 개별 버전의 패키지는 전부 고유한 해시 값을 가지며, 따라서 버전이 올라가면 store 하위의 폴더 이름도 바뀌어, 새로운 공간에 설치된다. 종속성 또한 이러한 해시를 가지고 있으며, 따라서 같은 이름의 서로 다른 버전의 라이브러리를 동시에 설치하거나, 여러 프로그램이 각각이 찾는 버전의 라이브러리를 링크하는 일도 가능하다.

3. 문법

튜토리얼

패키지를 정의하기 위해 자체적인 도메인 특화 언어를 가지고 있으며, 이를 이용해 패키지와 설정을 모두 정의한다. JSON과 매우 닯았다.

속성 집합(attribute sets)이 가장 핵심적인 자료구조로, 다음과 같이 정의한다.
{ key1 = val1; key2 = val2; }
이 때 집합을 정의하면서 자신이 이미 가진 key의 값을 참조해 다른 key의 값을 정의하는 것도 가능한데, 이를 재귀적 정의라고 한다. 재귀적 정의를 하기 위해선 rec 키워드를 붙여야 한다.
rec {
  one = 1;
  two = one + 1;
}
속성 집합은 각각의 속성을 키로 하여 값을 접근할 수 있다.
{ name = "namu"; age = 20; }.name
> "namu"

변수 선언은 OCaml과 유사한 let 표현을 사용한다. 구문이 아닌 표현(expression)이기 때문에, 해당 변수가 사용되는 스코프가 명시적으로 나타난다. LISP식 변수 선언을 떠올려도 좋다. 가령 다음의 표현식은
let
  phrase = "Hello";
  name = "namuwiki";
in "${phrase}, ${name}!"
최종적으로 "Hello, namuwiki!"라는 문자열로 평가되어 반환된다. 이 때 ${} 문자열 보간이다.

함수는 으레 함수형 언어들이 그렇듯 커링(currying) 활용을 위해 단 하나의 인자만 받는다.[1] :의 왼쪽에 오는 식별자가 인자, 우측에 오는 식별자가 치환(replace)될 표현식(expression)이다.
x: x + 1
여러 인자를 받는다면 커링을 활용한다.
x: y: x + y

호출은 람다 대수 기반의 언어와 마찬가지로 함수와 인자를 공백으로 구분한다. 커링이 되므로, 여러 인자가 있는 경우 각각의 인자 또한 공백으로 띄어 쓴다.
let addTwo = x: y: x + y;
in addTwo 10 20
> 30

4. 환경

5. 패키징

Nix는 결정적(deterministic)이고 재현적(reproducible)인 패키지 관리자로, Nix로 작성된 소스 코드를 통해 같은 환경에 대해 항상 정확히 똑같은 패키지를 만들어낼 수 있다. 이 과정에서 생성되는 아티팩트를 derivation이라고 하며, Nix를 활용한 시스템에서 사실상의 기초 원소(building block) 역할을 한다. Nix에서는 바이너리, 라이브러리 코드, 설정 등 거의 대부분의 정적 데이터가 derivation으로 표현되고 패키징될 수 있다.

모든 derivation은 내장 derivation 함수를 통해서 만들어진다. mkDerivation, mkShell 등 다양한 유틸리티 함수들도 내부적으로 derivation을 호출한다.

6. nixpkgs

파일:GitHub 아이콘.svg파일:GitHub 아이콘 화이트.svg

Nix 패키지들의 중앙 레지스트리. .nix 패키지들의 Git 저장소 형태로 구성되어 있으며, 현재 약 10만개가 넘는 패키지를 보유하고 있다. nixpkgs 저장소 자체는 패키지 정의 소스 파일들만 포함하고, 실제 각 플랫폼별로 빌드된 derivations 바이너리는 자체 CI 시스템인 hydra에 캐시된다.

패키지 검색은 search.nixos.org에서 할 수 있다. 검색 시 이름이나 설명에 맞는 패키지가 나오고, nixpkgs의 실제 소스 코드나 개별 홈페이지로 연결되는 식.

6.1. channel

모든 채널 목록 Wiki

안정 상태 정책에 따라 nixpkgs 저장소의 특정 리비전을 가리키는 브랜치. 대표적으로 매일 업데이트되는 unstable이 있으며, nixos기준으로 6개월마다 한번씩 관리되는 메이저 버전이 존재한다.

nixpkgs가 아닌 추가(extra) 채널도 사용할 수 있는데, 대표적인 예시가 home-manager. primary채널을 설정하기 위해선 channel alias를 nixpkgs또는 nixos로 설정해야 한다.

각 구독(subscribe)된 channel 목록은 리눅스 유저마다 별개로 관리되기 때문에,# nix-channel을 실행한 유저에 따라 다른 값이 보여질 수 있다. 가령 flake 없이 NixOS를 사용하는 경우 $ sudo nix-channel --list를 해야 NixOS 설정에서 참조하는 nixos channel 버전을 확인할 수 있다.#

7. flakes

공식 위키

2019년부터 개발되어 2021년부터 실험적으로 도입된 신기능으로, 핵심적으로 nixpkgs에서 모든 종속성의 버전을 고정하는 기능을 추가한다.

flake를 사용하게 되면 리눅스 유저 단위로 관리되던 channel 정보를 하나의 파일 단위로 관리할 수 있는데, 이 파일을 lock이라 부른다. 파일 시스템에는 flake.lock으로 저장된다. 기본적으로 모든 flake는 여러 input과 여러 output을 가지는 하나의 큰 속성 집합으로, 각각의 flake는 또다른 flake를 input으로 가질 수 있다. 이 때 선언된 각각의 input은 flake의 동작에 따라 적절하게 resolve된 뒤(가령 GitHub 저장소 등) flake.lock 파일에 고정되며, output 함수에서 재사용된다. 락파일에 고정된 input들은 기본적으로 반영구적으로 고정되지만, 추후 nix flake update 등으로 갱신할 수 있다.

이때 각 flake의 output은 outputs라는 이름을 가진 하나의 함수로 정의된다. 기존의 Nix에서는 딱히 컨벤션이 없었기 때문에 빌드 목적인지(derivation 반환), nix-shell 목적인지, NixOS 설정용인지, 라이브러리인지 등에 따라 개발자가 원하는 어떠한 형식의 Nix 표현식도 반환할 수 있었지만, flake에서는 반드시 목적에 따라 사전에 정해진 속성에만 배치해야 한다. 가령 패키징용 derivation은 packages.${system}.*, devshell(nix develop) 설정은 devShells.${system}.*, nix run용 executable derivation은 apps.${system}.*, NixOS 설정은 nixosConfigurations.*, 라이브러리는 lib.*로 내보내는 식이다.

Git 종속성이 매우 강한 편이다. Git을 적극적으로 사용하지 않는다면 다소 불편한 점들을 마주칠 수 있고, 반대로 git을 적극적으로 사용하면 외부 flake resolution 등이 매우 직관적이고 쉬워진다. Go의 module system v3와 비슷한 특징.

flake.nix는 정적 분석을 위해 일반적인 Nix 표현식을 평가하지 않으며, 사실상 outputs 함수를 제외한 바깥의 영역은 문법만 같지 Nix 언어가 아닌 JSON처럼 완전히 정적인 파일 형식에 가깝다. 때문에 동적으로 flake 설정을 생성할 수 없다는 등의 단점이 있다.#3966

8. 파생 소프트웨어

  • nix-search-cli
  • lix - Nix 구현체
  • GUIX - GNU의 Sheperd init사용# NixOS 구현체
  • lazamar nix-versions - nixpkgs의 채널별 패키지를 인덱싱한 데이터베이스. 주로 호환성 이슈로 과거 패키지 버전을 찾아야 하지만 flake가 없을 때 사용된다.

8.1. NixOS

파일:상세 내용 아이콘.svg   자세한 내용은 NixOS 문서
#!if (문단 == null) == (앵커 == null)
를
#!if 문단 != null & 앵커 == null
의 [[NixOS#s-|]]번 문단을
#!if 문단 == null & 앵커 != null
의 [[NixOS#|]] 부분을
참고하십시오.

8.2. nix-darwin

파일:GitHub 아이콘.svg파일:GitHub 아이콘 화이트.svg

Nix 패키지 매니저 및 NixOS 정의 구조를 Darwin 커널에도 적용하는 프로젝트.

8.3. home-manager

home-manager

유저 레벨 설정 관리자. NixOS와 다르게 일반 배포판에서도 쓰일 수 있다.

다만 NixOS 모듈의 모든 내용을 구현한 것은 아니라 기능에 부족한 점이 있을 수 있다. 모든 option은 저장소에서 관리되나, search.nixos.org와 비슷하게 home-manager-options.extranix.com 등에서 빠르게 옵션을 검색할 수 있다.

9. 기타

  • experimental-flake 플래그가 켜져 있다면 nix replREPL을 실행할 수 있다.
  • flake 사용시 nixpkgs 인스턴스의 중복 생성을 막으려면 import 대신 nixpkgs.legacyPackages.${system}​를 쓰는 것이 좋다.##

10. 단점

  • 진입장벽이 매우 높은 편으로, 충분한 사전 지식과 시간 투자가 없다면 문제가 발생했을 때 해결하기가 쉽지 않다.
  • 여전히 동적 타입 시스템을 고수하고 있어, 문제가 되는 설정을 넣었을 때 실제로 빌드를 하기 전까지 에디터에서 바로 알기 힘들며, 에러가 발생했을 때 실제 문제가 된 소스랑 전혀 딴판의 소스가 튀어나오기도 하는데, 이는 Nix가 근본적으로 lazy하기 때문도 있다. static typing을 적용하려는 여러 시도는 있었지만 전부 실패했다.
  • 자유도가 지나치게 높은 편으로, 반대로 말하면 통일된 방법이 존재하지 않는다. 때문에 커뮤니티나 오픈 소스로 공개된 다른 사람의 설정을 사용하려고 해도, 서로 사용하는 방식이 맞지 않으면 또다시 수정에 들어갈 별도의 시간 투자가 필요하다.
  • 빌드가 지나치게 느리다. home-manager 빌드에만 30초 이상이 걸리기도 한다. nix develop 등은 nix-direnv로 캐시를 사용해 성능을 증가시킬 수 있어도, 전반적으로 evalutation에 걸리는 시간 자체가 매우 느리다.
  • 과도한 재현성과 순수성 요구로 인해 타 패키지 관리자에 비해 차지하는 용량이 훨씬 많다. /nix/store에 주기적으로 nix-collect-garbage를 돌려주더라도 종속성 트리 내에서 구버전을 계속 참조하고 있는 패키지가 있으면 용량이 쉽게 안 빠진다. flake를 사용하거나 어떤 사정으로 인해 채널을 여러 개 사용하고 있을 때 특히 문제가 더 심해진다. 순수 NixOS의 경우 저장공간 부족으로 인한 걱정 없이 사용하려면 루트 파티션에 최소 500GB는 확보해야 하는데, 서버라면 모를까 일반 데스크탑 환경에서 이렇게 높은 용량을 요구하는 것은 2020년대라 하더라도 적지 않은 부담이 된다. 당장 저장공간 부족으로 빌드가 안 되는 등 급한 상황인 경우, GC 말고도 nix-store --optimise 명령어로 다소의 /nix/store 공간을 확보할 수 있다.

11. 외부 링크


[1] A function always takes exactly one argument. Argument and function body are separated by a colon