Создание и тестирование пакета composer локально

Когда мы создаём новый пакет для composer, то перед загрузкой в packagist хорошо бы его протестировать.

Итак у нас есть новенький пакет с соответствующим composer.json в корне:

{
    "name": "name of the package",
    "description": "short description",
    "autoload": {
        "psr-4": {
            "Vendor\\SomeApp": "/src"
        }
    },
    "minimum-stability": "dev"
}

В данном файле происходит загрузка из src директории, которая для примера имеет описанный класс Hello в пространстве имён Vendor\SomeApp соответствующий пути json файла:

<?php
namespace Vendor\SomeApp;

class Hello
{
    public function hello()
    {
        echo 'Hello world!';
    }
}

Теперь, чтобы использовать пространство имён нужно импортировать его и вызвать соответствующий класс.

<?php
require 'vendor/autoload.php';

use Vendor\SomeApp\Hello;

$hello = new Hello();
$hello->hello();

Это начальный процесс создания пакета, но для его фактического тестирования необходимо приложение.

Для этого мы создадим папку для запуска инсталлятора в родительской директории, что бы и папка приложения, и папка пакета находились на одном уровне.

Далее создадим ещё один json файл. Добавим в него необходимое vendor/name в ключ require. Что бы всё заработало, добавим массив в ключ repositories и передадим локальный путь к нашему пакету. Это даст composer загрузить пакет из локальной системы, а не из Packagist.

{
    "require": {
        "vendor/someapp": "@dev"
    },
    "repositories": [
        {
           "type": "path",
           "url": "../SomeApp",
            "options": {
                "symlink":true
            }
        }        
    ]
}

Что бы иметь возможность оперативно проверить последующие правки без необходимости всякий раз выполнять команду composer update, мы добавили дополнительную опцию "symlink":true. Теперь вместо полного копирования в папку vendor, будет лишь создан симлинк на локальный путь к пакету.

Для установки локального пакета через composer выполняем:

composer require vendor/someapp @dev

После этого пакет будет связан с приложением посредством symlink и мы можем приступать к испытаниям.