Class: ReactOnRails::Dev::ProcessManager

Inherits:
Object
  • Object
show all
Defined in:
lib/react_on_rails/dev/process_manager.rb,
sig/react_on_rails/dev/process_manager.rbs

Constant Summary collapse

VERSION_CHECK_TIMEOUT =

Timeout for version check operations to prevent hanging

Returns:

  • (Integer)
5
ENV_KEYS_TO_PRESERVE =

Env vars set after Bundler.setup that must survive with_unbundled_env. with_unbundled_env restores the pre-Bundler env snapshot, so any var set at runtime (e.g. PORT by PortSelector) is lost. We capture them before entering the block and pass them explicitly to system(). This follows the same pattern used by Rails' bundle_command (railties), Spring's process spawning, and this codebase's own PackGenerator.

REACT_ON_RAILS_BASE_PORT and CONDUCTOR_PORT are intentionally excluded: by the time sub-processes spawn, configure_ports has already derived concrete values into PORT / SHAKAPACKER_DEV_SERVER_PORT / RENDERER_PORT / REACT_RENDERER_URL. Sub-processes should use those fixed ports rather than re-deriving from the base. SHAKAPACKER_SKIP_PRECOMPILE_HOOK is also runtime-only and must survive Bundler's env reset so nested shakapacker commands don't rerun the hook. RENDERER_URL is the legacy name for REACT_RENDERER_URL; preserved for mid-migration users (see ServerManager#warn_if_legacy_renderer_url_env_used). Inclusion here also matters when base-port mode scrubs the legacy var: preserve_runtime_env_vars returns nil (not the string "nil") for unset keys, which Process.spawn/system use to explicitly unset the variable in the child — preventing with_unbundled_env from resurrecting a stale pre-Bundler value. See the comment on preserve_runtime_env_vars below.

Returns:

%w[
  PORT
  SHAKAPACKER_DEV_SERVER_PORT
  RENDERER_PORT
  REACT_RENDERER_URL
  RENDERER_URL
  SHAKAPACKER_SKIP_PRECOMPILE_HOOK
].freeze

Class Method Summary collapse

Class Method Details

.ensure_procfile(procfile) ⇒ void

This method returns an undefined value.

Parameters:

  • (String)


48
49
50
51
52
53
54
55
56
# File 'lib/react_on_rails/dev/process_manager.rb', line 48

def ensure_procfile(procfile)
  return if File.exist?(procfile)

  warn <<~MSG
    ERROR:
    Please ensure `#{procfile}` exists in your project!
  MSG
  exit 1
end

.installed?(process) ⇒ Boolean

Check if a process is available and usable in the current execution context This accounts for bundler context where system commands might be intercepted

Parameters:

  • (String)

Returns:

  • (Boolean)


44
45
46
# File 'lib/react_on_rails/dev/process_manager.rb', line 44

def installed?(process)
  installed_in_current_context?(process)
end

.run_with_process_manager(procfile) ⇒ void

This method returns an undefined value.

Parameters:

  • (String)


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/react_on_rails/dev/process_manager.rb', line 58

def run_with_process_manager(procfile)
  # Validate procfile path for security
  unless valid_procfile_path?(procfile)
    warn "ERROR: Invalid procfile path: #{procfile}"
    exit 1
  end

  # Clean up stale files before starting
  FileManager.cleanup_stale_files

  # Try process managers in order of preference
  # run_process_if_available returns:
  #   - true/false (exit status) if process was found and executed
  #   - nil if process was not found
  overmind_result = run_process_if_available("overmind", ["start", "-f", procfile])
  return if overmind_result == true # Overmind ran successfully

  foreman_result = run_process_if_available("foreman", ["start", "-f", procfile])
  return if foreman_result == true # Foreman ran successfully

  # If either process was found but exited with error, don't show "not found" message
  # The process manager itself will have shown its own error message
  exit 1 if overmind_result == false || foreman_result == false

  # Neither process manager was found
  show_process_manager_installation_help
  exit 1
end