Compare commits
5 Commits
c342d922a7
...
4d34215aa5
Author | SHA1 | Date | |
---|---|---|---|
|
4d34215aa5 | ||
|
237bbe789f | ||
|
1ae80c161f | ||
668a91941b | |||
|
0eaf238735 |
11
README.md
11
README.md
@ -47,6 +47,17 @@ Si vous souhaitez lancer les composants séparément, les indications de lanceme
|
||||
- [app](crates/app/README.md)
|
||||
- [sesam-vitale](crates/sesam-vitale/README.md)
|
||||
|
||||
## Rechargement automatique
|
||||
|
||||
Pour permettre de développer plus rapidement, il existe une librairie qui recompile automatiquement nos modifications en cours : [`cargo-watch`](https://github.com/watchexec/cargo-watch) permet de relancer une commande _Rust_ lorsqu'un fichier est modifié (example: `cargo run` --> `cargo watch -x run`).
|
||||
|
||||
La librairie ne fait pas partie des dépendances du projet, il faut donc l'installer avec la commande suivante :
|
||||
```bash
|
||||
cargo install cargo-watch
|
||||
```
|
||||
|
||||
Le fichier [`.ignore`](./ignore) permet d'ignorer certains fichiers pour éviter de relancer la recompilation inutilement.
|
||||
|
||||
## Build
|
||||
|
||||
Packager le client desktop
|
||||
|
@ -13,4 +13,3 @@ serde = { version = "1.0.204", features = ["derive"] }
|
||||
tokio = { version = "1.39.1", features = ["macros", "rt-multi-thread"] }
|
||||
tower-http = { version = "0.5.2", features = ["fs"] }
|
||||
tower-livereload = "0.9.3"
|
||||
|
||||
|
@ -14,16 +14,27 @@
|
||||
cargo run --bin app
|
||||
```
|
||||
|
||||
## L'auto-reload
|
||||
## Rechargement automatique (_auto-reload_)
|
||||
|
||||
Pour permettre au projet de s'auto-recharger lors du développement, nous avons besoin de 2 librairies :
|
||||
Pour le projet `app`, nous utilisons en plus de `cargo-watch` ses librairies :
|
||||
- [`systemfd`](https://github.com/mitsuhiko/systemfd) permet de redémarrer un serveur sans interrompre les connexions en cours, il transmet le descripteur de fichier du socket à une nouvelle instance du serveur (exemple: `cargo watch -x run` --> `systemfd --no-pid -s http::3000 -- cargo watch -x run`). Si le port est déjà pris il en prendra un autre.
|
||||
- [`listenfd`](https://github.com/mitsuhiko/listenfd) permet, côté _Rust_, de démarrer un serveur en utilisant des connexions déjà ouvertes.
|
||||
|
||||
La librairie `systemfd` ne fait pas partie des dépendances du projet, il faut donc l'installer avec la commande suivante :
|
||||
```bash
|
||||
cargo install cargo-watch systemfd
|
||||
cargo install systemfd
|
||||
```
|
||||
|
||||
Pour recompiler automatiquement le serveur lors de changement :
|
||||
Pour notre application voici la commande à lancer :
|
||||
|
||||
```bash
|
||||
systemfd --no-pid -s http::3000 -- cargo watch -x 'run --bin app'
|
||||
```
|
||||
|
||||
## Chargement à chaud (_livereload_)
|
||||
|
||||
Pour que notre navigateur rafraîchisse automatique notre page lorsque le serveur a été recompilé, nous utilisons la librairie [`tower-livereload`](https://github.com/leotaku/tower-livereload).
|
||||
|
||||
A chaque changement, que ça soit sur du code en _Rust_, _HTML_, _CSS_ ou _JS_ alors le navigateur va recharger entièrement la page.
|
||||
|
||||
En Rust, il n'existe pas encore d'outil de _Hot Reload_ complet et intégré comme on en trouve dans d'autres environnements de développement web, comme pour _Node.js_.
|
||||
|
@ -1,9 +1,9 @@
|
||||
use ::app::get_router;
|
||||
use axum::http::Request;
|
||||
use listenfd::ListenFd;
|
||||
use notify::Watcher;
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
use listenfd::ListenFd;
|
||||
use tokio::net::TcpListener;
|
||||
use tower_livereload::LiveReloadLayer;
|
||||
|
||||
@ -20,10 +20,13 @@ async fn main() {
|
||||
let livereload = LiveReloadLayer::new();
|
||||
let reloader = livereload.reloader();
|
||||
|
||||
let router = get_router(assets_path.as_path()).layer(livereload.request_predicate(not_htmx_predicate));
|
||||
let router =
|
||||
get_router(assets_path.as_path()).layer(livereload.request_predicate(not_htmx_predicate));
|
||||
|
||||
let mut watcher = notify::recommended_watcher(move |_| reloader.reload()).unwrap();
|
||||
watcher.watch(&templates_path, notify::RecursiveMode::Recursive).unwrap();
|
||||
watcher
|
||||
.watch(&templates_path, notify::RecursiveMode::Recursive)
|
||||
.unwrap();
|
||||
|
||||
let mut listenfd = ListenFd::from_env();
|
||||
let listener = match listenfd.take_tcp_listener(0).unwrap() {
|
||||
@ -39,5 +42,7 @@ async fn main() {
|
||||
println!("Listening on: http://{}", listener.local_addr().unwrap());
|
||||
|
||||
// Run the server with the router
|
||||
axum::serve(listener, router.into_make_service()).await.unwrap();
|
||||
axum::serve(listener, router.into_make_service())
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
@ -7,4 +7,4 @@ struct CpsResponse;
|
||||
|
||||
pub async fn cps() -> impl IntoResponse {
|
||||
CpsResponse.into_response()
|
||||
}
|
||||
}
|
||||
|
@ -7,4 +7,4 @@ struct HomeResponse;
|
||||
|
||||
pub async fn home() -> impl IntoResponse {
|
||||
HomeResponse.into_response()
|
||||
}
|
||||
}
|
||||
|
@ -7,4 +7,4 @@ pub fn get_routes() -> Router {
|
||||
Router::new()
|
||||
.route("/home", routing::get(home::home))
|
||||
.route("/cps", routing::get(cps::cps))
|
||||
}
|
||||
}
|
||||
|
@ -11,10 +11,10 @@ struct HelloResponse {
|
||||
async fn hello() -> impl IntoResponse {
|
||||
HelloResponse {
|
||||
name: "Theo".to_string(),
|
||||
}.into_response()
|
||||
}
|
||||
.into_response()
|
||||
}
|
||||
|
||||
pub fn get_routes() -> Router {
|
||||
Router::new()
|
||||
.route("/", routing::get(hello))
|
||||
Router::new().route("/", routing::get(hello))
|
||||
}
|
||||
|
@ -25,7 +25,9 @@ impl MenuResponse {
|
||||
fn get_classes(&self, is_current_item: &bool) -> String {
|
||||
let common_classes = match self.mobile {
|
||||
true => "block border-l-4 py-2 pl-3 pr-4 text-base font-medium".to_string(),
|
||||
false => "inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium".to_string(),
|
||||
false => {
|
||||
"inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium".to_string()
|
||||
}
|
||||
};
|
||||
match (self.mobile, is_current_item) {
|
||||
(true, true) => common_classes + " border-indigo-500 bg-indigo-50 text-indigo-700",
|
||||
@ -50,11 +52,11 @@ async fn menu(Query(params): Query<MenuParameters>) -> impl IntoResponse {
|
||||
href: "/pages/cps".to_string(),
|
||||
current: false,
|
||||
},
|
||||
],
|
||||
}.into_response()
|
||||
],
|
||||
}
|
||||
.into_response()
|
||||
}
|
||||
|
||||
pub fn get_routes() -> Router {
|
||||
Router::new()
|
||||
.route("/menu", routing::get(menu))
|
||||
Router::new().route("/menu", routing::get(menu))
|
||||
}
|
||||
|
@ -56,10 +56,10 @@ async fn menu(Query(params): Query<MenuParameters>) -> impl IntoResponse {
|
||||
current: false,
|
||||
},
|
||||
],
|
||||
}.into_response()
|
||||
}
|
||||
.into_response()
|
||||
}
|
||||
|
||||
pub fn get_routes() -> Router {
|
||||
Router::new()
|
||||
.route("/menu", routing::get(menu))
|
||||
}
|
||||
Router::new().route("/menu", routing::get(menu))
|
||||
}
|
||||
|
@ -16,7 +16,10 @@ fn main() {
|
||||
|
||||
// Add local lib directory to the linker search path (for def files and static libs)
|
||||
let static_lib_path = manifest_path.join("lib");
|
||||
println!("cargo::rustc-link-search=native={}", static_lib_path.display());
|
||||
println!(
|
||||
"cargo::rustc-link-search=native={}",
|
||||
static_lib_path.display()
|
||||
);
|
||||
|
||||
// Add the SESAM_FSV_LIB_PATH to the linker search path
|
||||
let fsv_lib_path = PathBuf::from(env::var("SESAM_FSV_LIB_PATH").unwrap());
|
||||
@ -31,6 +34,9 @@ fn main() {
|
||||
}
|
||||
|
||||
// Link the SESAM_FSV_SSVLIB dynamic library
|
||||
println!("cargo::rustc-link-lib=dylib={}", env::var("SESAM_FSV_SSVLIB").unwrap());
|
||||
println!(
|
||||
"cargo::rustc-link-lib=dylib={}",
|
||||
env::var("SESAM_FSV_SSVLIB").unwrap()
|
||||
);
|
||||
// TODO : try `raw-dylib` instead of `dylib` on Windows to avoid the need of the `lib` headers compiled from the `def`
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user