Manual:Bakım betiklerini yazma

From mediawiki.org
This page is a translated version of the page Manual:Writing maintenance scripts and the translation is 46% complete.
Outdated translations are marked like this.

Bu, komut satırı MediaWiki bakım betikleri yazmayı kolaylaştırmak için MediaWiki 1.16'da sunulan Maintenance sınıfına (Maintenance.php sayfasına bakın) dayalı bir bakım betik yazma konusunda adım adım açıklamalı bir öğreticidir.

Örnek betik

helloWorld.php yazdıran bir "Hello, World" bakım betiği üzerinden geçeceğiz. Bu program, çalışması için gereken minimum kod miktarını ve beklenen telif hakkı başlığını içerir (alternatif başlıklar için telif hakkı başlıkları sayfasına bakın):

The below example program will print "Hello, World!".

Note that 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.

MediaWiki core

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;

MediaWiki extension

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;

Boilerplate explained

require_once __DIR__ . "/Maintenance.php";
Maintenance.php dosyasını dahil ediyoruz. Bu, bağımsız değişkenleri ayrıştırmak, konsolu okumak, veritabanını almak vb. için yöntemi olan class Maintenance ile tanımlar. $3 için tam yolu kullanmak en iyisidir.
class HelloWorld extends Maintenance {
}
Maintenance sınıfını genişlettikten sonra,
$maintClass = HelloWorld::class;
require_once RUN_MAINTENANCE_IF_MAIN;
HelloWorld sınıfına, betiğini yalnızca komut satırından yürütüldüğünde Maintenance sınıfımızı kullanarak çalıştırmasını söyleyin.

Dahili olarak, RUN_MAINTENANCE_IF_MAIN, MediaWiki sınıflarını ve yapılandırmasını otomatik olarak yükleyen başka bir dosya doMaintenance.php yükler ve ardından

	public function execute() {
	}
Tanımladığımız execute() işlevi yürütülür ve betiğimiz çalışmasını yapar.

When our program is run from the command-line, the core maintenance framework will take care of initialising MediaWiki core and configuration etc, and then it will invoke this method.

Help command

One of the built-in features that all maintenance scripts enjoy is a --help option. The above example boilerplate would produce the following help page:

$ 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")
…

Bir açıklama ekleme

"Peki bu bakım betiği ne için?" Sorduğunu duyabiliyorum.

Yapımcımızdaki addDescription yöntemini kullanarak "--help" çıkışının üstüne bir açıklama koyabiliriz:

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

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

Çıkış şimdi bize açıklama veriyor:

$ php helloWorld.php --help

Say hello.

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

Seçenek ve bağımsız değişken ayrıştırma

Dünyayı selamlamak iyi ve güzeldir, ancak biz de bireyleri selamlamak istiyoruz.

Bir komut satırı seçeneği eklemek için class HelloWorld ile Maintenance komutun addOption() ile çağıran bir yapıcı ekleyin ve execute() yöntemini kullanarak yeni seçeneği kullanın. addOption() ile parametreleri $name, $description, $required = false, $withArg = false, $shortName = false, yani:

	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!" );
	}

Bu kez, yürütüldüğünde, helloWorld.php betiğinin çıkışı sağlanan bağımsız değişkene bağlı olarak değişir:

$ 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

Uzantılar

MediaWiki sürümü:
1.28
Gerrit change 301709

Bakım betiğiniz bir uzantı içinse, uzantının yüklü olması için bir gereksinim eklemeniz gerekir:

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

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

Çoğunlukla bu, vikide (muhtemelen viki çiftliklerinde) uzantı etkinleştirilmediğinde hoş bir hata mesajı sağlar. For example, during local development a particular extension might not yet be enabled in LocalSettings.php, or when operating a wiki farm an extension might be enabled on a subset of wikis.

Uzantınız tarafından tanımlanan sınıfların, execute() işlevine ulaşana kadar kullanılamayacağını unutmayın. Bundan önce örnekler oluşturma girişimleri, ör. yapıcıda, sınıfın bulunmayan istisnalara neden olur.

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 Manual:Profiling .

Yazma testleri

Diğer sınıflarda olduğu gibi bakım betiğiniz için testler yazmanız önerilir. Yardım ve örnekler için Bakım betikleri kılavuzuna bakın.