Composer : la commande `create-project`

Composer : La commande create-project

Depuis la sortie de ecrire/ du dépot SPIP, SPIP est un projet composer. Ce document explique un peu comment utiliser composer pour des installations SPIP. Elle ne s’adresse donc qu’aux gens qui

  • dev SPIP (core et plugins-dist)
  • gens qui dev AVEC SPIP et veulent utiliser la puissance de composer et la ligne de commande

Avant propos : l’aide de composer

Dans tous les cas, en cas de doute, se référer à l’aide de composer

En ligne

Dans un terminal

composer help create-project

Usage:
  create-project [options] [--] [<package> [<directory> [<version>]]]

Les « [options] » seront détaillées plus bas ou ultérieurement.

Les 3 options suivantes s’expliquent ainsi :

  • package = un vendor/name valide et connu sur les dépôts composer connus (par défaut, un seul = packagist.org)
  • directory = le dossier où installer l’application sinon « name ». Ne doit pas exister si mentionné
  • version = la contrainte de version (4.2.16, ^4.1, ~4.4.0, 5.0.*, …) voir Versions and constraints - Composer

Principe de base d’un projet composer

La commande « composer create-project » cherche un fichier composer.json dans le dossier courant (une erreur se produit si le dossier est vide), exactement comme les autres commandes composer (install, update, require, …).

Exemple : Situation où on a le dernier commit de la branche par défaut

  • en ssh et étant authentifié·e git@git.spip.net:spip/spip.git
  • ou bien en https (anonymement ou pas) https://git.spip.net/spip/spip.git
git clone -b master --no-tags --depth 1 git@git.spip.net:spip/spip.git /my/path/to/spip
cd /my/path/to/spip

composer create-project => installe le « project » spip/spip à l’aide des directives du fichier composer.json téléchargé dans le dossier /my/path/to/spip

Seul le fichier composer.json est nécessaire pour cette commande. Et aucun autre fichier ne lui est utile

Récupérer une copie du fichier composer.json · master · spip / spip · GitLab suffirait aussi, s’il n’y avait pas d’autres fichiers versionnés dans ce dépôt et nécessaires au fonctionnement de l’application SPIP.

Dans le monde de SPIP

Le plus utile est d’installer SPIP sans passer directement par la commande git et sans fichier présent sur la machine.

Le dépôt composer

Les packages spip sont référencés sur un dépôt composer propre à SPIP, il faut donc qu’il soit connu de l’outil composer:

En ligne de commande, à la volée, l’option --repository=https://get.spip.net/composer est suffisante

Alternative : paramétrer ce dépôt au niveau global du compte utilisateur avec la commande

composer global config repositories.spip composer https://get.spip.net/composer

Le paramètre « package » à installer en tant que project devient nécessaire (puisqu’il n’y a pas de fichier composer.json sur le disque)

Le projet

Contrairement à une bibilothèque de code (library), qui s’installe usuellement dans un sous-dossier vendor/, en tant que dépendance, un project est installé à la racine du dossier qui contiendra toute l’application (vendor/ y compris), à savoir, le code, les fichiers de configuration, les assets web ou tout autre fichier.

Malgré cette distinction, c’est un package composer ordinaire, si ce n’est qu’on préférera, par convention, lui associer le type « project » et un « vendor/name » distinct signifiant dans son propre fichier composer.json comme ci-dessous :

{
    "name": "spip/spip",
    "type": "project",
    ...
}

d’où, la commande de base désormais

composer create-project --repository=https://get.spip.net/composer spip/spip

Sans plus d’information, composer ira chercher, en s’appuyant sur les références connues du dépôt dédié à SPIP :

  • la dernière version stable (tagguée au sens git du terme)
  • sémantiquement correcte (ex: 4.3.5)
  • et compatible avec les contraintes de la « plate-forme » où la commande est lancée, c’est-à-dire la version de PHP et ses extensions.

