Bundler는 루비 애플리케이션의 복잡한 의존성 문제를 해결하기 위해 개발되었습니다.
의존성 충돌 문제 해결
루비 개발자들은 “can’t activate FU already activated FU” 오류로 Gem 버전 충돌을 자주 겪습니다. Bundler는 Yum, Apt-get과 유사한 정교한 의존성 해결 알고리즘을 사용하여 이를 방지합니다. 주요 휴리스틱은 다음과 같습니다:
-
활성화된 Gem 우선: 이미 로드된 Gem이 새로운 의존성을 만족하는지 확인.
-
충돌 신속 해결: 충돌 발생 시 해당 Gem을 빠르게 재시도하여 해결.
-
제약 많은 의존성 우선: 가능한 매치 수가 적은 의존성을 먼저 해결하여 탐색 효율 증대. 이 과정은 효율적인 백트래킹으로 구현됩니다.
Bundler의 핵심 기능 및 철학
-
애플리케이션 격리 (
Gemfile):Gemfile에 필요한 Gem과 버전을 명시하고,bundler/setup을 통해 명시된 Gem만 로드하여 환경을 격리합니다. -
재현 가능한 환경 (
Gemfile.lock):bundle install시 생성되는Gemfile.lock은 모든 Gem의 정확한 버전을 기록합니다. 이 파일을 버전 관리 시스템에 커밋하여 모든 환경에서 동일한 Gem 세트를 보장하며,bundle update로 Gem을 업데이트합니다. -
배포 최적화 (
--deployment):bundle install --deployment는 Gem을 애플리케이션의vendor/bundle에 설치하여 애플리케이션과 의존성을 함께 배포하고 환경 충돌을 방지합니다.
Bundler와 RubyGems의 미래
Bundler의 핵심 해결사(resolver)를 RubyGems에 통합하는 논의가 진행 중이며, 빌드 의존성, 선택적/권장 의존성, ‘provides’ 및 메타-Gem과 같은 고급 의존성 관리 기능 도입을 통해 루비 Gem 생태계를 더욱 강화할 계획입니다.