8.1 KiB
Автоматизированный рефакторинг (ректор)
XC_VM использует Rector для модернизации устаревших PHP механических и безопасно. Ректор переписывает код на АСТ (не текст), поэтому каждое преобразование выполняется детерминированный и воспроизводимый. Он скорее дополняет существующие инструменты, чем заменяет их:
| Инструмент | Роль |
|---|---|
| Rector | Изменения код — механическая модернизация и упрощение |
| ПХПСтан | Тип отчетов/логические проблемы (make phpstan) |
| phpcs / Слевомат | Сообщает и исправляет стиль кодирования (make cs / make cs-fix) |
| Модуль PHP | Проверяет поведение (tests/phpunit.phar) |
Золотое правило: обнаружить → показать разницу → проверить → только после этого применить. Никогда не наносите средство массово. к производственному коду без предварительного просмотра пробного запуска.
Устанавливать
Rector является зависимостью require-dev от src/composer.json (как PHPStan и phpcs). Это
никогда отгружено: зафиксированное src/vendor/ доступно только для производства.
make dev-tools # composer install (incl. require-dev) — adds Rector to src/vendor
Перед приготовлением всегда подрезайте их:
make dev-clean # composer install --no-dev — restores a production-only vendor
Шлюз check-vendor-prod-only завершается сбоем, если Rector когда-либо попадает к зарегистрированному поставщику, так что
make dev-clean является обязательным перед любой фиксацией, которая затрагивает зависимости.
Бежать
make rector # dry-run: prints the diff, writes nothing (non-zero exit if changes pend)
make rector-fix # applies the changes in place
Эквивалентные Composer скрипты (запускаемые из src/):
composer refactor:dry
composer refactor
После изменений обратившийся всегда запускайте полный конвейер проверки и просматривайте разницу:
make cs-fix # reconcile style (tabs / K&R) with the rewritten files
make phpstan
php tests/phpunit.phar -c tests/phpunit.xml.dist
Конфигурация
Единственная конфигурация - это build/rector.php
(рядом с build/phpstan.dist.neon и build/phpcs.xml.dist). Пути привязываются с помощью
__DIR__, поэтому он ведет себя одинаково как из корневого хранилища, так и из src/.
Масштаб
В области видимости находятся только деревья на основе классов PSR-4:
src/Core src/Domain src/Cli src/Infrastructure
Все остальное равно исключенный и должно оставаться исключенным:
src/Public/**,src/Ministra/**— view templates use short tags (<?/<?=); procedural точки входа зависят от позиционного импортаuse, применяемого шлюзомcheck-procedural-use.src/Infrastructure/Tmdb/lib/**— устаревшая глобальная библиотека\TMDB(не PSR-4).src/Modules/**— установленный во время выполнения (может быть закодирован в ionCube).src/vendor/**,src/migrations/**,src/bin/**, runtime dirs (tmp,backups, …).- Streaming hot-path (
src/Streaming/**,src/Public/stream/**, the streaming bootstraps,Fanout*Command) — более высокий риск, переработанный позже на своей собственной осторожной фазе.
Включенные правила
Конфигурация позволяет использовать подготовленные наборы deadCode и codeQuality с сохранением поведения
упрощение и удаление ненужного кода. "Пустой-if с else" -антипаттерн, который, в свою очередь, может быть
(pervasive in the legacy code) is collapsed by the built-in RemoveDeadIfForeachForRector:
if (!$user) {
} else {
doThing();
}
// becomes:
if ($user) {
doThing();
}
Это оставляет непустые тела, пустые тела с комментариями и цепочки elseif нетронутыми. Нет пользовательского
для этого необходимо правило — встроенная программа уже делает это, и делает это чисто.
Намеренно отключенные (изменяющие поведение) правила
Два правила имеют значение пропущенный, поскольку они могут изменить поведение во время выполнения для устаревших программ со свободной типизацией код. Выберите их позже, для каждого файла, после просмотра — никогда в рамках механического прохождения:
SafeDeclareStrictTypesRector— добавляетdeclare(strict_types=1), изменяя приведение к int/string.UseIdenticalOverEqualWithSameTypeRector—==→===, который зависит от типа файла.
Правила добавления импорта также отключены (по умолчанию), чтобы защитить ворота check-procedural-use.
Добавление правила для конкретного проекта
Предпочитайте встроенное правило, если таковое существует. Если вам действительно нужно преобразование, специфичное для XC_VM:
- Добавьте класс в соответствии с
tools/rector/src/(правило ректора распространяется и наRector\Rector\AbstractRector). - Подключите его пространство имен с помощью записи
autoload-devPSR-4 вsrc/composer.json, затемcomposer dump-autoloadизsrc/. - Запишите его в
build/rector.phpс помощью->withRules([...]). - Добавьте обязательные тесты (ректорские
AbstractRectorTestCase,before/after, разделенные на-----) в разделять PHPUnit suite, а неtests/Unit/, поскольку основное тестовое задание выполняется на основе поставщик только для производства, в котором отсутствуют тестовые классы ректора.
КИ
Вакансии ректора-консультанта пока нет. Планируется, что это будет отдельная работа только для проверки (промежуточная), которая сообщает, но никогда не изменяет репозиторий — смотрите дорожную карту рефакторинга проекта.