Nix로 128개 언어 패키징, 쿼인 릴레이(Quine Relay) 프로젝트의 도전!

by DD
2개월 전
조회수 2

Nix를 사용하여 128개 언어로 구성된 쿼인 릴레이(Quine Relay) 프로젝트를 패키징하는 과정을 소개함

Nix를 사용하면 재현 가능한 빌드 환경(Reproducible Build Environment)을 구축하여 프로젝트 실행을 단순화할 수 있음

Gambas3와 Modula-2 패키징 과정에서 빌드 종속성(Build Dependency) 문제와 모노레포(Monorepo)의 단점이 드러남

Nixpkgs의 overrideAttrsbuildFHSEnv와 같은 기능을 활용하여 패키징 문제를 해결하고, 커뮤니티 기여를 통해 개선함

Nix를 활용한 쿼인 릴레이(Quine Relay) 패키징

본 프로젝트는 128개 언어로 작성된 쿼인 릴레이(Quine Relay)를 Nix로 패키징하여 재현 가능한 빌드(Reproducible Build)를 목표로 한다. Nix는 의존성 관리와 빌드 환경 설정을 단순화하여, 개발자가 복잡한 환경 설정 없이 프로젝트를 실행할 수 있도록 지원한다. 특히, Docker 빌드 실패 문제를 해결하고, 다양한 언어의 컴파일러 및 인터프리터(Compiler and Interpreter)를 쉽게 관리할 수 있게 되었다.

Gambas3 및 Modula-2 패키징의 어려움

Gambas3는 `/usr/lib/...` 경로에 대한 하드코딩된 의존성으로 인해 Nix 환경에서 빌드에 실패했다. 해결책으로 buildFHSEnv를 사용하여 런타임 환경을 격리함으로써 문제를 해결했다. Modula-2의 경우, 모노레포(Monorepo) 구조로 인해 필요한 부분만 빌드하는 것이 어려웠다. 하지만, overrideAttrs를 활용하여 gcc 패키지 내에서 m2를 활성화하는 우아한 해결책을 제시했다.

Nixpkgs의 활용과 커뮤니티 기여

Nixpkgs에 이미 포함된 95개 언어를 활용하고, 나머지 언어는 소스 코드를 찾아 Nix로 빌드하는 과정을 거쳤다. 특히, SandaruKasa의 기여를 통해 overrideAttrs와 같은 Nix의 강력한 기능을 배우고, 프로젝트를 개선했다. 이는 Nix 패키징의 유연성과 커뮤니티 협업의 중요성을 보여준다. 또한, 패치(Patching)를 통해 빌드 문제를 해결하는 방법을 제시했다.

Nix 안정 채널(Stable Channel) 사용에 대한 논의

커뮤니티에서는 Nix 안정 채널(Stable Channel) 사용에 대한 오해가 있었다. 안정 채널을 사용한다고 해서 빌드 재사용성이 항상 높아지는 것은 아니다. 여러 저장소에서 동일한 `nixpkgs` 입력을 동기화하는 것이 더 중요하다. nixos-unstable을 사용하면 잦은 변경으로 인해 빌드 재사용성이 낮아질 수 있지만, 안정 채널에서도 스테이징 사이클(Staging Cycle)로 인해 재빌드가 발생할 수 있다. 따라서, 여러 프로젝트에서 Nixpkgs의 버전을 일관되게 유지하는 것이 중요하다.

Packaging 128 languages with Nix