Rector를 사용하여 PHP 7.4에서 8.1로 안전하게 업그레이드

코드베이스를 안전하게 업그레이드하는 데 근접한 유일한 방법은 견고한 자동 테스트 세트를 보유하는 것입니다. 화면에서 춤추는 녹색 체크 표시보다 더 편안한 것은 없습니다.

즉, 우리는 곧 죽게 될 PHP 7.4 (Nov 28) 에서 실행되는 Laravel 프로젝트를 업그레이드할 것입니다. 현재 안정적인 마지막 PHP 버전은 8.1이며 Rector이라는 도구를 사용하여 업그레이드할 예정입니다. Rector는 매우 편안한 방식으로 새로운 구문으로 넘어갈 수 있도록 도와줄 것입니다.

더 이상 고민하지 않고 내가 따랐던 단계는 다음과 같습니다.

composer.json을 새로운 PHP 8.1로 변경




"require": {
    "php": "^8.1",
    ...
}

composer.json에서 수동으로 버전을 변경하는 것과 함께 PHP 8.1을 사용하도록 환경도 변경했습니다. 홈스테드에서는 php81 를 실행하면 됩니다. Valet에서 해당 명령은 valet use [email protected] 입니다. Windows를 사용 중이고 Wamp 또는 Xampp을 사용하고 있다면 행운을 빕니다 😁.

작곡가 업데이트 수행



환경을 바꾼 후 착하고 위험한composer update 실행했습니다. 더 깨끗한 방법이 있을 수 있으므로 이것에 대해 완전히 확신할 수는 없지만 작곡가가 모든 패키지를 지정된 PHP 버전으로 확인하고 업데이트해야 한다고 생각합니다.

사용하는 모든 패키지가 새 PHP를 지원하는 것은 아니기 때문에 이 시점에서 막히거나 작성기 오류에 직면할 수 있습니다.

손상될 수 있는 패키지 확인



이 특정 프로젝트에서 지원하지 않는 유일한 패키지는 fzaninotto/faker 이며 이는 해당 프로젝트에서 goodnight since 2020 이라고 말했기 때문입니다. 하지만 좋은 소식은 fakerphp/faker 이라는 대안이 있으며, 이는 composer.json( "fzaninotto/faker" => "fakerphp/faker" )에서 직접 사용할 수 있습니다. 그리고 공장에서 무언가를 변경할 필요가 없습니다. 그냥 작동합니다.

테스트 실행



이 시점에서 테스트를 실행했는데 아무 문제가 없으며 모두 통과하고 있습니다. 휴.
그러나 원활하게 진행되지 않거나 테스트가 없는 경우 지원 중단here을 확인하십시오. 구식 방식으로 업그레이드하지 않을 것이기 때문에 해당 구문을 처리했는지 확인하고 새 구문을 무시하십시오. 변경 사항을 커밋하면 구문 변경 사항에 대한 백지 상태가 됩니다.

Rector 설치, 구성 및 실행



composer require rector/rector --dev
vendor/bin/rector init

이 명령은 Rector를 설치하고 프로젝트의 루트에 rector.php 파일을 생성합니다. 다음 구성으로 모든 코드베이스를 PHP 8.1로 업그레이드하도록 Rector에 지시하도록 수정할 수 있습니다.

return static function (RectorConfig $rectorConfig): void {
    $rectorConfig->paths([
        __DIR__ . '/app',
    ]);

    $rectorConfig->importNames();

    $rectorConfig->sets([
        LevelSetList::UP_TO_PHP_81,
    ]);

    $rectorConfig->skip([
        SpatieEnumClassToEnumRector::class,
    ]);
};


마지막 규칙에 대해 곧 논의하겠지만 이제 vendor/bin/rector --dry-run 를 실행할 수 있어야 합니다. 코드베이스가 크면 1~2분 정도 기다려야 합니다. 완료되면 git diff와 같이 적용할 모든 변경 사항을 볼 수 있습니다. --dry-run를 생략하면 대신 진행되어 코드에 대한 모든 변경 사항을 수행하므로 선택한 diff 브라우저에 보관할 항목을 선택할 수 있습니다.

마지막 규칙SpatieEnumClassToEnumRectorspatie/enum package 을 사용하고 있기 때문에 건너뛰고 자동으로 PHP 기본 열거형으로 변환되는 것을 원하지 않습니다. 그 이유는 Spatie 패키지에 멋진 조그마한 헬퍼가 있기 때문입니다. 제 생각에는 일부 열거형을 수동으로 마이그레이션하는 것이 더 안전합니다.

지적하고 싶은 또 다른 문제는 match 표현식입니다. switch 와 달리 엄격한 비교를 수행하며 확인하지 않은 상태로 두면 약간의 피해를 줄 수 있습니다. 해결 방법으로 match (true) {...} 버전을 사용할 수 있습니다. 이 버전은 아름답지는 않지만 switch 와 같이 느슨한 비교를 수행합니다.

8.1의 새로운 기능과 Rectorwill do for you에 대해서는 다루지 않겠지만 모든 코드가 자체적으로 정리되는 것을 보니 기분이 좋습니다. PHPStorm은 기본적으로 이를 지원합니다. 당신은 그것을 시도해야합니다. 젠장, 테스트를 중단하고 실행하십시오.


https://blog.genijaho.dev에 원래 게시되었습니다.

좋은 웹페이지 즐겨찾기