Manual:Writing maintenance scripts/fr

From Linux Web Expert

Ceci est un tutoriel pas à pas sur la manière d'écrire un script de maintenance basé sur la classe Maintenance (voir Maintenance.php ) introduite dans la version 1.16 de MediaWiki pour rendre plus simple l'écriture des lignes de commande des scripts de maintenance MediaWiki.

Squelette de code

Nous suivrons l'exemple d'un script de maintenance helloWorld.php qui ne fait qu'afficher « Hello, World ». Ce programme contient le code minimal nécessaire (voir aussi En-têtes des droits d'auteur):

Le programme ci-dessous imprime « Hello, World! ».

The way to invoke maintenance scripts changed in 2023 with MediaWiki 1.40, with the new run.php being used to launch all maintenance scripts, rather than directly calling them by filename (although the latter remains supported for now). This tutorial covers both methods, and notes where there are differences between the systems.

Noyau MediaWiki

Command
$ ./maintenance/run HelloWorld
Hello, World!
Filename
maintenance/HelloWorld.php
Code
<?php

require_once __DIR__ . '/Maintenance.php';

/**
 * Brief oneline description of Hello world.
 *
 * @since 1.17
 * @ingroup Maintenance
 */
class HelloWorld extends Maintenance {
	public function execute() {
		$this->output( "Hello, World!\n" );
	}
}

$maintClass = HelloWorld::class;
require_once RUN_MAINTENANCE_IF_MAIN;

Extension MediaWiki

Command
$ ./maintenance/run MyExtension:HelloWorld
Hello, World!
Filename
extensions/MyExtension/maintenance/HelloWorld.php
Code
<?php

namespace MediaWiki\Extension\MyExtension\Maintenance;

use Maintenance;

$IP = getenv( 'MW_INSTALL_PATH' );
if ( $IP === false ) {
	$IP = __DIR__ . '/../../..';
}
require_once "$IP/maintenance/Maintenance.php";

/**
 * Brief oneline description of Hello world.
 */
class HelloWorld extends Maintenance {
	public function __construct() {
		parent::__construct();
		$this->requireExtension( 'Extension' );
	}

	public function execute() {
		$this->output( "Hello, World!\n" );
	}
}

$maintClass = HelloWorld::class;
require_once RUN_MAINTENANCE_IF_MAIN;

Explication du squelette de code

require_once __DIR__ . "/Maintenance.php";

Nous incluons Maintenance.php. Cela définit class Maintenance qui contient les bases de tous les scripts de maintenance, y compris les facilités pour analyser syntaxiquement les arguments de la ligne de commande, la lecture des valeurs d'entrée sur la console, la connexion à une base de données, etc.

class HelloWorld extends Maintenance {
}

Nous déclarons notre sous-classe Maintenance.

$maintClass = HelloWorld::class;
require_once RUN_MAINTENANCE_IF_MAIN;

Nous demandons à la classe Maintenance d'exécuter le script en utilisant notre classe HelloWorld, seulement si l'exécution a lieu à partir de la ligne de commande.

En interne, RUN_MAINTENANCE_IF_MAIN charge un autre fichier doMaintenance.php qui charge automatiquement les classes et les paramètres MediaWiki, puis exécute notre méthode execute()

	public function execute() {
	}

La méthode execute() est le point d'entrée des scripts de maintenance et c'est là que sera codée la logique principale de votre script. Evitez d'exécuter du code à partir du constructeur.

Lorsque notre programme sera lancé depuis la ligne de commande, l'environnement de maintenance du noyau prendra en charge l'initialisation du noyau MediaWiki, celui de la configuration, etc, puis il invoquera cette méthode.

Commande Help

Une des fonctionnalités incluses dont bénéficient tous les scripts de maintenance est l'option --help. Le code d'exemple ci-dessus produira la page d'aide suivante :

$ php helloWorld.php --help

Usage: php helloWorld.php […]

Generic maintenance parameters:
    --help (-h): Display this help message
    --quiet (-q): Whether to suppress non-error output
    --conf: Location of LocalSettings.php, if not default
    --wiki: For specifying the wiki ID
    --server: The protocol and server name to use in URL
    --profiler: Profiler output format (usually "text")
…

Ajouter une description

« Mais quel est le but de ce script de maintenance ? » Je vous entends déjà le demander.

Il est possible de mettre une description au début de la sortie du « --help » en utilisant la méthode addDescription dans notre constructeur :

	public function __construct() {
		parent::__construct();

		$this->addDescription( 'Say hello.' );
	}

Maintenant la sortie nous donne la description :

$ php helloWorld.php --help

Say hello.

Usage: php helloWorld.php [--help]
…

Analyse des options et des arguments

Saluer le monde est très sympathique et très bien, mais nous voulons être capable de saluer également des individus.

Pour ajouter une option de commande en ligne, ajoutez un constructeur à la class HelloWorld qui appelle addOption() de Maintenance et qui met à jour la méthode execute() pour utiliser la nouvelle option. Les paramètres de addOption() sont $name, $description, $required = false, $withArg = false, $shortName = false, donc :

	public function __construct() {
		parent::__construct();

		$this->addDescription( 'Say hello.' );
		$this->addOption( 'name', 'Who to say Hello to', false, true );
	}

	public function execute() {
		$name = $this->getOption( 'name', 'World' );
		$this->output( "Hello, $name!" );
	}

Cette fois, à l'exécution, la sortie du script helloWorld.php change en fonction des arguments fournis :

$ php helloWorld.php
Hello, World!
$ php helloWorld.php --name=Mark
Hello, Mark!
$ php helloWorld.php --help

Say hello.

Usage: php helloWorld.php […]
…
Script specific parameters:
    --name: Who to say Hello to

Extensions

<td class="mw-version-versionbox" title="<translate nowrap> The latest stable version is <tvar name=1>1.41</tvar></translate>">
<translate> ≥</translate> 1.28
Gerrit change 301709
<translate> MediaWiki version:</translate>

Si votre script de maintenance concerne une extension, alors vous devez ajouter la condition, que celle-ci soit installée :

	public function __construct() {
		parent::__construct();
		$this->addOption( 'name', 'Who to say Hello to' );

		$this->requireExtension( 'FooBar' );
	}

Cela fournit un message d'erreur utile quand l'extension n'est pas activée. Par exemple pendant le développement local, une extension particulière peut ne pas avoir encore été activée dans le fichier LocalSettings.php, ou si vous avez une ferme de wikis, l'extension peut n'être active que sur un sous-ensemble de wikis.

Notez-bien qu'aucun code ne peut être exécuté ailleurs que via la méthode execute(). Toute tentative pour accéder aux services du noyau MediaWiki, aux classes, aux fonctions, ou encore pour appeler le code de votre propre extension avant ceci, sortira en erreur ou sera non fiable et non pris en charge (comme étant hors de la déclaration de la classe, ou dans le constructeur).

Profiling

Maintenance scripts support a --profiler option, which can be used to track code execution during a page action and report back the percentage of total code execution that was spent in any specific function. See Manuel:Profilage .

Ecrire des tests

Il est recommandé d'écrire des tests pour vos scripts de maintenance, comme pour toute autre classe. Voir le guide des scripts de maintenance pour l'aide et les exemples.