Aller au contenu

05. Spécification des Manifestes Modulaires

Navigation : Documentation > 05. Spécification des Manifestes Modulaires


Sommaire

  1. Structure Modulaire des Paquets
  2. Spécification Détaillée des Modules parts/
  3. parts/package.toml (Métadonnées, Dépendances et Sécurité SLSA)
  4. parts/targets.toml (Cibles Multiplateformes & Binaires)
  5. parts/environment.toml (Variables d'Environnement Permanentes Gérées)
  6. parts/verification.toml (Sanity Checks Obligatoires)
  7. parts/shortcuts.toml (Raccourcis Bureau et Lanceurs)
  8. parts/autoupdate.toml (Surveillance Automatisée des Releases)
  9. Agrégation dans manifest.toml

1. Structure Modulaire des Paquets

Chaque paquet est défini par un dossier portant le nom du binaire (en minuscules, sans espaces ni numéro de version), découpé en modules TOML dédiés dans un sous-dossier parts/ :

ripgrep/
├── manifest.toml         # Point d'entrée d'agrégation déclaratif
├── pre_install.nu        # Script normalisé optionnel (pré-installation)
├── post_install.nu       # Script normalisé optionnel (post-installation)
├── pre_uninstall.nu      # Script normalisé optionnel (pré-désinstallation)
├── post_uninstall.nu     # Script normalisé optionnel (post-désinstallation)
└── parts/
    ├── package.toml      # Identité, dépendances, SLSA et compatibilité Nushell
    ├── targets.toml      # Sources de téléchargement, checksums et binaires
    ├── environment.toml  # Variables d'environnement permanentes
    ├── verification.toml # Tests obligatoires post-installation (check_version, check_help)
    ├── shortcuts.toml    # Définition des raccourcis OS
    └── autoupdate.toml   # Règles de surveillance pour le bot CI

2. Spécification Détaillée des Modules parts/

2.1 parts/package.toml (Métadonnées, Dépendances et Sécurité SLSA)

name = "ripgrep"
version = "14.1.0"
description = "Fast line-oriented search tool combining grep with find"
homepage = "https://github.com/BurntSushi/ripgrep"
license = "MIT OR Unlicense"
category = "cli"                  # "cli" | "gui" | "font" | "runtime"
min_nu_version = "0.95.0"         # Version minimale requise du moteur Nushell
depends_on = []                  # Dépendances linéaires (ex: ["vcredist-2022"])

# Attestation de provenance de build cryptographique optionnelle (SLSA Level 3)
[security.slsa]
required = false
builder_identity = "https://github.com/BurntSushi/ripgrep/.github/workflows/release.yml@refs/tags/14.1.0"

2.2 parts/targets.toml (Cibles Multiplateformes & Binaires)

[targets.x86_64-windows]
url = "https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep-14.1.0-x86_64-pc-windows-msvc.zip"
sha256 = "6b66ec01509170314bbf255f0b5435a297e558838a58ecadfc7c6dcf6ef31c44"
archive_type = "zip"             # "zip" | "tar.gz" | "tar.xz" | "tar.zst" | "7z"
extract_dir = "ripgrep-14.1.0-x86_64-pc-windows-msvc"
binaries = [
    { source = "rg.exe", alias = "rg" }
]

[targets.x86_64-linux]
url = "https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep-14.1.0-x86_64-unknown-linux-musl.tar.gz"
sha256 = "9190db994fa10335e2e8df81cbe163dd8d8b1e428ab2c3ee369ea76fa968e7ec"
archive_type = "tar.gz"
libc = "musl"                    # "musl" (statique) | "glibc-2.31"
extract_dir = "ripgrep-14.1.0-x86_64-unknown-linux-musl"
binaries = [
    { source = "rg", alias = "rg" }
]

[targets.aarch64-macos]
url = "https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep-14.1.0-aarch64-apple-darwin.tar.gz"
sha256 = "910f5451fa86f56e9f2ef0aa8fcb6a98abf66c0fc951c4a004f21ea6b68aefae"
archive_type = "tar.gz"
extract_dir = "ripgrep-14.1.0-aarch64-apple-darwin"
binaries = [
    { source = "rg", alias = "rg" }
]

2.3 parts/environment.toml (Variables d'Environnement Permanentes Gérées)

# Exemple pour le paquet openjdk :
[variables]
JAVA_HOME = "$ctx.paths.install"
JDK_HOME = "$ctx.paths.install"

[path_additions]
paths = [
    "$ctx.paths.install/bin"
]

2.4 parts/verification.toml (Sanity Checks Obligatoires)

[verification]
check_version = { command = "rg --version", expected_regex = 'ripgrep 14\.1\.0' }
check_help = { command = "rg --help", expected_contains = "USAGE:" }

2.5 parts/shortcuts.toml (Raccourcis Bureau et Lanceurs)

[shortcuts]
enabled = false
# Exemple pour une application GUI :
# name = "Visual Studio Code"
# binary = "Code.exe"
# icon = "resources/app.ico"
# categories = ["Development", "IDE"]

2.6 parts/autoupdate.toml (Surveillance Automatisée des Releases)

[autoupdate]
enabled = true
source = "github-release"
repository = "BurntSushi/ripgrep"
tag_regex = '^v?([0-9.]+)$'
url_template = "https://github.com/BurntSushi/ripgrep/releases/download/$version/ripgrep-$version-$target_ext"

3. Agrégation dans manifest.toml

Le fichier manifest.toml sert de point d'entrée d'agrégation formel :

[modules]
package = "parts/package.toml"
targets = "parts/targets.toml"
environment = "parts/environment.toml"
verification = "parts/verification.toml"
shortcuts = "parts/shortcuts.toml"
autoupdate = "parts/autoupdate.toml"

Nushell agrège ces fragments en mémoire lors du chargement :

def load-manifest [pkg_dir: path] {
    ls ($pkg_dir | path join "parts/*.toml")
    | reduce -f {} {|it, acc| $acc | merge (open $it.name) }
}