Class: Bridgetown::Commands::Start

Inherits:
Thor::Group
  • Object
show all
Extended by:
BuildOptions, Summarizable
Includes:
ConfigurationOverridable, Inclusive
Defined in:
lib/bridgetown-core/commands/start.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BuildOptions

extended

Methods included from Summarizable

summary

Methods included from ConfigurationOverridable

#configuration_with_overrides, included

Class Method Details

[View source]

59
60
61
# File 'lib/bridgetown-core/commands/start.rb', line 59

def self.banner
  "bridgetown start [options]"
end

Instance Method Details

#startObject

[View source]

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/bridgetown-core/commands/start.rb', line 64

def start
  pid_tracker = packages[Bridgetown::Foundation::Packages::PidTracker]
  Bridgetown.logger.writer.enable_prefix
  Bridgetown::Commands::Build.print_startup_message
  sleep 0.25

  options = Thor::CoreExt::HashWithIndifferentAccess.new(self.options)
  options[:start_command] = true

  # Load Bridgetown configuration into thread memory
  bt_options = configuration_with_overrides(options)
  port = ENV.fetch("BRIDGETOWN_PORT", bt_options.port)
  # TODO: support Puma serving HTTPS directly?
  bt_bound_url = "http://#{bt_options.bind}:#{port}"

  # Set a local site URL in the config if one is not available
  if Bridgetown.env.development? && !options["url"]
    bt_options.url = bt_bound_url.sub("0.0.0.0", "localhost")
  end

  Bridgetown::Server.new({
    Host: bt_options.bind,
    Port: port,
    config: rack_config_file,
  }).tap do |server|
    if server.serveable?
      pid_tracker.create_pid_dir

      bt_options.skip_live_reload = !server.using_puma?

      build_args = ["-w"] + ARGV.reject { |arg| arg == "start" }
      build_pid = Process.fork { Bridgetown::Commands::Build.start(build_args) }
      pid_tracker.add_pid(build_pid, file: :bridgetown)

      after_stop_callback = -> {
        say "Stopping Bridgetown server..."
        Bridgetown::Hooks.trigger :site, :server_shutdown
        Process.kill "SIGINT", build_pid
        pid_tracker.remove_pidfile :bridgetown

        # Shut down the frontend bundler etc. if they're running
        unless Bridgetown.env.production? || bt_options[:skip_frontend]
          Bridgetown::Utils::Aux.kill_processes
        end
      }

      Bridgetown.logger.info ""
      Bridgetown.logger.info "Booting #{server.name} at:", bt_bound_url.to_s.magenta
      Bridgetown.logger.info ""

      server.start(after_stop_callback)
    else
      say "Unable to find a Rack server."
    end
  end
end