2016-08-07 15 views
1

So habe ich eine App, ist der Baum etwas wie folgt aus:Kann meine app mit Wache nicht erneut ausführen oder erneut ausführen

- Gemfile 
- Guardfile 
- source/ 
- dist/ 
- app.rb 

Der Befehl der Server zu starten ist ruby app.rb (oder require_relative './app.rb', die die gleiche Sache tut)

Ich möchte diesen Befehl ausführen und erneut ausführen, wenn sich eine Datei ändert.

Die einzige Ausnahme ist der dist/Ordner - alle Dateiänderungen dort sollten ignoriert werden.

Hier ist mein Versuch, so weit mit guard und guard-shell (Entschuldigung für die Code-Dump):

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 } 

Dies gilt nicht immer meine Anwendung neu starten.

Das Problem mit Rerun ist etwas, das ich ein Problem über auf ihren Repo angehoben: siehe https://github.com/alexch/rerun/issues/107

+0

Welche Version von Ruby und welche Version von Guard? – kcdragon

+0

guard 2.14.0, Ruby 2.3.0p0 (2015-12-25 Revision 53290) [x86_64-linux] –

Antwort

1

Wie wäre es so etwas für Ihre Guardfile?

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

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

Statt Auflistung, die diese watch Staaten, welche Verzeichnisse/Dateien verwenden zu ignorieren Verzeichnisse.

+0

Ich habe dies in der Frage nicht erwähnt, aber ich habe schlanke, rb, Kaffee, Sass, und js-Dateien, die Die App precompiliert und ich muss zusehen. Ich hatte gehofft, '--ignore' zu ​​verwenden, so dass ich Quelldateien in Top-Level-Ordnern außer Source/haben könnte. –

+0

Ehrfürchtig, ich habe es funktioniert mit Ihrem Vorschlag zu enthalten, anstatt in der Regex auszuschließen. Ich mache die 'Ausschluß'-Prüfung mit' start_app, außer m.instance_variable_get ("@ original_value"). To_s.include? ("Dist /") '. –

+0

Ich bin immer noch interessiert zu wissen, ob das 'exclude'-Regex-Muster im Guard grundlegend gebrochen ist, oder ob etwas mit meinem ursprünglichen Ansatz nicht stimmt. –