Gestion de dépendances Git pour IBM i : un gestionnaire de packages inspiré de npm
ven 23 janvier 2026Le problème
Développer sur IBM i (AS/400) en 2026 présente des défis uniques. Contrairement aux écosystèmes modernes dotés de gestionnaires de packages (npm pour Node.js, pip pour Python, composer pour PHP), l’écosystème IBM i manque d’outils standardisés pour gérer les dépendances externes. Lorsque vous souhaitez utiliser une bibliothèque RPGLE open-source comme logfori, vous devez :
- Cloner manuellement le dépôt Git
- Copier les fichiers dans votre projet
- Mettre à jour manuellement vos chemins d’inclusion (
includePath) - Gérer manuellement les mises à jour
- Gérer les dépendances transitives à la main
C’est exactement le problème que résolvaient npm, pip et autres avant leur création.
La solution : ibmi-dependencies
ibmi-dependencies est un gestionnaire de dépendances Git pour projets IBM i qui s’intègre parfaitement avec TOBI (The Open Build Interface).
Fonctionnalités clés
1. Fichier de configuration déclaratif (dependencies.json)
Inspiré de package.json et requirements.txt, le fichier dependencies.json permet de déclarer vos dépendances de manière standardisée :
{
"$schema": "./schema/dependencies.schema.json",
"name": "mon-projet-rpg",
"version": "1.0.0",
"dependencies": {
"logfori": {
"repository": "https://github.com/IBMiservices/logfori.git",
"version": "^1.0.0",
"ref": "main"
},
"autre-lib": {
"repository": "https://github.com/user/lib.git",
"version": "~2.1.0",
"exclude": ["tests", "docs"]
}
},
"config": {
"targetDir": "dep",
"cleanGit": true,
"recursiveDependencies": true
}
}
2. Support de versions sémantiques (semver)
Le système supporte les contraintes de versions familières aux développeurs modernes :
^1.0.0: compatible avec 1.x.x (mises à jour mineures)~2.1.0: compatible avec 2.1.x (patches uniquement)>=1.0.0: version minimalelatest: dernière version disponible
3. Fichier de verrouillage (lock file)
Un dependencies-lock.json est généré automatiquement, enregistrant les commits SHA exacts pour garantir la reproductibilité des builds :
{
"packages": {
"logfori": {
"repository": "https://github.com/IBMiservices/logfori.git",
"commit": "a3f5b2c1d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3",
"version": "1.2.5",
"installedAt": "2026-01-15T10:30:00Z"
}
}
}
À quoi sert le fichier de verrouillage ?
Le lockfile résout plusieurs problèmes critiques :
- Reproductibilité des builds : Même si
dependencies.jsonspécifie"version": "^1.0.0", le lockfile enregistre la version exacte installée (ex :1.2.5). Tous les développeurs et le serveur CI/CD obtiennent exactement les mêmes dépendances. - Protection contre les mises à jour non désirées : Sans lockfile,
^1.0.0pourrait installer1.3.0aujourd’hui et1.4.0demain. Le lockfile « gèle » la version jusqu’à ce que vous décidiez explicitement de mettre à jour. - Traçabilité : Vous savez exactement quel commit SHA a été utilisé pour chaque dépendance, facilitant le debugging et les audits de sécurité.
- Cohérence d’équipe : Évite le classique « ça marche sur ma machine » causé par des versions différentes entre développeurs.
Le lockfile doit être versionné dans Git avec dependencies.json pour garantir que toute l’équipe travaille avec les mêmes versions.
4. Détection de dépendances circulaires
Le système détecte automatiquement les dépendances circulaires avant l’installation, évitant les erreurs au moment du build :
❌ ERREUR: Dépendance circulaire détectée:
pkg-a → pkg-b → pkg-c → pkg-a
5. Gestion des dépendances transitives
Avec recursiveDependencies: true, le système installe automatiquement les dépendances de vos dépendances, comme npm le fait :
mon-projet
├── logfori (dépendance directe)
│ └── message-handler (dépendance transitive)
└── autre-lib (dépendance directe)
6. Validation par schéma JSON
Un schéma JSON complet (dependencies.schema.json) valide votre configuration et fournit l’autocomplétion dans VS Code :
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["name", "version"],
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9-_]+$",
"description": "Nom du projet"
}
}
}
7. Intégration automatique avec iproj.json
Lors de l’installation, le système met à jour automatiquement votre fichier iproj.json (compatible TOBI) pour inclure les chemins des dépendances :
{
"description": "Mon projet IBM i",
"version": "1.0.0",
"objlib": "&BUILDLIB",
"includePath": [
"ref",
"dep/logfori/ref",
"dep/autre-lib/ref"
],
"buildCommand": "gmake all"
}
Architecture technique
Le projet est entièrement écrit en Python 3 (3.6+) sans dépendances externes obligatoires :
.vscode-deps/
├── install_deps_v2.py # Script d'installation principal
├── lockfile.py # Gestion du fichier de verrouillage
└── tests.py # Suite de tests unitaires
Points techniques intéressants
1. Gestion des références Git multiples
Le système supporte plusieurs types de références Git :
- Branches (
"ref": "main") - Tags (
"ref": "v1.0.0") - Commits SHA (
"ref": "a3f5b2c")
2. Algorithme de détection de cycles
Utilise un parcours en profondeur (DFS) avec tracking des ancêtres pour détecter les cycles :
def check_circular_dependencies(pkg_name, dependencies, visited=None, ancestors=None):
if visited is None:
visited = set()
if ancestors is None:
ancestors = set()
if pkg_name in ancestors:
cycle = list(ancestors) + [pkg_name]
raise CircularDependencyError(f"Cycle: {' → '.join(cycle)}")
if pkg_name in visited:
return
visited.add(pkg_name)
ancestors.add(pkg_name)
# Parcours récursif des dépendances
for dep_name in pkg_dependencies.keys():
check_circular_dependencies(dep_name, dependencies, visited, ancestors)
ancestors.remove(pkg_name)
3. Matching de versions sémantiques
Implémentation d’un parser semver simple mais robuste supportant les contraintes complexes :
def matches_constraint(version, constraint):
if constraint == "latest" or constraint == "*":
return True
if constraint.startswith("^"):
# Compatible avec version majeure
return major_match and version >= base_version
if constraint.startswith("~"):
# Compatible avec version mineure
return major_match and minor_match and version >= base_version
4. Tests complets
Suite de tests unitaires couvrant :
- Validation du schéma JSON
- Création et mise à jour du lockfile
- Détection de dépendances circulaires
- Matching de contraintes de versions
python .vscode-deps/tests.py # Tous les tests python -m unittest .vscode-deps.tests.TestLockfile -v # Tests spécifiques pytest .vscode-deps/tests.py --cov=.vscode-deps # Avec couverture
Workflow complet
Voici un workflow typique d’utilisation :
# 1. Cloner les outils dans votre projet git clone https://github.com/IBMiservices/ibmi-dependencies.git .temp cp -r .temp/.vscode-deps . cp .temp/dependencies.json . cp -r .temp/schema . rm -rf .temp # 2. Installer jsonschema (optionnel mais recommandé) pip install jsonschema # 3. Configurer vos dépendances dans dependencies.json # (édition manuelle ou via CLI) # 4. Installer les dépendances python .vscode-deps/install_deps_v2.py # 5. Build avec TOBI (sur IBM i) # Le build est géré par TOBI via iproj.json et Rules.mk # 6. Versionner dependencies.json et dependencies-lock.json git add dependencies.json dependencies-lock.json git commit -m "Add dependencies"
Gestion des mises à jour
Mettre à jour une dépendance est simple :
# Modifier dependencies.json et réinstaller # Changer "version": "^1.0.0" → "version": "^2.0.0" python .vscode-deps/install_deps_v2.py
Le lockfile sera automatiquement mis à jour avec le nouveau commit SHA.
Cas d’usage réels
1. Partage de bibliothèques utilitaires
Votre équipe développe des utilitaires RPGLE communs (logging, gestion d’erreurs, helpers) :
{
"dependencies": {
"team-utils": {
"repository": "https://git.entreprise.com/rpg/utils.git",
"version": "^2.0.0"
}
}
}
Tous les projets peuvent maintenant utiliser ces utilitaires de manière standardisée.
2. Intégration continue (CI/CD)
Sur votre serveur CI/CD, le build est reproductible grâce au lockfile :
# Dans votre pipeline GitLab CI / Jenkins / GitHub Actions - pip install jsonschema - python .vscode-deps/install_deps_v2.py - makei build
3. Onboarding de nouveaux développeurs
Un nouveau développeur clone le projet et obtient immédiatement toutes les dépendances :
git clone https://github.com/entreprise/projet-rpg.git cd projet-rpg python .vscode-deps/install_deps_v2.py # Prêt à développer !
Comparaison avec d’autres écosystèmes
| Fonctionnalité | npm | pip | composer | ibmi-dependencies |
|---|---|---|---|---|
| Fichier de config déclaratif | ✅ package.json | ✅ requirements.txt | ✅ composer.json | ✅ dependencies.json |
| Lock file | ✅ package-lock.json | ✅ Pipfile.lock | ✅ composer.lock | ✅ dependencies-lock.json |
| Contraintes de versions | ✅ Semver | ✅ Semver | ✅ Semver | ✅ Semver |
| Dépendances transitives | ✅ | ✅ | ✅ | ✅ |
| Registry central | ✅ npmjs.com | ✅ PyPI | ✅ Packagist | ⚠️ Git uniquement |
| Validation par schéma | ✅ | ❌ | ❌ | ✅ |
Limitations et évolutions futures
Limitations actuelles
- Pas de registry central : Nécessite des URLs Git complètes
- Performance : Le clonage Git peut être lent pour de gros dépôts
- Résolution de conflits : Les conflits de versions entre dépendances transitives ne sont pas gérés automatiquement
Roadmap
- Support d’une registry centralisée pour IBM i
Installation et utilisation
Le projet est open-source sous licence Apache 2.0 :
🔗 GitHub : https://github.com/IBMiservices/ibmi-dependencies
Quick start
# Dans votre projet IBM i git clone https://github.com/IBMiservices/ibmi-dependencies.git .temp cp -r .temp/.vscode-deps . cp .temp/dependencies.json . cp -r .temp/schema . rm -rf .temp pip install jsonschema # Configurer dependencies.json puis : python .vscode-deps/install_deps_v2.py
Documentation complète
Conclusion
ibmi-dependencies apporte à l’écosystème IBM i les pratiques modernes de gestion de dépendances dont bénéficient déjà les développeurs JavaScript, Python, PHP et autres. En combinant :
- ✅ Déclaration standardisée des dépendances
- ✅ Versioning sémantique
- ✅ Fichier de verrouillage pour la reproductibilité
- ✅ Intégration avec TOBI (The Open Build Interface)
- ✅ Tests complets et validation par schéma
… il facilite considérablement le développement collaboratif et la réutilisation de code sur IBM i.
Le projet est en développement actif et les contributions sont les bienvenues. Si vous développez sur IBM i et que vous cherchez à moderniser votre workflow, n’hésitez pas à l’essayer et à partager vos retours !
