Gem
Gem
Gem 모듈은 RubyGems — Ruby 표준의 서드파티 라이브러리 게시·관리 시스템 — 의 진입점이에요. gem install, gem list 같은 명령과 함께, 코드에서 Gem 모듈의 클래스 메서드로 gem 경로나 스펙을 다룰 수 있어요.
출처: Ruby 4.0 API
본문
RubyGems는 라이브러리를 "gem"이라는 단위로 배포·설치하고, 설치된 gem의 실행 파일·요구 경로를 관리해요. 사용자 문서는 gem help와 gem 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_EPOCH—SOURCE_DATE_EPOCH가 지정되지 않았을 때의 기본값. Zip 파일 문제를 피하려고 1980-01-01 이후 날짜가 되도록, 1980-01-02 00:00:00 GMT 타임스탬프를 써요.GEM_DEP_FILES,LOADED_SPECS_MUTEX— gem 의존성 파일 목록, 로드된 스펙 보호 뮤텍스.MARSHAL_SPEC_DIR— 원격 저장소의Marshalquick 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::Specification의Hash.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 시 -I와 ENV['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)
path에 data를 바이너리로 써요(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 경로들을 설정해요.