2016-08-07 7 views
1

Поэтому у меня есть приложение, дерево что-то вроде этого:Не может повторно запустить мое приложение с ограждением или перезапускать

- 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

+0

Какая версия Ruby и какая версия Guard? – kcdragon

+0

guard 2.14.0, ruby ​​2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] –

ответ

1

Как о чем-то вроде этого для вашего Guardfile?

guard :shell do 
    watch(%r{^source/.+\.(rb)}) do |m| 
    `ruby app.rb` 
    end 

    watch('app.rb') do |m| 
    `ruby app.rb` 
    end 
end 

Вместо того, чтобы список каталогов, которые игнорировать, это watch состояния, какие каталоги/файлы для использования.

+0

Я не упоминал об этом в вопросе, но у меня есть файлы slim, rb, coffee, sass и js, которые приложение прекомпилирует, и мне нужно посмотреть. Я надеялся использовать '--ignore', чтобы иметь исходные файлы в папках верхнего уровня, отличных от source /. –

+0

Удивительно, я получил его работу с вашим предложением включить, а не исключать в регулярном выражении. Я делаю «исключение» с помощью 'start_app, если m.instance_variable_get (« @ original_value »). To_s.include? (« Dist/»)'. –

+0

Мне все еще интересно узнать, принципиально ли нарушен шаблон регулярного выражения 'exclude', или если что-то не так с моим оригинальным подходом. –

Смежные вопросы