의존성을 기술할 때 가장 중요한 항목은 사용하는 패키지의 버전을 프로젝트의 목적에 맞게 잘 지정하는 것입니다. 개발하는 프로젝트의 버전을 관리할 때나 사용하는 외부 라이브러리의 버전을 지정할 때 전 절에서 설명한 유의적 버전에 맞게 관리하면 의존성 지옥에서 벗어날 수 있습니다.


컴포저에서 버전 지정은 다음과 같은 문법으로 지정할 수 있습니다.

이름예제의미
정확한 버전1.0.1버전 1.0.1과 일치하는 버전
범위 지정(Range)>=1.01.0 보다 크거나 같은 버전중 마지막 버전. 2.0, 3.1 도 포함
>=1.2 <2.01.2 보다 크거나 같고 2.0 보다 작은 버전중 마지막 버전
물결(Tilde) 연산자(~)~1.2바로 위(>=1.2 <2.0)와 동일한 의미
OR 연산자(|)1.2.3 | 1.3.41.2.3 또는 1.3.4
와일드카드 연산자(*)1.0.*1.0.x 대중 가장 큰 버전으로 1.1 보다는 작은 버전. >= 1.0 < 1.1 과 동일
캐럿(Caret) 연산자(^)^1.2.3>=1.2.3 <2.0 와 동일

여기에서 가장 중요하며 많이 사용되는 표현은 물결 연산자와 캐럿 연산자, 와일드 카드 연산자입니다.


물결(~) 연산자

github 에 공개된 PHP 프로젝트의 composer.json 을 보면 물결 연산자(~)로 지정한 것을 많이 볼수 있을 것 입니다.

예로 ~1.2 는 ">=1.2 <2.0.0"(1.2 보다 크거나 같고 2.0 보다는 작다)와 동일한 의미로 사용하는 라이브러리가 유의적 버전을 따른다면 API가 변경되지 않아 기존 소스가 이상없이 동작하며 기능 추가와 버그 픽스만 적용된 버전중 가장 마지막 버전을 사용하겠다는 의미입니다.

"~1.2.3"은 1.3.0 보다 작은 버전중 마지막 버전(예: 1.2.9) 를 사용하겠다는 의미입니다. 혼동을 줄이고 버전 지정에 익숙해 지기 위해 물결 연산자를 사용한 몇 가지 예제를 더 읽어 봅시다.

버전의미비고
~4.1.3 >=4.1.3, <4.2.0
~4.1 >=4.1.0,< 5.0.04.1 보다 크고 일반적으로 가장 많이 사용되는 표현
~0.4>=0.4.0,<1.0.0
~4>=4.0.0,<5.0.0.


캐럿(^) 기호 연산자

캐럿 기호 연산자는 물결 연산자와 비슷하지만 약간 다르게 동작합니다. 예로 ^1.2.3 은 ~1.2.3 과 달리 >= 1.2.3 < 2.0 으로 해석됩니다.

다음 예제를 보면서 물결 연산자와 차이를 알아 봅시다.

버전의미비고
^4.1.3 >=4.1.3,<5.0.0
^4.1 >=4.1.0,<5.0.0~4.1 과 동일한 의미
^0.4>=0.4.0, < 0.5.0하위 호환성을 제공하는 라이브러리를 지정할 때 유용하며 ~0.4.0 과 동일 의미 
^4>=4.0.0,<5.0.0. ~4 또는 4.* 과 동일한 의미



와일드 카드(*) 연산자

와일드 카드 연산자는 1.* 같이 마이너 버전에 지정하기 보다는 2.6.* 와 같이 패치 버전 항목에 많이 지정하여 사용합니다.

이것은 2.6 버전중에 가장 안정 버전을 사용하겠다는 의미로 사용하는 라이브러리에 추가되는 기능이 필요 없을 경우 유용합니다.

신규 기능을 구현하다 보면 버그가 발생하기 마련이니  안정적인 버전을 사용하여 프로젝트를 진행하고 싶다면 와일드 카드로 패치 버전을 지정하면 안정적인 외부 라이브러리를 사용할 수 있습니다.


이제 의존성 있는 외부 라이브러리의 새로운 버전이 릴리스 되었을 경우나 혹은 composer.json 에 의존성 항목이 추가되거나 패키지 버전이 변경되었을 경우 

composer update 명령어를 입력하면 composer 는 composer.json 을 다시 읽어서 의존성을 재설정하며 이 과정에서 새로 추가된 라이브러리나 릴리스된 라이브러리가 있을 경우 업데이트 합니다.