Gem

Gem

Gem 모듈은 RubyGems — Ruby 표준의 서드파티 라이브러리 게시·관리 시스템 — 의 진입점이에요. gem install, gem list 같은 명령과 함께, 코드에서 Gem 모듈의 클래스 메서드로 gem 경로나 스펙을 다룰 수 있어요.

출처: Ruby 4.0 API

본문

RubyGems는 라이브러리를 "gem"이라는 단위로 배포·설치하고, 설치된 gem의 실행 파일·요구 경로를 관리해요. 사용자 문서는 gem helpgem help [command]로 볼 수 있고, gem 개발자 문서는 Gem::Specification, Gem::Version 등을 봐요.

Gem 모듈 자체는 패키징·설치·활성화 같은 저수준 동작을 담당해요. 아래에서 플러그인, 기본값, 상수·속성, 그리고 자주 쓰는 클래스 메서드를 정리할게요.

RubyGems 플러그인

RubyGems는 설치된 각 gem의 최신 버전이나 $LOAD_PATH에서 플러그인을 로드해요. 플러그인은 반드시 'rubygems_plugin'이라는 이름(.rb, .so 등)이어야 하고, gem의 require_path 루트에 있어야 해요. 플러그인은 특별한 위치에 설치되고 부팅 시 로드돼요.

기본값과 패키징 (Defaults, Packaging)

RubyGems의 기본값은 lib/rubygems/defaults.rb에 있어요. RubyGems를 패키징하거나 Ruby를 구현한다면 기본값을 바꿀 수 있어요.

  • RubyGems 패키저라면 lib/rubygems/defaults/operating_system.rb를 제공하고 lib/rubygems/defaults.rb의 기본값을 덮어써요.
  • Ruby 구현자라면 lib/rubygems/defaults/#{RUBY_ENGINE}.rb를 제공하고 기본값을 덮어써요.

설치·제거 시 추가 작업이 필요하면, 기본값 오버라이드 파일에서 pre/post install·uninstall 훅을 설정할 수 있어요(Gem.pre_install, Gem.pre_uninstall, Gem.post_install, Gem.post_uninstall).

상수 (Constants)

  • DEFAULT_HOST — 기본 gem 서버 호스트.
  • DEFAULT_SOURCE_DATE_EPOCHSOURCE_DATE_EPOCH가 지정되지 않았을 때의 기본값. Zip 파일 문제를 피하려고 1980-01-01 이후 날짜가 되도록, 1980-01-02 00:00:00 GMT 타임스탬프를 써요.
  • GEM_DEP_FILES, LOADED_SPECS_MUTEX — gem 의존성 파일 목록, 로드된 스펙 보호 뮤텍스.
  • MARSHAL_SPEC_DIR — 원격 저장소의 Marshal quick gemspec 위치.
  • RDoc, REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES, REPOSITORY_SUBDIRECTORIES — gem 저장소의 (기본 gem용) 하위 디렉터리 목록.
  • RUBYGEMS_DIR, VERSION — RubyGems 디렉터리, 버전 문자열.
  • WIN_PATTERNS — Windows Ruby 플랫폼과 일치하는 Regexp들의 Array.

속성 (Attributes)

  • disable_system_update_message [RW] — RubyGems 배포자(OS 패키지 매니저 등)가 gem update --system을 막도록 설정. 실제 업데이트 대신 최종 사용자에게 보여줄 에러 메시지를 설정하는 방식이에요.
  • discover_gems_on_require [RW] — 내장 require가 요청 경로가 설치된 gem에 있는지 자동으로 확인하고, 활성화·$LOAD_PATH 추가를 하도록 만들지 여부.
  • done_installing_hooks [R]Gem::DependencyInstaller가 gem 세트를 설치한 뒤 실행할 훅 목록.
  • gemdeps [R].use_gemdeps 호출 시 설정되는 GemDependencyAPI 객체. Gemfile의 모든 정보를 담아요.
  • loaded_specs [R] — 이름을 키로 하는 로드된 Gem::SpecificationHash.
  • post_build_hooks [R]Gem::Installer#install이 파일 추출·확장 빌드 후 실행할 훅 목록.
  • post_install_hooks [R]Gem::Installer#install이 설치를 마친 뒤 실행할 훅 목록.
  • post_reset_hooks [R]Gem::Specification.reset 실행 후 실행할 훅 목록.
  • post_uninstall_hooks [R]Gem::Uninstaller#uninstall 완료 후 실행할 훅 목록.
  • pre_install_hooks [R]Gem::Installer#install이 어떤 작업을 하기 전에 실행할 훅 목록.
  • pre_reset_hooks [R]Gem::Specification.reset 실행 전 실행할 훅 목록.
  • pre_uninstall_hooks [R]Gem::Uninstaller#uninstall이 작업을 하기 전에 실행할 훅 목록.