Dans la configuration actuelle, cette dernière version est téléchargée sous la forme du zip généré par le serveur gitlab du dépôt git associé au package spip/spip à savoir « spip / spip · GitLab ». Ce zip est décompressé dans le dossier indiqué explicitement par la commande (ou dans un sous-dossier « spip » créé à l’occasion (voir explications plus haut).

La version

On peut choisir une version du projet et l’installer sur une machine en utilisant les contraintes de versions gérées par composer. Encore une fois, voir Versions and constraints - Composer

Par défaut, composer choisira parmi les versions sémantiquement « stables » (créées via un tag git).

Situation au 2 janvier 2025

Sans précision, ce sera la dernière version stable. La dernière version stable de spip est la 4.3.5 du 3 décembre 2024.

Il y a les dossiers ecrire/ et prive/ dedans, mais pas les dossiers plugins-dist/ et squelettes-dist/, gérés via d’autres outils.

on peut aussi récupérer le code d’une version plus ancienne, exemple la 4.2.16 ou la 4.1.18

  • composer create-project --repository=https://get.spip.net/composer spip/spip spip-4.2 ~4.2
  • composer create-project --repository=https://get.spip.net/composer spip/spip spip-4.1.18 4.1.18

De même, il y a les dossiers ecrire/ et prive/ dedans, mais pas plugins-dist/ et squelettes-dist/, gérés via d’autres outils

composer create-project --repository=https://get.spip.net/composer spip/spip spip-4.4 ^4.4 provoquera une erreur, car il n’y pas de tag stable pour l’instant pour cette branche.

Versions beta (ou alpha ou RC)

Ajouter l’option « –stability=beta » aux autres options.

composer create-project --repository=https://get.spip.net/composer --stability=beta spip/spip

Installe la version 5.0.0-beta du 3 décembre 2024 dans le dossier « spip »

Les dossiers ecrire/, prive/, plugins-dist/, squelettes-dist/ sont présents. Les dossier IMG/, local/ et tmp/ sont créés. Le dossier config/ contient ce qui a été versionné au moment du tag. Évidement, les dépendances « externes » sont installées dans le dossier vendor/

composer create-project --repository=https://get.spip.net/composer --stability=beta spip/spip spip-4.4.0-beta ^4.4

Installe la version 4.4.0-beta du 3 décembre 2024 dans le dossier spip-4.4.0-beta sans le dossier plugins-dist/ toujours traité avec d’autres outils.

Une commande spécifique à SPIP est disponible : « composer switch:forward » donne à composer le contrôle de l’installation et des mises à jour des plugins-dist. Voir docs/plugins-dist.md · main · spip-league / composer-installer · GitLab pour les effets et les conséquences.

Versions de développement

Ajouter l’option --stability=dev aux options.

composer create-project --repository=https://get.spip.net/composer --stability=dev spip/spip spip-dev

Installe, dans le dossier spip-dev, la branche de développement la plus « haute » possible en version en s’appuyant sur le nom des branches et la compatibilité de PHP et de ses extensions.

mode détaché versus synchronisé

Ce qu’il y a retenir principalement

Par défaut, create-project installe SPIP en mode détaché, c’est-à-dire, sans référence git, qui est le mode qui correspond au besoin de base : avoir un SPIP opérationnel, prêt à recevoir la touche finale de sa configuration.

C’est suffisant pour développer/personnaliser « son » SPIP, un plugin/squelette personnel ou communautaire, et désormais, intégrer d’autres packages composer, d’où qu’ils viennent. Cela permet aussi de versionner « son » SPIP dans un dépôt git indépendant, sans être pollué par les liens aux dépôts des composants « spip/* »

Les personnes qui développent, testent ou maintiennent SPIP lui-même peuvent avoir besoin d’une installation qui reste liée aux dépôts git de tous ses composants. Ci-dessous, quelques options pour parvenir aux besoins spécifiques de chaque personne, en fonction de ce qu’elle souhaite développer, tester ou maintenir dans la distribution classique de SPIP elle-même.

Au lieu de manipuler des commandes git ou s’en remettre à un outil qui cadre les modes d’installation et contraignent les développements et la capacités de tester des branches spécifiques, il devient possible de n’utiliser que composer, à travers ses commandes les plus usuelles, à savoir install, update, require*.*

Par la suite, seules les dépendances du project, pourront être changées ou mises à jour avec composer, qui s’appuiera alors sur le fichier composer.lock du dossier d’installation. Tout ce que contient le project sera figé mais modifiable à la discrétion de la personne qui a fait l’installation et non versionné sur le dépôt d’origine.

Option pour le développement : sans synchro GIT

composer create-project --repository=https://get.spip.net/composer --stability=dev spip/spip spip-dev

Installe donc une version de développement de la branche la plus haute (à savoir le dernier commit de la branche « master »)

Les branches de développement du project sont installable aussi. Exemple : composer create-project --repository=https://get.spip.net/composer --stability=dev spip/spip spip-dev dev-issue_5892

Options pour le développement : avec synchro GIT

Pour que le dossier de travail reste synchronisé avec le dépôt git du projet, ajouter l’option --keep-vcs, composer utilise git de manière masquée pour faire toutes les opérations.

composer create-project --repository=https://get.spip.net/composer --stability=dev --keep-vcs spip/spip spip-dev

installe donc une version de développement de la branche la plus haute et conserve le lien avec le dépôt git « spip / spip · GitLab »

À partir de ce type d’installation, il faudra utiliser git pour basculer le code du projet d’une branche à l’autre et composer update ou composer require pour basculer le code des dépendances.

Options pour le développement : avec synchro GIT aussi pour les composants (spip-league, plugins-dist, commu PHP)

Pour que les dépendances (plugins-dist/, squelettes-dist/, ecrire/, prive/ et vendor/, selon les branches de développement) restent elles aussi synchronisées à leurs dépôts git respectifs, ajouter l’option --prefer-source

composer create-project --repository=https://get.spip.net/composer --stability=dev --keep-vcs --prefer-source spip/spip spip-dev

donne un dossier de travail où le code du projet spip/spip ainsi que toutes les dépendances sans exception, restent synchronisées via git, dépendances de dev du projet y compris.

Pour enlever les dépendances de dev de cette installation, ajouter l’option « –no-dev »

composer create-project --repository=https://get.spip.net/composer --stability=dev --keep-vcs --prefer-source --no-dev spip/spip spip-dev

La commande spécifique à SPIP pour passer les urls git en mode ssh reste valable à partir de ce moment:

composer local mode-dev --no-interaction

Options pour le développement : avec synchro GIT aussi pour les composants mais uniquement ceux de SPIP (spip-league, plugins-dist)

composer config "preferred-install.spip/*" source
composer config "preferred-install.spip-league/*" source
composer create-project

La commande archive

Aide

En ligne : Command-line interface / Commands - Composer

Dans le terminal : composer help archive

Pour SPIP

Pour faire un zip de release, il est possible, de combiner create-project et archive de la manière suivante.

# Build
rm -Rf spip
COMPOSER_ROOT_VERSION=5.0.0-beta
composer create-project --repository=https://get.spip.net/composer --no-dev "spip/spip:${COMPOSER_ROOT_VERSION}"
composer --working-dir=spip archive --format=zip --dir=..
# Verif
ls -lh ./spip-5.0.0-beta.zip
unzip -l ./spip-5.0.0-beta.zip | more

il n’y a qu’un seul paramètre à changer pour générer le zip d’une autre version, la variable d’environnement COMPOSER_ROOT_VERSION

Pour les versions de la branche 4.4, l’étape d’installation des plugins-dist est à traiter entre create-project et archive

Pour les versions antérieures à 4.4 (à savoir, la 4.3 qui sera en security-fix dès la fin janvier, et pour 6 mois) l’ancien mode de release sera toujours à utiliser.

Les opérations de vérification de versions des dépendances, de changelog etc. sont a effectuer avant de créer un tag et ne concernent donc pas composer.

De même pour l’opération pour pousser les artefacts dans une release gitlab à effectuer après et sans composer.

Le changelog est

  • soit mis à jour manuellement par l’équipe maintenance au file de l’eau (après merge de PR)
  • soit sa génération est automatisée après la création du tag.

Les vérifications de dépendances pour SPIP4.4 dépendent encore du fichier plugins-dist.json sur lequel composer n’a ni impact, ni influence.

2 « J'aime »

#documentation_ici
et #au_fil_de_leau

Merci pour ces explications.
J’avais lu le pad initial de @JamesRezo, il y avait plus de contenu dedans il me semble, vous le gardez sous le coude pour une autre doc ?

Pour que je comprenne bien, un exemple de ces outils dont vous (team maintenance) parlez ? et en quoi ils cadrent et contraignent ?

Non je ne crois pas qu’il y avait plus de contenu. Par contre le plan était peut être différent, c’est peut être ca qui te donne ce sentiment. La seule chose que je n’ai pas reprise c’est la dernière section « a faire ».

Pour que je comprenne bien, un exemple de ces outils dont vous (team maintenance) parlez ? et en quoi ils cadrent et contraignent ?

Je ne sais pas si ces outils qui cadrent existent actuellement dans la commu SPIP. Mais l’idée est surtout de dire que dans composer il y a priori tous les outils pour bosser en mode dev.

On me murmure que le pad a été scindé en 2 à un moment, la seconde partie étant devenue Flex : son role et sa fonction dans SPIP - #3 par nicod

On crée une/des étiquettes ? doc_au_fil_de_leau pour pouvoir les retrouver au moment de les intégrer dans la doc définitives ?

Est-ce qu’une étiquette documentation serait pertinente si les docs n’ont pas vocation, à terme, à être accessible sur discuter ?