이 페이지는 패키지 개발의 기초의 자매 페이지입니다. 패키지 개발의 기본적인 지식(서비스 프로바이더,
composer.json의 구성 등)을 전제로 하고 있습니다.Laravel의 메이저 버전 업그레이드에의 대응
대응의 흐름
composer.json의 require를 갱신한다
새 버전을 의존 범위에 추가합니다. 오래된 버전의 서포트를 이어가는 경우에는 새 버전에의 대응이 완료되고, 오래된 버전의 서포트를 종료하는 경우에는 오래된 제약을 삭제합니다.
||로 나열합니다.테스트를 새 버전에서 실행한다
로컬 또는 CI 환경에서 새로운 Laravel 버전을 사용하여 테스트를 실행합니다.테스트가 통과되면 기본적인 호환성은 확인되어 있습니다. 통과되지 않는 경우에는, 변경된 API나 삭제된 메서드를 수정합니다.
GitHub Actions의 테스트 매트릭스에 새 버전을 추가한다
CI의 테스트 매트릭스에 Laravel의 새 버전을 추가하여, 지속적으로 호환성을 확인합니다. 자세한 것은 테스트 매트릭스의 설정 예를 참조해 주세요.
공식 패키지를 참고로 한다
대응 방법에 헤맬 때는, Laravel의 공식 패키지의composer.json을 참조하는 것이 가장 확실합니다.
이러한 패키지는 Laravel 팀이 관리하고 있으며, 새 버전에의 대응이 가장 빠르고, illuminate/*의 의존 버전 쓰는 법도 참고가 됩니다.
PHP 버전 요건의 갱신
Laravel의 버전 업그레이드는 PHP의 최저 요건도 상향할 때가 있습니다. 패키지의composer.json에서 PHP 요건도 함께 갱신합니다.
| Laravel | 최저 PHP 요건 |
|---|---|
| Laravel 11 | PHP 8.2 |
| Laravel 12 | PHP 8.2 |
| Laravel 13 | PHP 8.3 |
| Laravel 14 | PHP 8.4 |
새로운 PHP 기능을 적극적으로 사용하는 경우
PHP 8.3 이후의 기능(타입 지정 상수, 새로운 랜덤 함수 등)을 사용하고 싶은 경우에는, 최저 요건을 상향하는 판단이 필요합니다. 최저 요건의 상향은 시맨틱 버저닝상은 파괴적 변경이므로, 메이저 버전 업그레이드 시에 하는 것이 적절합니다.구 버전 서포트의 종료 전략
구 버전을 언제까지고 유지하는 것은, 장기적으로는 유지보수 비용을 증대시킵니다. 명확한 서포트 정책을 정하고, 정기적으로 오래된 버전의 서포트를 종료하는 것이 건전한 패키지 운영으로 이어집니다.서포트 종료의 타이밍
일반적인 접근 방식은, Laravel의 서포트 기간에 맞추는 것입니다. Laravel은 각 버전에 대해 버그 수정 18개월, 시큐리티 수정 2년의 서포트를 제공하고 있습니다. 패키지도 같은 정책을 채용하면 사용자에게 알기 쉬워집니다.| 판단 기준 | 설명 |
|---|---|
| Laravel의 공식 서포트 종료 | 해당 Laravel 버전의 서포트가 종료된 타이밍에 대응을 그만둠 |
| 이용 상황 | Packagist의 다운로드 통계로 구 버전 이용자가 적어진 타이밍 |
| 기능 추가의 장벽 | 구 버전 대응을 위해 새 기능의 구현이 복잡해진 타이밍 |
서포트 정책을 README에 명기한다
사용자가 기댓값을 올바르게 가질 수 있도록, 서포트 정책을README.md에 기재합니다.
구 버전 유지의 비용
구 버전 서포트를 이어가면 다음의 비용이 발생합니다.- 버그 수정의 이중 대응 — 같은 버그를 여러 브랜치에서 수정할 필요가 있음
- 분기 코드의 증가 — 버전별로 다른 구현을 조건 분기로 흡수하는 복잡함
- 테스트 매트릭스의 비대화 — CI 실행 시간이 길어짐
- 시큐리티 패치의 복잡화 — 오래된 버전에도 안전하게 백포트할 필요가 있음
조기 대응의 메리트
Laravel의 릴리스와 동시에 대응이 완료되어 있으면, 사용자는 즉시 새 버전으로 이관할 수 있습니다. 이것은 패키지의 신뢰성을 나타내는 중요한 시그널입니다.개발판에서 사전 검증한다
Laravel은 beta/RC를 공개하지 않는 대신,dev-master 또는 @dev를 지정함으로써 개발 중의 차기 버전을 설치할 수 있습니다. 메이저 릴리스 전에 동작 확인을 함으로써, 제로데이 대응이 가능해집니다.
@dev 제약으로 설치할 수도 있습니다.
minimum-stability를 dev로 설정함으로써, 개발판과의 의존 관계를 해결할 수 있습니다.
최초의 스텝은 composer.json의 변경만으로 좋다
완전한 호환성 확인 전이라도,composer.json의 의존 범위를 갱신하여 릴리스하는 것만으로, 사용자는 패키지를 설치할 수 있게 됩니다.
릴리스 정보의 팔로잉 방법
새 버전의 릴리스 정보를 시기 적절히 파악하기 위한 방법입니다.| 정보원 | 내용 |
|---|---|
| GitHub Watch 기능 | 리포지토리의 “Watch → Custom → Releases”에서 메일 통지를 받음. framework 이외의 주요 패키지도 등록해 두면 좋음 |
| Laravel 공식 블로그 | 메이저 릴리스의 발표와 새 기능 해설 |
| Laravel 공식 문서 업그레이드 가이드 | 파괴적 변경의 목록 |
| laravel/framework 커밋 로그 | 차기 버전의 변경을 선점하는 경우에는 커밋 로그를 직접 따라감 |
테스트 매트릭스의 설정 예
GitHub Actions에서 여러 Laravel 버전과 PHP 버전의 조합을 자동 테스트하는 워크플로우 예입니다.fail-fast: false의 중요성
fail-fast: false를 설정함으로써, 하나의 조합이 실패해도 다른 조합의 테스트를 계속합니다. 어느 버전의 조합에서 문제가 발생하고 있는지를 한 번의 CI 실행으로 파악할 수 있습니다.
테스트 매트릭스의 단계적 갱신
새로운 Laravel 버전이 나오면, 매트릭스에 추가합니다. 오래된 버전의 서포트를 종료하면, 매트릭스에서 삭제합니다.composer.json의 샘플
여러 버전 대응의composer.json의 완전한 예입니다.
버전 업그레이드 대응 체크리스트
Laravel의 새 버전 릴리스 전
Laravel의 새 버전 릴리스 전
- 개발판(
dev-master/@dev)에서 동작 확인을 실시 - 공식 업그레이드 가이드에서 파괴적 변경을 확인
- 테스트 환경에서 새 버전에의 대응을 구현
- 테스트 매트릭스에 새 버전을 추가하여 CI에서 확인
릴리스 직후의 초기 대응
릴리스 직후의 초기 대응
-
composer.json의illuminate/*요건에 새 버전을 추가 - 필요에 따라 PHP 요건을 갱신
-
require-dev의orchestra/testbench도 대응 버전으로 갱신 - 새 버전을 태그 붙여 Packagist에 반영
- README의 버전 호환성 표를 갱신
구 버전 서포트 종료 시
구 버전 서포트 종료 시
- CHANGELOG/README에 서포트 종료를 명기
-
composer.json에서 구 버전의 제약을 삭제 - 테스트 매트릭스에서 구 버전을 삭제
- 구 버전용의 조건 분기 코드를 정리
관련 페이지
패키지 개발의 기초
서비스 프로바이더를 핵심으로 한 Laravel 패키지의 개발 방법을 해설합니다.
Pest를 이용한 고급 테스트
Pest의 Expectation API나 데이터셋을 사용한 패키지 테스트의 작성법을 해설합니다.