module Bootsnap

Ruby C extensions are initialized by calling Init_<extname>.

This sets up the module hierarchy and attaches functions as methods.

We also populate some semi-static information about the current OS and so on.

Constants

InvalidConfiguration
VERSION

Attributes

logger[R]

Public Class Methods

_instrument(event, path) click to toggle source
# File lib/bootsnap.rb, line 33
def _instrument(event, path)
  @instrumentation.call(event, path)
end
absolute_path?(path) click to toggle source
# File lib/bootsnap.rb, line 127
def absolute_path?(path)
  path[1] == ":"
end
default_setup() click to toggle source
# File lib/bootsnap.rb, line 85
def default_setup
  env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || ENV["ENV"]
  development_mode = ["", nil, "development"].include?(env)

  unless ENV["DISABLE_BOOTSNAP"]
    cache_dir = ENV["BOOTSNAP_CACHE_DIR"]
    unless cache_dir
      config_dir_frame = caller.detect do |line|
        line.include?("/config/")
      end

      unless config_dir_frame
        $stderr.puts("[bootsnap/setup] couldn't infer cache directory! Either:")
        $stderr.puts("[bootsnap/setup]   1. require bootsnap/setup from your application's config directory; or")
        $stderr.puts("[bootsnap/setup]   2. Define the environment variable BOOTSNAP_CACHE_DIR")

        raise("couldn't infer bootsnap cache directory")
      end

      path = config_dir_frame.split(/:\d+:/).first
      path = File.dirname(path) until File.basename(path) == "config"
      app_root = File.dirname(path)

      cache_dir = File.join(app_root, "tmp", "cache")
    end

    setup(
      cache_dir: cache_dir,
      development_mode: development_mode,
      load_path_cache: !ENV["DISABLE_BOOTSNAP_LOAD_PATH_CACHE"],
      compile_cache_iseq: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"] && iseq_cache_supported?,
      compile_cache_yaml: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"],
      compile_cache_json: !ENV["DISABLE_BOOTSNAP_COMPILE_CACHE"],
    )

    if ENV["BOOTSNAP_LOG"]
      log!
    end
  end
end
instrumentation=(callback) click to toggle source
# File lib/bootsnap.rb, line 26
def instrumentation=(callback)
  @instrumentation = callback
  if respond_to?(:instrumentation_enabled=, true)
    self.instrumentation_enabled = !!callback
  end
end
instrumentation_enabled=(p1) click to toggle source
static VALUE
bs_instrumentation_enabled_set(VALUE self, VALUE enabled)
{
  instrumentation_enabled = RTEST(enabled);
  return enabled;
}
iseq_cache_supported?() click to toggle source
# File lib/bootsnap.rb, line 78
def iseq_cache_supported?
  return @iseq_cache_supported if defined? @iseq_cache_supported

  ruby_version = Gem::Version.new(RUBY_VERSION)
  @iseq_cache_supported = ruby_version < Gem::Version.new("2.5.0") || ruby_version >= Gem::Version.new("2.6.0")
end
log!() click to toggle source
# File lib/bootsnap.rb, line 13
def log!
  self.logger = $stderr.method(:puts)
end
logger=(logger) click to toggle source
# File lib/bootsnap.rb, line 17
def logger=(logger)
  @logger = logger
  self.instrumentation = if logger.respond_to?(:debug)
    ->(event, path) { @logger.debug("[Bootsnap] #{event} #{path}") }
  else
    ->(event, path) { @logger.call("[Bootsnap] #{event} #{path}") }
  end
end
setup( cache_dir:, development_mode: true, load_path_cache: true, autoload_paths_cache: nil, disable_trace: nil, compile_cache_iseq: true, compile_cache_yaml: true, compile_cache_json: true ) click to toggle source
# File lib/bootsnap.rb, line 37
def setup(
  cache_dir:,
  development_mode: true,
  load_path_cache: true,
  autoload_paths_cache: nil,
  disable_trace: nil,
  compile_cache_iseq: true,
  compile_cache_yaml: true,
  compile_cache_json: true
)
  unless autoload_paths_cache.nil?
    warn "[DEPRECATED] Bootsnap's `autoload_paths_cache:` option is deprecated and will be removed. " \
      "If you use Zeitwerk this option is useless, and if you are still using the classic autoloader " \
      "upgrading is recommended."
  end

  unless disable_trace.nil?
    warn "[DEPRECATED] Bootsnap's `disable_trace:` option is deprecated and will be removed. " \
      "If you use Ruby 2.5 or newer this option is useless, if not upgrading is recommended."
  end

  if compile_cache_iseq && !iseq_cache_supported?
    warn "Ruby 2.5 has a bug that break code tracing when code is loaded from cache. It is recommened " \
      "to turn `compile_cache_iseq` off on Ruby 2.5"
  end

  if load_path_cache
    Bootsnap::LoadPathCache.setup(
      cache_path: cache_dir + "/bootsnap/load-path-cache",
      development_mode: development_mode,
    )
  end

  Bootsnap::CompileCache.setup(
    cache_dir: cache_dir + "/bootsnap/compile-cache",
    iseq: compile_cache_iseq,
    yaml: compile_cache_yaml,
    json: compile_cache_json,
  )
end

Public Instance Methods

bundler?() click to toggle source
# File lib/bootsnap/bundler.rb, line 5
def bundler?
  return false unless defined?(::Bundler)

  # Bundler environment variable
  %w(BUNDLE_BIN_PATH BUNDLE_GEMFILE).each do |current|
    return true if ENV.key?(current)
  end

  false
end