Aller au contenu
FerrFlow

Configuration / Monorepo

Monorepo

FerrFlow considère un repository comme un monorepo lorsque la configuration définit plus d’un package. Chaque package est versionné indépendamment en fonction de son propre historique git.

FerrFlow utilise les préfixes de chemin pour déterminer quels commits appartiennent à quel package. Seuls les commits qui touchent des fichiers sous path (ou sharedPaths) déclenchent une release pour ce package.

ferrflow.json
{
"package": [
{
"name": "api",
"path": "packages/api"
},
{
"name": "site",
"path": "packages/site"
}
]
}

Si vous avez du code partagé entre packages (ex. une bibliothèque packages/shared/), déclarez-le comme entrée sharedPaths. Un changement dans un chemin partagé déclenche une release pour chaque package qui le référence :

ferrflow.json
{
"package": [
{
"name": "api",
"path": "packages/api",
"sharedPaths": ["packages/shared/"]
},
{
"name": "site",
"path": "packages/site",
"sharedPaths": ["packages/shared/"]
}
]
}

Utilisez dependsOn pour declarer qu’un package depend d’un autre. Quand une dependance est publiee, le package dependant recoit automatiquement un bump patch — meme si aucun de ses propres fichiers n’a change. La cascade est transitive : si app depend de cli et cli depend de core, publier core bumpe aussi cli et app.

ferrflow.json
{
"package": [
{
"name": "core",
"path": "packages/core"
},
{
"name": "cli",
"path": "packages/cli",
"dependsOn": ["core"]
},
{
"name": "app",
"path": "packages/app",
"dependsOn": ["cli"]
}
]
}

Par défaut, les tags en monorepo utilisent le format {name}@v{version} :

api@v1.2.0
site@v0.4.1

Configurez cela avec le champ tagTemplate :

ferrflow.json
{
"workspace": {
"tagTemplate": "{name}@v{version}"
}
}

Pour un repo mono-package, le défaut est v{version} (sans préfixe de nom).

FerrFlow recherche le tag le plus récent correspondant au modèle pour déterminer quels commits sont nouveaux.

Les packages sont publiés indépendamment. Dans une seule exécution de ferrflow release :

  • api peut passer de 1.2.01.3.0 (nouveau commit feat:)
  • site peut passer de 0.4.00.4.1 (uniquement des commits fix:)
  • shared peut ne pas être publié (uniquement des commits chore:)

Chaque package peut surcharger la stratégie de versioning et le tagTemplate du workspace :

ferrflow.json
{
"workspace": {
"versioning": "semver",
"tagTemplate": "{name}@v{version}"
},
"package": [
{
"name": "api",
"path": "packages/api",
"versioning": "calver"
},
{
"name": "site",
"path": "packages/site",
"tagTemplate": "site-v{version}"
}
]
}