Поэтому у меня есть приложение, дерево что-то вроде этого:Не может повторно запустить мое приложение с ограждением или перезапускать
- Gemfile
- Guardfile
- source/
- dist/
- app.rb
Команда запуска сервер ruby app.rb
(или require_relative './app.rb'
, который делает то же самое)
Я хочу запустить эту команду и повторно запускать ее всякий раз, когда изменяется какой-либо файл.
Единственным исключением является dist/folder - любые изменения файла там должны быть проигнорированы.
Вот моя попытка до сих пор с guard
и guard-shell
(извинениями для кода сброса):
require 'childprocess'
# Global constant tracking whether the app has been started
RunningProcess = {gen_rb: false}
# Method to stop the app if it's been started
def ensure_exited_server
begin
RunningProcess[:gen_rb] && RunningProcess[:gen_rb].poll_for_exit(10)
rescue ChildProcess::TimeoutError
RunningProcess[:gen_rb].stop # tries increasingly harsher methods to kill the process.
end
nil
end
# Start the app using 'child-process'
def start_app
# prevent 'port in use' errors
ensure_exited_server
# The child-process gem starts a process and exposes its stdout
RunningProcess[:gen_rb] = ChildProcess.build("ruby", "gen.rb")
RunningProcess[:gen_rb].io.inherit!
RunningProcess[:gen_rb].start
nil
end
# Always start the app, not just when a file changes.
start_app
# The guard-shell gem runs a block whenever some set of files has changed.
guard :shell do
# This regex matches anything except the dist/ folder
watch /^[^dist\/].+/ do |m|
start_app
# Print a little message when a file changes.
m[0] + " has changed."
end
nil
end
# Make sure the app does not run after guard exits
at_exit { ensure_exited_server }
Это не когда-либо перезапустить мое приложение.
Проблема с перезапуском то, что я поднял вопрос об их репо о: см https://github.com/alexch/rerun/issues/107
Какая версия Ruby и какая версия Guard? – kcdragon
guard 2.14.0, ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] –