Automatiser les publications npm avec np : une alternative moderne à prepublish

La publication de paquets npm peut rapidement devenir un processus fragile et sujet aux erreurs lorsqu’elle repose sur des scripts manuels comme prepublish. L’outil np propose une approche robuste, sécurisée et entièrement automatisée — conçue pour remplacer les pratiques obsolètes tout en intégrant les bonnes pratiques du développement moderne.

Pourquoi np remplace avantageusement prepublish

Le script prepublish (déprécié depuis npm v4) exigeait une orchestration manuelle des étapes critiques : vérification des tests, mise à jour de la version, compilation, poussée Git, et publication. Cette chaîne était souvent incomplète ou inconsistante. np, quant à lui, impose un flux strict et vérifiable :

  • Gestion sémantique interactive : sélection guidée (patch/minor/major) via interafce en ligne de commande
  • Vérification préalable : détection des fichiers non commités, vérification de la branche main, contrôle de la présence de package-lock.json
  • Exécution séquentielle fiable : installation des dépendances → lancement des tests (npm test) → build éventuel → incrémentation de version → commit Git → tag → push → npm publish
  • Sécurité renforcée : interdiction de publier sur une branche non protégée ou depuis un environnement sale

Installation et intégration

Pour l’utiliser globalement (recommandé pour les développeurs multi-projets) :

npm install -g np

Ou localement dans un projet (utile pour verrouiller la version d’np) :

npm install --save-dev np

Ajoutez ensuite un script personnalisé dans package.json :

{
  "scripts": {
    "ship": "np --no-yarn"
  }
}

L’option --no-yarn désactive la détection automatique de Yarn, utile si votre projet utilise uniquement npm.

Workflow interactif en action

Lorsque vous lancez np, l’interface CLI guide l’utilisateur étape par étape :

  1. Validation de l’état Git (aucune modification non commitée)
  2. Choix de la prochaine version (via menu interactif ou argument direct)
  3. Exécution de npm test — échec = arrêt immédiat
  4. Mise à jour de package.json et package-lock.json
  5. Création d’un commit avec message standardisé (release: v2.1.0)
  6. Génération d’un tag Git (v2.1.0) et poussée vers le dépôt distant
  7. Publication sur le registre npm avec gestion des tokens et scopes

Commandes courantes

Objectif Commande
Publier une version stable spécifique np 3.4.5
Lancer une version alpha/beta np prerelease --tag next
Ignorer les tests (uniquement en local) np --no-tests
Forcer la publication même si Git est sale np --no-cleanup

Architecture clé

Le code source de np suit une séparation nette des responsabilités :

  • src/cli.ts : point d’entrée CLI avec gestion des arguments et validation initiale
  • src/publish.ts : orchestrateur principal du workflow (appel séquentiel des étapes)
  • src/git.ts : abstraction des opérations Git (status, commit, tag, push)
  • src/npm.ts : encapsulation de npm publish avec gestion des erreurs réseau et d’authantification
  • src/version.ts : logique d’incrémentation sémantique basée sur les commits récents (convention Conventional Commits)

Comparaison fonctionnelle

Contrairement à prepublish, qui ne faisait qu’exécuter un script avant publication sans contrôle ni feedback, np agit comme un superviseur intelligent :

  • Il n’exécute pas de scripts arbitraires — il applique un protocole prédéfini et auditable
  • Chaque étape peut être annulée ou reprise grâce à un système de checkpoints internes
  • Il génère des logs structurés compatibles avec les pipleines CI/CD (ex. GitHub Actions)
  • Il intègre nativement la gestion des scopes, des tokens temporaires et des registres privés

Intégration CI/CD recommandée

Dans un environnement automatisé, utilisez np en mode non interactif :

np patch --no-verify --no-publish --no-git-tag-version

Cette commande met à jour la version et génère le commit/tag localement, sans publier — idéal pour préparer une livraison contrôlée via un workflow GitHub Actions.

Étiquettes: np npm semantic-versioning cli-tool package-publishing

Publié le 14 août à 17h47