Publikace na Packagist

PHP, Tipy & triky

Jaké všechny kroky jsou potřebné a jaké soubory přidat do repozitáře, aby bylo možné vlastní knihovnu publikovat na Packagist. A tím také instalovat pomocí Composeru.

Publikace na Packagist

Co je Composer, k čemu slouží a jak jej používat jsem již psal v dřívějším článku a tento na něj nepřímo navazuje. Protože jsem chtěl použít svou knihovnu Resampler.php na jednom projektu, rozhodl jsem se ji publikovat na Packagist, pro budoucí možnost instalovat jej právě pomocí Composeru. A právě tento způsob je zde popsán.

Veřejný repozitář a composer.json

Pro začátek je potřeba mít balíček někde na veřejně přístupném repozitáři, v případě Resampleru na GitHubu. Dále přidat soubor composer.json, v něm nastavit informace o balíčku a nahrát na git. Posledním krokem je registrace na packagist.org a submitnout zde daný balíček.

Pro vytvoření composer.json souboru lze využít utilitku composeru spuštěním příkazu:

cd cesta/k/projektu
composer init

Osobně jsem obsah zkopíroval z jiného projektu a upravil svým potřebám. Lze se tedy také inspirovat např. mým souborem z Resampleru. Dle Packagist je ale minimální obsah souboru composer.json tento:

{
    "name": "your-vendor-name/package-name",
    "description": "A short description of what your package does",
    "require": {
        "php": "^5.3.3 || ^7.0",
        "another-vendor/package": "1.*"
    }
}

Složková struktura

Ideálně by knihovna měla podporovat autoload standard PSR-4. Ten sice nevynucuje použití složky src, pokud ale balíček obsahuje souborů více, je vhodné všechny umístit do podsložky. Co ale vynucuje je použití namespace, které jsou v PHP až od verze 5.3.

Aby následně Composer věděl, kde má hledat požadované soubory, je nutné specifikovat používaný standard a umístění souborů. Následující údaje se doplní do souboru composer.json, a tím určí. že vše v namespace Resampler je ve složce src.

"autoload": {
    "psr-4": {
        "Resampler\\": "src"
    }
}

Pro každý vnořený namespace je potřeba také vytvořit vnořenou složku, pro následující třídy musí odpovídat následující složková struktura:

use Resampler\Resampler;
use Resampler\Exceptions\Exception as RException;
use Resampler\Exceptions\FileException;

/*
Složková struktura validní podle PSR-4 standardu a ve složce src

korenovy_adresar_projektu
 |- src
 |   |- Exceptions
 |   |   |- Exception.php
 |   |   |- FileException.php
 |   |
 |   |- Resampler.php
 |
 |- composer.json
 |- README.md
 |- LICENCE
*/

Nyní lze balíček publikovat na Packagist.org a instalovat pomocí Composeru. Na webu ještě je požadavek na dodání webhooku do repozitáře. To je proto, aby Packagist věděl, kdy má stáhnout nové informace o balíčku z repozitáře a jeho verzích.

Autoload bez Composeru

Pro použití na projektech, které nepoužívají Composer je vhodné dodat vlastní autoloader. Funguje naprosto shodně, jako od Composeru, pouze je pro každý balíček zvlášť a je nezávislý na souboru composer.json.

<?php
spl_autoload_register(function ($className) {
    $prefix = 'Resampler\\';
    if (strpos($className, $prefix) !== 0) {
        return;
    }

    $file = substr($className, strlen($prefix));
    $file = __DIR__.DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR
        .str_replace('\\', DIRECTORY_SEPARATOR, $file).'.php';
    
    if (!is_readable($file)) {
        return;
    }

    require $file;
});

Tento soubor zaregistruje autoload funkci, a pokud se použije třída, interface nebo trait, který není známý, PHP spustí veškeré registrované loadery. Každý loader musí zkontrolovat, jestli se jedná o struktury pro něj známé. Pokud ano, provede se require, pokud ne, neděje se nic.

Tento poslední krok není pro publikování na Packagist nutný, stejně tak vůbec neovlivní chování Composeru. Je to ale bonus pro programátory, kteří Composer nepoužívají.


Máte dotazy, tipy či připomínky? Podělte se v komentářích

K tomuto článku již není možné přidávat další komentáře