Lobsters

Extending Guix

Guix 확장 명령 만들기

Guix는 `GUIX_EXTENSIONS_PATH`에 설치한 Guile 모듈을 새 `guix` 명령으로 불러옵니다. 글은 확장 모듈 작성부터 도움말 등록과 Guix 패키징까지 `guix hello` 예제로 안내하며, 새 확장 스키마가 컴파일된 모듈을 찾아 실행 성능을 높인다고 설명합니다.

AI 요약

Guix는 사용자가 새 명령을 추가하는 확장 기능을 지원합니다. 글은 guix help에서 기본 명령과 확장 명령을 확인하는 방법을 먼저 소개한 뒤, guix hello를 직접 만들고 패키지로 묶는 과정을 차례로 보여줍니다.

확장 모듈을 찾는 방식

Guix는 GUIX_EXTENSIONS_PATH를 검색해 확장을 찾습니다. 기존 방식은 /path/to/guix/extensions 아래에서 (guix extensions NAME) 모듈을 찾았습니다. 새 방식에서는 /path/to/SCHEMA_VERSION 아래에 같은 모듈 이름을 둡니다. 예시 패키지는 스키마 버전 1.5를 사용합니다. 새 방식에서는 Guix가 확장 모듈을 표준 Guile 모듈처럼 다루므로 런타임에서 컴파일된 .go 파일을 찾습니다. 기존 로딩 방식은 런타임 평가에 의존해 컴파일 파일을 처리하지 못했습니다. 글은 이 변경으로 실행 성능이 개선된다며 기존 확장을 새 스키마로 옮기라고 권합니다.

`guix hello` 명령 작성

프로젝트 루트에 guix/extensions 디렉터리를 만들고 hello.scm 파일을 둡니다. 모듈 이름은 (guix extensions hello)로 선언합니다. (guix scripts)에서 define-command를 불러온 뒤 guix-hello를 내보내면 확장 로더가 공개 인터페이스에서 명령을 찾습니다. 명령은 (category extension)과 (synopsis "say hello")를 지정하고, 실행하면 인사말을 출력합니다.

프로젝트 루트에서 GUIX_EXTENSIONS_PATH=$PWD guix hello를 실행하면 확장을 바로 시험할 수 있습니다. 사용자에게 명령을 노출하려면 도움말 정보도 추가해야 합니다. 글은 (srfi srfi-37)의 옵션 파서와 (guix ui)의 국제화 문자열을 사용해 --help 옵션을 정의합니다. show-help가 사용법과 설명을 출력하고, parse-command-line이 명령 실행 초기에 인자를 처리합니다. 완성한 모듈은 GUIX_EXTENSIONS_PATH=$PWD guix help의 extension commands 목록에 hello를 표시하며, guix hello --help로 도움말을 출력합니다.

Guix 패키지로 묶기

글을 작성한 시점에는 확장 전용 빌드 시스템이 없으므로 Guile 패키지에 적합한 guile-build-system을 사용합니다. 프로젝트 루트에 guix.scm을 만들고 guix-hello 패키지를 정의합니다. 소스는 local-file로 지정하고 Git 버전 관리 파일만 선택합니다. Scheme 파일 선택 규칙에서는 패키지 정의와 채널·매니페스트 파일을 제외합니다.

빌드 후에는 move-to-extension-directory 단계에서 hello.scm을 Guile 사이트 경로에서 share/guix/extensions/1.5/guix/extensions/hello.scm로 옮깁니다. 패키지 입력에는 Guix와 해당 Guix가 사용하는 Guile을 지정합니다. 글은 guix shell -CW -f guix.scm -- guix hello로 패키지를 시험합니다. -C는 현재 환경이 컨테이너에 간섭하지 않도록 하고, -W는 컨테이너 안에서 현재 Guix를 사용할 수 있게 합니다. 이 예제에는 de069958fc 커밋 이상인 Guix가 필요합니다.

글쓴이는 확장을 함께 관리할 공간으로 Codeberg의 guix-extensions 조직을 제안합니다. 이를 통해 커뮤니티가 유용한 확장을 모으고 개발에 참여하기를 바란다고 덧붙입니다.

Lobsters 반응

  • @PuercoPop — Guix 확장 사례로, toys는 서드파티 채널을 로컬에서 검색하는 확장을 제공합니다. https://git.sr.ht/~whereiseveryone/toys/tree/master/item/guix/extensions/toys.scm

원문: GNU Guix 블로그 / 번역·요약: Trawling