클래스 메서드

경로·로드 관련

activate_and_load_bin_path(name, exec_name = nil, *requirements)

gem name의 실행 파일 전체 경로를 찾아 로드해요. exec_name을 주지 않으면 예외가 나요. requirements로 특정 gem 버전을 지정할 수 있어요. 이 메서드 부수 효과로 실행 파일을 담은 gem이 활성화돼요. bin 스텁 파일에서만 써야 해요.

activated_gem_paths()

활성화된 gem에서 온 $LOAD_PATH의 경로 수예요. require-IENV['RUBYLIB'] 항목을 우선순위로 두는 데 쓰여요.

add_to_load_path(*paths)

경로 목록을 $LOAD_PATH의 적절한 위치에 추가해요.

bin_path(name, exec_name = nil, *requirements)

gem name의 실행 파일 전체 경로를 찾아요. exec_name을 주지 않으면 예외가 나요.

binary_mode()

파일을 순수 바이너리로 읽는 데 필요한 모드("rb")를 돌려줘요.

bindir(install_dir = Gem.dir)

gem 실행 파일이 설치되는 경로를 돌려줘요.

cache_home()

gem 캐시 홈(기본 XDG_CACHE_HOME 또는 ~/.cache)을 돌려줘요.

config_home()

gem 설정 홈(기본 XDG_CONFIG_HOME 또는 ~/.config)을 돌려줘요.

default_dir()

기본 gem 설치 디렉터리를 돌려줘요.

default_specifications_dir()

기본 gem의 스펙 디렉터리(보통 Gem.default_dir/specifications/default)를 돌려줘요.

find_files(glob, check_load_path = true)

glob에 일치하는 (설치된 gem과 $LOAD_PATH의) 파일들을 찾아 목록으로 돌려줘요.

find_latest_files(glob, check_load_path = true)

glob에 일치하는 최신 파일들을 찾아요.

paths()

gem 경로(Gem::PathSupport) 객체를 돌려줘요.

plugindir(install_dir = Gem.dir)

gem 플러그인이 설치되는 디렉터리를 돌려줘요.

read_binary(path)

path를 바이너리로 읽어 돌려줘요(File.binread).

write_binary(path, data)

pathdata를 바이너리로 써요(File.binwrite).

설치·스펙 관련

install(name, version = Gem::Requirement.default, *options)

gem name을 설치해요. version을 지정할 수 있고, options로 설치 옵션을 넘겨요.

latest_spec_for(name)

gem name의 최신 스펙을 돌려줘요.

latest_version_for(name)

gem name의 최신 버전을 돌려줘요.

ensure_gem_subdirectories(dir = Gem.dir, mode = nil)
ensure_default_gem_subdirectories(dir = Gem.dir, mode = nil)

gem 저장소(및 기본 gem용) 하위 디렉터리를 만들어요.

try_activate(path)

path에 해당하는 gem 스펙을 찾아 활성화하려 시도해요.

finish_resolve(request_set = Gem::RequestSet.new)

요청된 gem들을 resolve하고 로드해요.

load_bundler_extensions(version)

Bundler 확장을 로드해요(특정 Bundler 버전과의 호환 처리).

훅 등록

done_installing(&hook)
pre_install(&hook)   pre_uninstall(&hook)
post_install(&hook)  post_uninstall(&hook)
post_build(&hook)
pre_reset(&hook)     post_reset(&hook)

각 설치·제거·빌드·리셋 시점에 실행될 훅(콜백)을 등록해요. 블록 hook을 받아 특정 시점에 호출되게 해요.

설정·환경 관련

configuration        #→ 현재 Gem::ConfigFile
configuration=(config)

RubyGems 설정 파일(Gem::ConfigFile)을 조회/설정해요.

host=(host)
sources()            #→ Gem::SourceList
sources=(new_sources)
platforms=(platforms)

gem 소스·호스트·플랫폼을 설정/조회해요.

env_requirement(gem_name)

환경 변수(RUBYOPT 등)에서 gem 이름에 대한 requirement를 돌려줘요.

location_of_caller(depth = 1)

호출자(호출한 위치)의 [파일, 줄번호]를 돌려줘요. 디버깅에 유용해요.

set_target_rbconfig(rbconfig_path)

타깃 rbconfig 경로를 설정하고 플랫폼을 새로 고쳐요.

time(msg, width = 0, display = Gem.configuration.verbose)

msg를 로그로 남기고 블록 실행 시간을 재는 데 써요.

use_gemdeps(path = nil)

Gemfile(기본적으로 .gemfile이나 Gemfile) 기반 의존성 API를 켜요. Gem::DependencyInstaller가 설치하는 gem 세트를 다루는 데 연관돼요.

use_paths(home, *paths)

gem 홈과 gem 경로들을 설정해요.