RubyGems 설치 및 기본 사용법
RubyGems는 현재 Ruby 코어 배포판에 포함될 계획이지만, 그 전까지는 수동 설치가 필요합니다. Linux 환경에서는 배포판 패키지를 사용하거나, 소스(tar xzf rubygems-0.8.11.tgz, cd rubygems-0.8.11, ruby setup.rb all)를 통해 설치할 수 있습니다. 설치 후에는 gem 명령어를 사용하여 RubyGems 시스템과 상호작용합니다.
- 주요
gem명령어:gem list: 설치된 젬 목록 확인gem install [gem_name]: 젬 설치 (예:gem install rails --include-dependencies,gem install rmagick)gem search [keyword] --remote [source]: 원격 저장소에서 젬 검색gem update: 모든 젬을 최신 버전으로 업데이트gem cleanup: 설치된 젬의 오래된 버전 제거gem uninstall [gem_name]: 젬 제거
젬 문서화 및 버전 관리
RubyGems는 설치된 젬에 대한 문서화를 자동으로 생성하며, 두 가지 방식으로 접근할 수 있습니다.
-
gem_server: 포트 8808에서 Ruby 기반 웹 서버를 실행하여 웹 브라우저로 문서 열람. -
파일 시스템 접근:
gem environment gemdir명령으로 젬 설치 경로를 확인한 후,/doc하위 디렉토리에서 직접 접근.
Ruby 코드에서 젬 라이브러리를 사용하기 위해서는 require 메커니즘을 활용합니다.
-
require 'rubygems': RubyGems 코드를 로드하고 최신 버전의 젬을 사용 가능하게 합니다. -
require_gem 'RMagick', '>=1.10': 특정 버전의 젬을 명시적으로 요구합니다.~>연산자는 RubyGems의 버전 관리 표준을 따르며,X.Y.Z버전에서X.Y범위 내의 마이너 업데이트를 자동으로 허용합니다.
젬 생성 및 구조
자신만의 라이브러리를 젬으로 패키징하는 과정은 크게 두 부분으로 나뉩니다.
- 디렉토리 구조 설정:
/lib: Ruby 코드/pkg: 젬 파일 생성 위치/tests: 테스트 코드/README: 프로젝트 요약 및 라이선스/bin: 명령줄 스크립트 (선택 사항)/doc: 추가 문서 (선택 사항)/ext: 비-Ruby 소스 코드 (C 코드 등, 컴파일 필요 시)
- 젬 스펙(Gem Specification) 정의:
Rakefile내에서Gem::Specification객체를 통해 젬의 메타데이터를 정의합니다.s.platform: 젬이 의도하는 플랫폼 (순수 Ruby의 경우Gem::Platform::RUBY)s.name,s.version,s.author,s.email,s.summary: 기본 정보s.files: 젬에 포함될 파일 목록 (rake의FileList활용)s.require_path: 코드 검색 경로s.autorequire:require 'gem_name'호출 시 로드될 파일s.test_files: 설치 시 실행될 테스트 파일s.has_rdoc,s.extra_rdoc_files: 문서화 관련 설정s.add_dependency("gem_name", ">=version"): 다른 젬에 대한 의존성 지정
비-Ruby 코드를 포함하는 젬(ext 디렉토리)은 설치 과정에서 해당 코드를 컴파일합니다. 이는 대상 시스템의 라이브러리에 바인딩되는 이점이 있습니다.
젬 배포 및 서명
젬 배포 방식은 다양합니다.
-
파일 호스팅: 사용자가 직접 다운로드 후 설치.
-
RubyForge.org: RubyGems의 기본 소스로, 업로드 시 자동 배포.
-
자체 서버 운영:
gem_server또는 웹 서버의gems디렉토리에 젬을 복사하고generate_yaml_index.rb -d DIR명령으로 인덱스 생성. (사용자는gem install --source URL로 접근)
RubyGems 0.8.11부터는 공개/비공개 키를 이용한 젬 서명 기능이 추가되어, 신뢰할 수 있는 소스에서 서명된 젬만 설치하는 고보안 모드를 지원합니다.
RubyGems와 시스템 패키지 관리자의 충돌
RubyGems는 자체적인 패키지 관리 시스템이지만, Linux 시스템의 apt나 yum과 같은 호스트 패키지 관리자와 독립적으로 작동하여 복잡성을 야기할 수 있습니다. 특히 비-Ruby 코드를 설치하는 젬의 경우, 시스템 패키지 관리자가 공유 라이브러리를 호환되지 않는 버전으로 교체할 위험이 있습니다. 이 문제는 아직 해결되지 않았지만, 개발자들은 apt로 시스템을 관리하고 RubyGems로 젬을 관리하는 방식으로 이 문제를 우회하고 있습니다.