Link Search Menu Expand Document
19 Февраля 2021 г.

Создание composer пакета

Содержание
  1. Создание репозитория
  2. Создание инфраструктуры
  3. Makefile
  4. composer.json
  5. Автозагрузка классов
  6. Тесты
  7. Публикация на packagist.org
  8. Исходники
  9. UPD 06.05.2021

Типичное php приложение зависит от другого кода. Часто бывает, что код необходимо использовать сразу в нескольких проектах. В php такими зависимостями управляет пакетный менеджер composer.

Важно отличать пакет (библиотеку) от проекта (приложения). Пакет — это законченная программа которую мы используем в проекте как зависимость. А проект — это конечный продукт(сайт) который использует зависимости (пакеты).

Все пакеты хранятся в репозитории composer библиотек packagist.org.

Небольшой мануал как создать composer пакет.

Создание репозитория

Первое, что необходимо сделать — это создать на гитхабе git репозиторий с названием библиотеки.

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

git init
git remote add origin git@github.com:LexusAlex/composer-package.git
git checkout master
git checkout -b main
git pull origin main
git branch --set-upstream-to=origin/main main

Создание инфраструктуры

Чтобы было удобно разрабатывать проект, настроем запуск php в докер контейнере.

Создадим Dockerfile по пути docker/php-cli/Dockerfile со следующим содержимым:

FROM php:7.4-cli-alpine

RUN apk add --no-cache autoconf g++ make \
    && pecl install xdebug \
    && rm -rf /tmp/pear \
    && docker-php-ext-enable xdebug

RUN mv $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini

RUN apk add unzip

ENV COMPOSER_ALLOW_SUPERUSER 1

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet \
    && rm -rf /root/.composer/cache

WORKDIR /composer-package

Из этой инструкции будет создан образ, и в последствии запущен контейнер.

С заделом на использование нескольких контейнеров добавим специальный файл docker-compose.yml в корень пакета:

version: "3.7"
services:
  php-cli:
    build:
      context: ./docker/php-cli
      dockerfile: Dockerfile
    volumes:
      - ./:/composer-package

Запускаем сборку docker-compose build или docker-compose up

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

docker-compose run --rm php-cli composer --version
Composer version 2.0.9 2021-01-27 16:09:27

Makefile

Чтобы вручную не забивать команды добавим в корень Makefile, в котором будем писать все выполняемые команды.

Например такие

build:
	docker-compose build
up:
	docker-compose up

Впоследствии запуск сборки сводится к make build. В процессе работы мы будем добавлять сюда команды.

composer.json

Теперь создадим пример файла composer.json. Это можно сделать и ручками, но мы запустим команду composer init

docker-compose run --rm php-cli composer init

В интерактивном режиме будут заданы ряд вопросов, можно заполнить или оставить по дефолту.

У меня создался такой файл:

{
    "name": "lexusalex/composer-package",
    "description": "test project in composer",
    "type": "library",
    "authors": [
        {
            "name": "Alexsey Shmelev",
            "email": "alexsey_89@bk.ru"
        }
    ],
    "minimum-stability": "stable",
    "require": {}
}

Все параметры этого файла можно менять.

Так же я добавил .gitignore в который поместил папку /vendor и файл composer.lock.

Добавим две папки

  • src - исходные коды нашей библиотеки
  • test - phpunit тесты

Автозагрузка классов

Пропишем автозагрузку для тестов и исходных кодов в composer.json

{
  "autoload": {
    "psr-4": {
      "lexusalex\\composer-package\\": "src/"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "lexusalex\\composer-package\\test\\": "tests/"
    }
  }
}

И выполним команду docker-compose run --rm php-cli composer dump-autoload.

Тесты

Создадим директорию tests и поставим phpunit.

docker-compose run --rm php-cli composer require --dev phpunit/phpunit

Добавим конфигурационный файл phpunit.xml

Сгенерируем его автоматически командой docker-compose run --rm php-cli vendor/bin/phpunit --generate-configuration. Или скопируем и другого проекта. У меня он выглядит следующим образом :

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         executionOrder="depends,defects"
         forceCoversAnnotation="false"
         cacheResult="false"
         colors="true"
         beStrictAboutCoversAnnotation="true"
         beStrictAboutOutputDuringTests="true"
         beStrictAboutTodoAnnotatedTests="true"
         failOnRisky="true"
         failOnWarning="true"
         verbose="true">
    <testsuites>
        <testsuite name="default">
            <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>

    <coverage cacheDirectory=".phpunit.cache/code-coverage"
              processUncoveredFiles="true">
        <include>
            <directory suffix=".php">src</directory>
        </include>
    </coverage>
</phpunit>

Публикация на packagist.org

Последнее, что осталось сделать — это опубликовать наш пакет на packagist.org.

Особого труда это не составит.

Закоммитим и поставим тег версии git tag -a 0.1 -m 0.1

Теперь открываем проект куда мы ходим поставить данный тестовый пакет с именем lexusalex/composer-package.

docker-compose run --rm php-cli-alpine composer require lexusalex/composer-package 0.1

Так же можно на основании этого пакета создать проект при желании.

Исходники

Предложения и pull requests приветствуются https://github.com/LexusAlex/composer-package.

UPD 06.05.2021

Пакет обновлен

  • версия 0.3.0. Введены проверки на корректность и соответствие стандартам. Подробнее

Возник вопрос или предложение пиши на почту alexsey_89@bk.ru или в Телеграмм канал

Дата публикации: 19 Февраля 2021 г.