Bundler 모듈
Bundler 모듈
Bundler는 필요한 정확한 gem과 버전을 추적·설치해 Ruby 프로젝트에 일관된 환경을 제공해요. Bundler는 Ruby 표준 라이브러리의 일부예요.
모든 프로젝트 의존성과 (선택적으로) 그 버전을 나열한 Gemfile을 만들고, require 'bundler/setup' 또는 Bundler.setup을 사용해 지정된 gem과 지정된 버전만 사용할 수 있는 환경을 설정하는 방식으로 쓰여요.
Gemfile 생성과 Bundler 사용법에 대한 광범위한 문서는 Bundler 웹사이트를 참고하세요. 프로젝트 안의 표준 라이브러리로서 Bundler는 로드되고 require된 모듈의 내부(introspection)를 들여다보는 데도 쓸 수 있어요.
출처: Ruby 3.3 API
본문
Public Class Methods
app_cache(custom_path = nil)
사용자 지정 경로(없으면 프로젝트 루트) 아래의 어플리케이션 캐시 경로를 반환해요.
# File lib/bundler.rb, line 347
def app_cache(custom_path = nil)
path = custom_path || root
Pathname.new(path).join(settings.app_cache_path)
end
app_config_path()
Bundler 어플리케이션 설정 경로를 반환해요. BUNDLE_APP_CONFIG 환경 변수를 우선적으로 사용해요.
# File lib/bundler.rb, line 333
def app_config_path
if app_config = ENV["BUNDLE_APP_CONFIG"]
app_config_pathname = Pathname.new(app_config)
if app_config_pathname.absolute?
app_config_pathname
else
app_config_pathname.expand_path(root)
end
else
root.join(".bundle")
end
end
auto_install()
Bundler.settings[:auto_install]이 존재하면 의존성을 자동으로 설치해요. (bundle config set --global auto_install 1으로 설정돼요.) 이 메서드는 전역 Definition 객체를 nil로 만들어 버리므로, 옛 객체에 대한 참조를 유지하는 Installer 같은 것을 인스턴스화하기 전에 먼저 호출해야 해요.
# File lib/bundler.rb, line 180
def auto_install
return unless settings[:auto_install]
# ... (설치 로직)
end
auto_switch()
사용 중인 gemfile에 따라 자동으로 버전을 전환하도록 하는 동작과 관련된 메서드예요.
bin_path()
Bundler의 바이너리 경로를 반환해요.
bundle_path()
번들된 gem이 설치되는 기본 경로를 반환해요.
clean_env()
Bundler 관련 환경 변수를 제거한 깨끗한 환경 해시를 반환해요. (with_clean_env 참고.)
clean_exec(*args)
Bundler가 없는 깨끗한 환경에서 명령을 exec 해요.
clean_system(*args)
Bundler가 없는 깨끗한 환경에서 시스템 명령을 실행해요.
clear_gemspec_cache()
gemspec 캐시를 비워요.
configure()
Bundler를 Ruby 환경에 맞게 구성해요. gem 경로, 홈, 바이너리 경로 등을 설정하는 핵심 메서드예요.
# File lib/bundler.rb, line 115 : (구성 로직 — configure_gem_home_and_path, configure_gem_path 등 호출)
def configure
configure_gem_home_and_path
configure_gem_path
end
configure_gem_home_and_path(path = bundle_path)
gem home과 path를 설정해요.
configured_bundle_path()
설정된 bundle 경로를 반환해요.
create_bundle_path()
bundle 경로를 생성해요.
default_bundle_dir()
기본 bundle 디렉터리를 반환해요.
default_gemfile()
기본 Gemfile 경로([Directory]Gemfile로 탐색)를 반환해요.
default_lockfile()
기본 lockfile 경로(Gemfile에 .lock을 더한 것)를 반환해요.
definition(unlock = nil, lockfile = default_lockfile)
Definition 객체를 생성·캐시해 반환해요. unlock이 주어지면 그에 따라 unlock 처리를 해요.
environment()
Bundler.load로 대체된 메서드예요. Bundler.load를 호출하며 deprecation 경고를 출력해요.
# File lib/bundler.rb, line 219
def environment
SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load", print_caller_location: true
load
end
feature_flag()
Bundler::FeatureFlag 인스턴스를 반환해요 (기능 플래그 접근).
frozen_bundle?()
bundle이 동결(frozen) 상태인지 반환해요.
git_present?()
git이 설치되어 있는지 반환해요.
home()
Bundler 홈 디렉터리 경로를 반환해요.
install_path()
설치 경로를 반환해요.
load()
Gemfile에서 Bundler::Environment를 로드해 반환해요.
load_gemspec(file, validate = false)
gemspec 파일을 로드해 반환해요 (캐시 사용).
load_gemspec_uncached(file, validate = false)
gemspec 파일을 캐시 없이 직접 로드해 반환해요.
local_platform()
현재 로컬 플랫폼(Gem::Platform.local)을 반환해요.
locked_gems()
lockfile에 기록된 gem 목록을 반환해요.
mkdir_p(path)
경로를 재귀적으로 생성해요 (FileUtils.mkdir_p 래퍼).
most_specific_locked_platform?(platform)
주어진 플랫폼이 가장 구체적으로 잠긴 플랫폼인지 반환해요.
original_env()
원래(변경 전) 환경 해시를 반환해요.
original_exec(*args)
원래 환경에서 명령을 exec 해요.
original_system(*args)
원래 환경에서 시스템 명령을 실행해요.
preferred_gemfile_name()
선호하는 Gemfile 이름(Gemfile 또는 gems.rb)을 반환해요.
read_file(file)
Bundler의 루트 인코딩을 기준으로 파일을 읽어 반환해요.
require(*groups)
아직 설정되지 않았다면 Bundler 환경을 설정(Bundler.setup 참고)하고, 지정된 그룹의 모든 gem을 로드해요. ::setup과 달리, (setup이 허용한 그룹이라면) 다른 그룹으로 여러 번 호출할 수 있어요.
Gemfile이 다음과 같다고 가정할게요.
gem 'first_gem', '= 1.0'
group :test do
gem 'second_gem', '= 1.0'
end
코드는 다음과 같이 동작해요.
Bundler.setup # allow all groups
Bundler.require(:default) # requires only first_gem
# ...later
Bundler.require(:test) # requires second_gem
# File lib/bundler.rb, line 211
def require(*groups)
setup(*groups).require(*groups)
end
reset!()
Bundler 상태(설정·루트·rubygems 등)를 모두 초기 상태로 재설정해요.
reset_paths!()
경로 관련 상태를 재설정해요.
reset_rubygems!()
Rubygems 관련 상태를 재설정해요.
reset_settings_and_root!()
설정과 루트를 재설정해요.
rm_rf(path)
경로를 재귀적으로 삭제해요.
root()
Bundler가 실행 중인 프로젝트의 루트 경로를 반환해요.
ruby_scope()
Ruby 스코프 문자열을 반환해요.
safe_load_marshal(data)
marshal 데이터를 안전하게 로드해요.
self_manager()
Bundler::SelfManager 인스턴스를 반환해요 (자기 관리 기능).
settings()
Bundler::Settings 인스턴스를 반환해요 (설정 해시 접근).
setup(*groups)
Bundler 런타임을 켜요. Bundler.setup 호출 후에는 Gemfile에 있거나 Ruby 표준 라이브러리인 gem만 로드·require할 수 있어요. Gemfile에 버전이 지정되어 있다면 그 버전만 로드돼요.
Gemfile이 다음과 같다고 가정할게요.
gem 'first_gem', '= 1.0'
group :test do
gem 'second_gem', '= 1.0'
end
Bundler.setup을 사용하는 코드는 다음과 같이 동작해요.
require 'third_gem' # allowed, required from global gems
require 'first_gem' # allowed, loads the last installed version
Bundler.setup
require 'fourth_gem' # fails with LoadError
require 'second_gem' # loads exactly version 1.0
Bundler.setup은 한 번만 호출할 수 있고, 이후 호출은 no-op이에요. groups 목록이 주어지면 지정된 그룹의 gem만 허용돼요(그룹 밖에 지정된 gem은 특별한 :default 그룹에 속해요). Gemfile의 모든 gem(또는 일부 그룹만)을 require하려면 Bundler.require를 보세요.
# File lib/bundler.rb, line 154
def setup(*groups)
# Return if all groups are already loaded
return @setup if defined?(@setup) && @setup
definition.validate_runtime!
SharedHelpers.print_major_deprecations!
if groups.empty?
# Load all groups, but only once
@setup = load.setup
else
load.setup(*groups)
end
end
specs_path()
gem 스펙 경로를 반환해요.
system_bindir()
시스템 바이너리 디렉터리를 반환해요.
tmp(name = Process.pid.to_s)
Bundler 임시 디렉터리 아래에 이름이 붙은 경로를 반환해요.
ui()
Bundler::UI 객체를 반환해요.
ui=(ui)
Bundler::UI 객체를 설정해요.
unbundle_env!()
환경에서 Bundler 변수를 제거해요.
unbundled_env()
Bundler 변수가 제거된 환경 해시를 반환해요.
unbundled_exec(*args)
Bundler가 없는 환경에서 명령을 exec 해요.
unbundled_system(*args)
Bundler가 없는 환경에서 시스템 명령을 실행해요.
use_system_gems?()
시스템 gem을 사용하는지 반환해요.
user_bundle_path(dir = "home")
사용자 번들 경로를 반환해요.
user_cache()
사용자 캐시 경로를 반환해요.
user_home()
사용자 홈 경로를 반환해요.
which(executable)
실행 파일의 경로를 PATH에서 찾아 반환해요.
with_clean_env() { || ... }
Bundler가 없는 깨끗한 환경에서 블록을 실행해요.
with_original_env() { || ... }
원래 환경에서 블록을 실행해요.
with_unbundled_env() { || ... }
Bundler 변수가 제거된 환경에서 블록을 실행해요.
Private Class Methods
configure_gem_home(path)
gem home을 구성해요.
configure_gem_path()
gem path를 구성해요.
eval_gemspec(path, contents)
gemspec 내용을 평가해 반환해요.
eval_yaml_gemspec(path, contents)
YAML gemspec 내용을 평가해 반환해요.
load_marshal(data, marshal_proc: nil)
marshal 데이터를 로드해요.
tmp_home_path()
임시 홈 경로를 반환해요.
unbundle_env(env)
지정한 환경 해시에서 Bundler 변수를 제거해 반환해요.
with_env(env) { || ... }
지정한 환경 해시로 임시 교체한 뒤 블록을 실행해요.
더 알아보기
require 'bundler/setup'— 프로젝트 의존성만 사용할 수 있는 환경을 자동 설정.Bundler::Settings,Bundler::Definition,Bundler::Environment등 내부 클래스.