diff --git a/docs/content/documentation/getting-started/cli-usage.md b/docs/content/documentation/getting-started/cli-usage.md index a27edc5..e74a5ac 100644 --- a/docs/content/documentation/getting-started/cli-usage.md +++ b/docs/content/documentation/getting-started/cli-usage.md @@ -56,6 +56,8 @@ the interface/port combination to use if you want something different than the d You can also specify different addresses for the interface and base_url using `-u`/`--base-url`, for example if you are running zola in a Docker container. +In the event you don't want zola to run a local webserver, you can use the `--watch-only` flag. + ```bash $ zola serve $ zola serve --port 2000 @@ -63,6 +65,7 @@ $ zola serve --interface 0.0.0.0 $ zola serve --interface 0.0.0.0 --port 2000 $ zola serve --interface 0.0.0.0 --base-url 127.0.0.1 $ zola serve --interface 0.0.0.0 --port 2000 --output-dir www/public +$ zola serve --watch-only ``` The serve command will watch all your content and will provide live reload, without diff --git a/src/cli.rs b/src/cli.rs index fcf7271..ca40aaa 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -62,6 +62,10 @@ pub fn build_cli() -> App<'static, 'static> { .default_value("127.0.0.1") .takes_value(true) .help("Changes the base_url"), + Arg::with_name("watch_only") + .long("watch-only") + .takes_value(false) + .help("Do not start a server, just re-build project on changes") ]), ]) } diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 9107109..e4794c7 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -166,6 +166,7 @@ pub fn serve( output_dir: &str, base_url: &str, config_file: &str, + watch_only: bool, ) -> Result<()> { let start = Instant::now(); let (mut site, address) = create_new_site(interface, port, output_dir, base_url, config_file)?; @@ -206,49 +207,56 @@ pub fn serve( // output path is going to need to be moved later on, so clone it for the // http closure to avoid contention. let static_root = output_path.clone(); - thread::spawn(move || { - let s = server::new(move || { - App::new() - .middleware(NotFoundHandler { rendered_template: static_root.join("404.html") }) - .resource(r"/livereload.js", |r| r.f(livereload_handler)) - // Start a webserver that serves the `output_dir` directory - .handler( - r"/", - fs::StaticFiles::new(&static_root) - .unwrap() - .show_files_listing() - .files_listing_renderer(handle_directory), - ) - }) - .bind(&address) - .expect("Can't start the webserver") - .shutdown_timeout(20); - println!("Web server is available at http://{}", &address); - s.run(); - }); - - // The websocket for livereload - let ws_server = WebSocket::new(|output: Sender| { - move |msg: Message| { - if msg.into_text().unwrap().contains("\"hello\"") { - return output.send(Message::text( - r#" - { - "command": "hello", - "protocols": [ "http://livereload.com/protocols/official-7" ], - "serverName": "Zola" - } - "#, - )); + let broadcaster = if !watch_only { + + thread::spawn(move || { + let s = server::new(move || { + App::new() + .middleware(NotFoundHandler { rendered_template: static_root.join("404.html") }) + .resource(r"/livereload.js", |r| r.f(livereload_handler)) + // Start a webserver that serves the `output_dir` directory + .handler( + r"/", + fs::StaticFiles::new(&static_root) + .unwrap() + .show_files_listing() + .files_listing_renderer(handle_directory), + ) + }) + .bind(&address) + .expect("Can't start the webserver") + .shutdown_timeout(20); + println!("Web server is available at http://{}", &address); + s.run(); + }); + // The websocket for livereload + let ws_server = WebSocket::new(|output: Sender| { + move |msg: Message| { + if msg.into_text().unwrap().contains("\"hello\"") { + return output.send(Message::text( + r#" + { + "command": "hello", + "protocols": [ "http://livereload.com/protocols/official-7" ], + "serverName": "Zola" + } + "#, + )); + } + Ok(()) } - Ok(()) - } - }) - .unwrap(); - let broadcaster = ws_server.broadcaster(); - thread::spawn(move || { - ws_server.listen(&*ws_address).unwrap(); - }); + }) + .unwrap(); + let broadcaster = ws_server.broadcaster(); + thread::spawn(move || { + ws_server.listen(&*ws_address).unwrap(); + }); + Some(broadcaster) + } else { + println!("Watching in watch only mode, no web server will be started"); + None + }; + let pwd = env::current_dir().unwrap(); @@ -297,21 +305,25 @@ pub fn serve( match detect_change_kind(&pwd, &path) { (ChangeKind::Content, _) => { console::info(&format!("-> Content changed {}", path.display())); - // Force refresh - rebuild_done_handling( - &broadcaster, - rebuild::after_content_change(&mut site, &path), - "/x.js", - ); + if let Some(ref broadcaster) = broadcaster { + // Force refresh + rebuild_done_handling( + broadcaster, + rebuild::after_content_change(&mut site, &path), + "/x.js", + ); + } } (ChangeKind::Templates, _) => { console::info(&format!("-> Template changed {}", path.display())); - // Force refresh - rebuild_done_handling( - &broadcaster, - rebuild::after_template_change(&mut site, &path), - "/x.js", - ); + if let Some(ref broadcaster) = broadcaster { + // Force refresh + rebuild_done_handling( + broadcaster, + rebuild::after_template_change(&mut site, &path), + "/x.js", + ); + } } (ChangeKind::StaticFiles, p) => { if path.is_file() { @@ -319,21 +331,25 @@ pub fn serve( "-> Static file changes detected {}", path.display() )); + if let Some(ref broadcaster) = broadcaster { + rebuild_done_handling( + broadcaster, + copy_file(&path, &site.output_path, &site.static_path), + &p.to_string_lossy(), + ); + } + } + } + (ChangeKind::Sass, p) => { + console::info(&format!("-> Sass file changed {}", path.display())); + if let Some(ref broadcaster) = broadcaster { rebuild_done_handling( &broadcaster, - copy_file(&path, &site.output_path, &site.static_path), + site.compile_sass(&site.base_path), &p.to_string_lossy(), ); } } - (ChangeKind::Sass, p) => { - console::info(&format!("-> Sass file changed {}", path.display())); - rebuild_done_handling( - &broadcaster, - site.compile_sass(&site.base_path), - &p.to_string_lossy(), - ); - } (ChangeKind::Config, _) => { console::info("-> Config changed. The whole site will be reloaded. The browser needs to be refreshed to make the changes visible."); site = create_new_site( diff --git a/src/main.rs b/src/main.rs index b9ae55b..987e08b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,11 +77,11 @@ fn main() { ::std::process::exit(1); } } - + let watch_only = matches.is_present("watch_only"); let output_dir = matches.value_of("output_dir").unwrap(); let base_url = matches.value_of("base_url").unwrap(); console::info("Building site..."); - match cmd::serve(interface, port, output_dir, base_url, config_file) { + match cmd::serve(interface, port, output_dir, base_url, config_file, watch_only) { Ok(()) => (), Err(e) => { console::unravel_errors("", &e);