명령형 방식의 문제점: Homebrew의 한계
- Homebrew는 macOS의 편리한 패키지 관리자이지만, 명령형 방식은 시스템 상태를 예측하기 어렵게 만듭니다.
brew install은 기기 상태를 변경하며, 시간이 지남에 따라 패키지 버전이 변경되어 환경 불일치와 디버깅 시간을 초래할 수 있습니다. 이는 재현 가능한 환경 구축을 어렵게 합니다.
시스템 불변성과 Nix Store의 장점
-
Nix는 시스템을 설정의 순수 함수로 간주하여 불변성을 구현합니다.
-
재현성: 모든 패키지는 고유 해시를 가진
/nix/store에 저장되어 여러 버전의 소프트웨어가 충돌 없이 공존합니다. 이는 “내 컴퓨터에서는 되는데…” 문제를 방지합니다. -
롤백: 시스템 업데이트 실패 시 이전 세대로 쉽게 부팅하여 안정적인 상태로 복구할 수 있습니다.
-
Flakes:
flake.lock파일을 통해 모든 의존성의 정확한 Git 커밋을 고정하여, 어떤 시스템에서든 동일한 환경을 보장합니다.
Nix Flake와 Ephemeral Shell
-
Nix Flake는
flake.nix와flake.lock으로 구성되어 의존성을 정확히 고정하고 시스템 재현성을 극대화합니다. -
Nix의 “일회성 셸”은 `nix shell nixpkgs
python314`와 같이 특정 버전의 도구를 일시적으로 사용하여 시스템에 영구적인 변경 없이 테스트할 수 있게 합니다. 셸 종료 시 모든 흔적이 사라지는 “get and forget” 방식입니다.
학습 곡선과 하이브리드 접근법
-
Nix는 자체 도메인 특화 언어와 macOS 시스템과의 상호작용 방식 등 가파른 학습 곡선을 요구합니다. GUI 앱을
Applications폴더에 표시하는 것과 같은 통합 작업에 추가적인 설정이 필요합니다. -
저자는
nix-darwin으로 핵심 개발 도구(컴파일러, LSP)를 관리하고, Thunderbird, Firefox 같은 GUI 앱은 Nix 설정 내 Homebrew 모듈을 사용하여 설치하는 하이브리드 접근법을 제안합니다. 이 방식은 Nix의 선언적 이점과 Homebrew의 macOS 통합 편의성을 결합합니다.