Démarrage rapide
Construisez et installez un module en local. Chaque module est autonome : il tire ses dépendances partagées depuis des git-tags et des paquets npm, sans avoir besoin des dépôts voisins.
1. Cloner et construire #
git clone https://github.com/kubuno/calendar && cd calendar
cargo build --release
(cd frontend && npm ci && npm run build)2. Empaqueter et installer #
bash build_deb.sh --install # → dist/kubuno-<id>_*.deb puis apt install localLe layout installé est /usr/lib/kubuno/modules/<id>/…. Un module doit avoir été installé une fois pour exister dans ce répertoire.
3. Boucle de dev rapide #
Pour itérer sans reconstruire un .deb :
bash _tools/deploy_local.sh <module> # backend + frontend
bash _tools/deploy_local.sh <module> --frontend # frontend seul (le plus rapide)Votre premier endpoint — au choix du langage #
Un module n'est qu'un service HTTP local que le core proxifie. Le core supervise nativement les runtimes Rust, Python et Node, mais n'importe quel langage qui parle HTTP peut être un module : déclarez runtime = "binary" dans le manifeste et fournissez l'exécutable. Voici le même endpoint /ping dans cinq langages :
// Rust — Axum
use axum::{routing::get, Json, Router};
use serde_json::json;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/ping", get(|| async { Json(json!({ "ok": true })) }));
let l = tokio::net::TcpListener::bind("127.0.0.1:3190").await.unwrap();
axum::serve(l, app).await.unwrap();
}<?php
// PHP — lancé avec : php -S 127.0.0.1:3190 router.php
header('Content-Type: application/json');
if (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) === '/ping') {
echo json_encode(['ok' => true]);
exit;
}
http_response_code(404);# Python — Flask
from flask import Flask, jsonify
app = Flask(__name__)
@app.get("/ping")
def ping():
return jsonify(ok=True)
app.run(host="127.0.0.1", port=3190)// Go — net/http
package main
import (
"encoding/json"
"net/http"
)
func main() {
http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(map[string]bool{"ok": true})
})
http.ListenAndServe("127.0.0.1:3190", nil)
}# Perl — Mojolicious::Lite
use Mojolicious::Lite -signatures;
get '/ping' => sub ($c) {
$c->render(json => { ok => \1 });
};
app->start('daemon', '-l', 'http://127.0.0.1:3190');Le port (ici 3190) doit correspondre à celui déclaré dans [server] du module.toml. Le module n'écoute que sur 127.0.0.1 : c'est le core qui l'expose.
4. Checklist de fin de tâche #
cargo build --release(+SQLX_OFFLINE=truesi cache.sqlx).cd frontend && npm run buildpuistsc -b.- Tester réellement (curl, navigateur) — pas seulement compiler.
cargo cleanaprès un build lourd.
Si vous touchez à une crate partagée ou à une lib @kubuno/*, prévoyez un nouveau tag / version npm puis bumpez la dépendance dans les modules.