배포판(distribution) 이해하기: 입문
배포판(distribution) 이해하기: 입문 (distributions_introduction)
Raku에서 "모듈을 배포한다"는 말을 들으면 어떤 구조가 떠오르세요? 다른 언어에서는 보통 모듈 하나가 곧 배포 단위인 경우가 많지만, Raku는 여기서 말이 조금 틀어져요. 이 문서는 Raku의 distribution(배포판)이라는 개념과, 그 용어들이 실제로 무엇을 가리키는지 정리해 주는 입문서예요. 배포판을 만들고 공유하고 싶다면 이 페이지부터 시작하면 돼요.
본문
용어 정리 (Terminology)
Raku 여정에서 여기쯤 오면 용어를 좀 정확히 집고 넘어가야 할 때가 와요. 앞으로 쓰일 용어들을 먼저 정리할게요.
- compunit: 컴파일 단위(compilation unit)의 줄임말이에요. 하나의 덩어리로 분석·컴파일되는 Raku 코드 조각을 말해요. 보통 디스크의 소스 파일에서 나오지만,
EVAL안에 들어간 것도 compunit으로 칩니다. - script: 실행 진입점으로 Raku에 넘겨지는 컴파일 단위를 말해요.
raku foo.raku처럼 실행하면foo.raku를 먼저 컴파일한 뒤 실행한다고 얘기하죠. Rakudo Raku에서 이 경우 컴파일 결과는 메모리에만 존재해요. - module: script가 사용하거나, script에서 쓰이는 다른 module이 사용하는 컴파일 단위예요. module도 사용되려면 먼저 컴파일돼야 해요. (어떤 소스 파일 하나가 사용 방식에 따라 script와 module 둘 다 역할을 하는 걸 막는 건 없어요.)
- distribution: 함께 릴리스되는 0개 이상의 script·module 묶음이에요. 여기에 메타데이터, 그리고 경우에 따라 리소스와 테스트가 딸려와요.
기본 구조 (Basic structure)
Raku의 모듈 distribution은 (서로 연관된 소스 파일들의 집합이라는 의미에서) Perl 계열 언어들의 distribution과 구조가 같아요. 메인 프로젝트 디렉터리에 README와 LICENSE 파일, 소스 파일을 위한 lib 디렉터리(개별 파일들을 module이라 부르거나 module 키워드로 직접 module을 정의할 수도 있어요), 테스트를 위한 t 디렉터리, 그리고 실행 파일·스크립트를 위한 bin 디렉터리가 있을 수 있어요. 각종 파일 타입의 현재·과거 확장자에 대해서는 파일 확장자 문서를 보세요.
Distributions
여기서 이 문서 앞부분의 주의사항을 다시 강조할 필요가 있어요. 다른 언어의 module에 가까운 Raku의 **distribution**과, Raku의 module 선언은 서로 다른 개념이라는 거요. 그 이유는 한 파일 안에 class, module, role 등 선언이 여러 개 들어갈 수 있고, 이 선언들이 여러 파일에 흩어져 있을 수도 있기 때문이에요. 게다가 distribution을 공개할 때는 호출 가능한 유틸리티 같은 다른 리소스에 대한 접근을 제공해야 할 수도 있고요.
Raku는 하나의 distribution이 use(또는 require 등)할 수 있는 여러 module을 제공하는 것도 허용해요. distribution에 대한 정보는 distribution 루트 디렉터리의 META6.json 파일에 담겨요. distribution이 use(또는 require 등)하도록 허용하는 각 엔티티—역시 module이라고 불러요—는 META6.json의 provides 섹션에 들어가요 (아래에서 자세히 설명해요).
META6.json의 depends 섹션을 작성할 때는 원하는 module의 이름이 아니라 distribution의 이름을 적는다는 점도 주의하세요. 다만 대부분의 경우 distribution 이름과 module 이름이 같긴 해요. Ecosystem에 공개된 distribution의 depends 목록이 가지는 또 다른 효과는, zef 같은 패키지 매니저가 모든 distribution에서 module 이름을 찾아볼 수 있다는 거예요.
이런 구조 덕분에 rakudo 컴파일러나 zef 같은 패키지 매니저는 디렉터리의 META6.json 파일만으로 각 module에 필요한 모든 정보를 얻을 수 있어요.
연락처 (Contact information)
모듈 개발 전반에 대해 이야기하거나, 여러분의 모듈이 ecosystem에서 어떤 니즈·이름을 채울 수 있는지 등을 논의하고 싶다면 #raku on irc.libera.chat IRC 채널을 사용할 수 있어요. 도구 관련 이슈를 논의하는 리포지토리는 https://github.com/Raku/toolchain-bikeshed에 있어요.
모듈에 관한 문서 (Documentation about Modules)
관련 문서들이 페이지별로 나뉘어 있어요.
모듈을 배포하고 싶다면 배포판 시리즈로 이어져요.
- 배포판: 입문 (지금 이 페이지)
- 배포판: 설정과 구조
- 배포판: 도구
- 배포판: 테스트
- 배포판: 업로드
참고: S11 시놉시스가 말하듯, 이 용어 구분이 헷갈리기 마련이에요. 의도된 혼란이랄까요.
더 알아보기
- 파일 확장자 — 각 파일 타입의 현재·과거 확장자
- 배포판: 설정과 구조 —
META6.json과 디렉터리 구조 - 배포판: 테스트 — 배포판 테스트 방법
- 배포판: 업로드 — ecosystem에 배포판 공개하기