Автоматизированный рефакторинг (ректор)¶
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/ доступно только для производства.
Перед приготовлением всегда обрежьте его обратно:
Шлюз 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/):
После изменений обратившийся всегда запускайте полный конвейер проверки и просматривайте разницу:
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/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:
При этом непустые тела, пустые тела с комментариями и цепочки 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/, поскольку основное тестовое задание выполняется в соответствии с поставщик только для производства, в котором отсутствуют тестовые классы ректора.
КИ¶
Вакансии ректора-консультанта пока нет. Планируется, что это будет отдельная работа только для проверки (промежуточная), которая сообщает, но никогда не изменяет репозиторий — смотрите дорожную карту рефакторинга проекта.