1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
require "shellwords"
require "socket"
require "webpacker/configuration"
require "webpacker/dev_server"
require "webpacker/runner"
module Webpacker
class DevServerRunner < Webpacker::Runner
def run
load_config
detect_port!
execute_cmd
end
private
def load_config
app_root = Pathname.new(@app_path)
@config = Configuration.new(
root_path: app_root,
config_path: app_root.join("config/webpacker.yml"),
env: ENV["RAILS_ENV"]
)
dev_server = DevServer.new(@config)
@hostname = dev_server.host
@port = dev_server.port
@pretty = dev_server.pretty?
rescue Errno::ENOENT, NoMethodError
$stdout.puts "webpack dev_server configuration not found in #{@config.config_path}[#{ENV["RAILS_ENV"]}]."
$stdout.puts "Please run bundle exec rails webpacker:install to install Webpacker"
exit!
end
def detect_port!
server = TCPServer.new(@hostname, @port)
server.close
rescue Errno::EADDRINUSE
$stdout.puts "Another program is running on port #{@port}. Set a new port in #{@config.config_path} for dev_server"
exit!
end
def execute_cmd
env = Webpacker::Compiler.env
env["WEBPACKER_CONFIG"] = @webpacker_config
cmd = if node_modules_bin_exist?
["#{@node_modules_bin_path}/webpack-dev-server"]
else
["yarnpkg", "webpack-dev-server"]
end
if @argv.include?("--debug-webpacker")
cmd = [ "node", "--inspect-brk"] + cmd
end
cmd += ["--config", @webpack_config]
cmd += ["--progress", "--color"] if @pretty
Dir.chdir(@app_path) do
Kernel.exec env, *cmd
end
end
def node_modules_bin_exist?
File.exist?("#{@node_modules_bin_path}/webpack-dev-server")
end
end
end
|