여러 명의 개발자가 같이 일하는 환경에서는 단일 개발 환경으로 만들고 다른 버전의 라이브러리 사용으로 인한 혼란을 방지하는 것이 매우 중요합니다.

이를 위해서는 먼저 컴포저의 의존성을 기록한 파일인 composer.lock 파일을 형상관리 시스템에 등록하고 모든 개발자가 공유하는 것이 필요합니다.


그러면 개발팀의 라이브러리 의존성을 일치시키기 위하여 컴포저 install 과 update 의 차이점에 대해서 다시 한 번 살펴 보겠습니다.

컴포저 install

컴포저는 install 명령어 실행시 프로젝트 디렉터리에  composer.lock 파일이 있을 경우 패키지의 새 버전을 확인하는 대신 composer.lock 에 지정된 버전의 패키지를 설치합니다.

만약 파일이 없을 경우 정의된 composer.json 을 읽어서 의존성에 맞게 패키지를 검색하고 설치한 후에 의존성 정보와 버전을 composer.lock 파일에 기록합니다.


composer.json 이 변경되었지만 composer.lock 은 변경되지 않았을 경우(composer.json 의 변경일이 composer.lock 보다 이후일 경우) 컴포저는 의존성 정보가 반영되지 않았다고 판단하여 아래와 같은 메시지를 출력합니다.

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update

Generating autoload files
> php artisan clear-compiled
BASH


위와 같은 상황은 composer.json 내의 require 나 require-dev 항목에 새로운 패키지를 설치하거나 의존성있는 버전을 수정했지만 composer update 를 실행하지 않았을 경우에 발생합니다.

컴포저 update

update 명령어는 install 과는 달리 무조건 composer.json 을 파일을 읽고 허용하는 버전 범위내 새 버전이 있을 경우 설치하고 composer.lock 파일을 갱신합니다.

프로젝트 의존성 일치

두 명령어의 동작의 차이를  알아보기 위해 composer.json 에 다음과 같이 mylib/lib-hello 라는 라이브러리에 대한 의존성이 정의되어 있다고 가정해 봅시다.

"require": {
        "php": ">=5.5.9",
        "mylib/lib-hello": "~2.0"
}
JS

composer.lock 파일에는 2.1.1 파일이 설정되어 있고 composer.lock 파일을 형상 관리를 통해 공유하였으므로 모두가 같은 버전을 사용하고 있습니다.


이제 새로운 개발자가 들어왔을 경우 개발 환경을 구성하기 위해 소스를 형상 관리에서 체크아웃 받고 컴포저로 의존성을 설치해야 합니다.


이때 새로운 개발자가 composer update 를 실행했을 경우 composer.json 을 먼저 읽게 되며 위에서 유의적 버전을 "~2.0" 으로 설정하였으므로 개발자의 투입 시점에 따라 다른 버전의 lib-hello 라이브러리가 설치됩니다.(실선은 개발자가 투입된 시기입니다.)

  • 4월 26일에 참여한 개발자는 2.1.1 버전 사용
  • 5월 16일에 참여한 개발자는 2.3.1 버전 사용
  • 5월 18일에 참여한 개발자는 2.2.5 버전 사용


하지만 composer install 을 실행했다면 이 명령어는 composer.lock 에 설정된 버전의 파일만 설치하므로 투입 시점과 관련없이 동일한 2.1.1 버전을 사용하게 됩니다.


그러므로 프로젝트의 참여자의 의존성을 일치시키려면 composer update 명령은 프로젝트내 패키지 관리자 또는 새로운 패키지를 추가한 개발자만 수행해야 하며 변경된 composer.lock 파일은 버전관리에 올려두어야 합니다.

다른 개발자들은 의존성이 변경되었을 경우 composer install 명령어로 composer.lock 에 지정된 버전만 사용하도록 하면 프로젝트내 모든 개발자가 프로젝트 참여 시기와 상관없이 동일한 버전의 라이브러리를 사용하여 작업함이 보장되므로 상이한 외부 라이브러리 버전으로 인한 충돌이나 버그등 여러 가지 모호성이 해결됩니다.