Skip to content

Le drapeau --filter (ou -F) est utilisé pour sélectionner des packages par motif dans un monorepo. Les motifs peuvent être utilisés pour faire correspondre les noms de packages ou les chemins de packages, avec une prise en charge complète de la syntaxe glob.

Actuellement, --filter est pris en charge par bun install et bun outdated, et peut également être utilisé pour exécuter des scripts pour plusieurs packages à la fois.


Correspondance

Nom de package --filter <motif>

Les motifs de nom sélectionnent les packages en fonction du nom du package, tel que spécifié dans package.json. Par exemple, si vous avez des packages pkg-a, pkg-b et other, vous pouvez faire correspondre tous les packages avec *, uniquement pkg-a et pkg-b avec pkg*, et un package spécifique en fournissant le nom complet du package.

Chemin de package --filter ./<glob>

Les motifs de chemin sont spécifiés en commençant le motif par ./, et sélectionneront tous les packages dans les répertoires qui correspondent au motif. Par exemple, pour faire correspondre tous les packages dans les sous-répertoires de packages, vous pouvez utiliser --filter './packages/**'. Pour faire correspondre un package situé dans packages/foo, utilisez --filter ./packages/foo.


bun install et bun outdated

bun install et bun outdated prennent tous deux en charge le drapeau --filter.

bun install par défaut installera les dépendances pour tous les packages du monorepo. Pour installer des dépendances pour des packages spécifiques, utilisez --filter.

Étant donné un monorepo avec des espaces de travail pkg-a, pkg-b et pkg-c sous ./packages :

bash
# Installer les dépendances pour tous les espaces de travail sauf `pkg-c`
bun install --filter '!pkg-c'

# Installer les dépendances pour les packages dans `./packages` (`pkg-a`, `pkg-b`, `pkg-c`)
bun install --filter './packages/*'

# Identique à ci-dessus, mais exclure le package.json racine
bun install --filter '!./' --filter './packages/*'

De même, bun outdated affichera les dépendances obsolètes pour tous les packages du monorepo, et --filter peut être utilisé pour restreindre la commande à un sous-ensemble de packages :

bash
# Afficher les dépendances obsolètes pour les espaces de travail commençant par `pkg-`
bun outdated --filter 'pkg-*'

# Afficher les dépendances obsolètes uniquement pour le package.json racine
bun outdated --filter './'

Pour plus d'informations sur ces deux commandes, consultez bun install et bun outdated.


Exécution de scripts avec --filter

Utilisez le drapeau --filter pour exécuter des scripts dans plusieurs packages à la fois :

bash
bun --filter <motif> <script>

Disons que vous avez un monorepo avec deux packages : packages/api et packages/frontend, tous deux avec un script dev qui démarrera un serveur de développement local. Normalement, vous devriez ouvrir deux onglets de terminal séparés, cd dans chaque répertoire de package, et exécuter bun dev :

bash
cd packages/api
bun dev

# dans un autre terminal
cd packages/frontend
bun dev

En utilisant --filter, vous pouvez exécuter le script dev dans les deux packages à la fois :

bash
bun --filter '*' dev

Les deux commandes seront exécutées en parallèle, et vous verrez une belle interface de terminal affichant leurs sorties respectives :

Exécution de scripts dans les espaces de travail

Les filtres respectent votre configuration d'espace de travail : Si vous avez un fichier package.json qui spécifie quels packages font partie de l'espace de travail, --filter sera limité à ces packages uniquement. De plus, dans un espace de travail, vous pouvez utiliser --filter pour exécuter des scripts dans des packages situés n'importe où dans l'espace de travail :

bash
# Packages
# src/foo
# src/bar

# dans src/bar : exécute myscript dans src/foo, pas besoin de cd !
bun run --filter foo myscript

Ordre des dépendances

Bun respectera l'ordre des dépendances lors de l'exécution des scripts. Disons que vous avez un package foo qui dépend d'un autre package bar dans votre espace de travail, et que les deux packages ont un script build. Lorsque vous exécutez bun --filter '*' build, vous remarquerez que foo ne commencera à s'exécuter qu'une fois que bar aura terminé.

Bun édité par www.bunjs.com.cn