히라노 쇼(平野省)가 개발한 'Compo'는 루비 프로젝트를 단일 실행 파일(One-Binary)로 패키징하여 배포를 간소화하고 환경 의존성 문제를 해결하는 도구입니다. 개발자는 루비 기반 게임 엔진 배포의 어려움과 기존 배포 방식의 한계(버전 불일치, 복잡한 설치 과정 등)를 극복하고자 Compo를 개발했습니다. 이 도구의 핵심 목표는 추가 설치 없이 어디서든 루비 애플리케이션을 쉽게 실행하고 배포하는 것입니다.
이전 Compo 버전은 require
메서드 오버라이딩 방식이었으나, autoload
와의 충돌, 임베딩된 파일에 대한 자유로운 접근 불가, 디렉토리 구조 미지원 등의 문제로 Rails 같은 대규모 프로젝트의 원 바이너리화에 실패했습니다. 특히 일반 파일 I/O 메서드가 바이너리 내의 파일을 읽을 수 없다는 점이 큰 제약이었습니다.
이러한 한계를 극복하기 위해 새로운 Compo는 바이너리 내부에 계층 구조를 갖는 ‘가상 파일 시스템(Virtual File System, VFS)’을 자체 구축했습니다. 이는 Compo의 ‘추가 설치 없이 실행’ 목표를 유지하며 디렉토리와 파일의 계층적 관리를 가능하게 합니다. 또한, dlsym
함수를 활용하여 C 라이브러리의 파일 I/O 관련 함수 주소를 동적으로 획득하고 래핑하는 방식을 채택했습니다. 이 래핑 계층은 파일 경로를 분석하여 가상 파일 시스템 또는 실제 파일 시스템 중 적절한 읽기 경로를 선택하도록 구현되었습니다. 발표에서는 루비가 설치되지 않은 Docker 환경에서 Compo로 원 바이너리화된 Rails 애플리케이션이 성공적으로 실행되는 데모를 시연하며, 대규모 루비 프로젝트의 원 바이너리화 가능성을 입증했습니다.
Compo는 가상 파일 시스템 구축과 C 라이브러리 함수 래핑이라는 혁신적인 접근 방식을 통해 Rails 같은 복잡한 루비 프로젝트의 원 바이너리화 문제를 성공적으로 해결했습니다. 이는 루비 프로젝트 배포의 효율성을 크게 향상시킵니다. 현재 '추가 설치 없이 실행' 목표는 달성되었고, 실행 속도 또한 허용 가능한 수준입니다. 향후 Compo는 젬(Gem)화 및 크로스 플랫폼 지원을 통해 더욱 폭넓은 활용성을 제공할 계획이며, 루비 생태계에 중요한 기여를 할 것으로 기대됩니다.