최근 PHP로 만들어진 CMS나 모듈을 다루다 보면 의존성 관리를 위해서 Composer를 사용하는 경우가 많아졌습니다. node.js의 npm과 같은 패키지매니저와 비슷한 역할을 하고 있습니다.
설치
Linux/Unix/Mac OS에서 설치
먼저 PHP가 없다면 다음과 같이 설치해 줍니다. (Ubuntu)
sudo apt-get update
sudo apt-get install php
sudo apt-get install php-curl php-json php-mbstring php-mysql php-xml php-zip
그다음 다음과 같이 composer를 가져와 설치할 수 있습니다.
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin/
사용하기 쉽게 바로가기를 만들어 둡니다.
sudo ln -s /usr/local/bin/composer.phar /usr/local/bin/composer
composer --version
composer config --list ## 설정보기
composer global config --list ## Global 설정보기
윈도우에서 설치
단순히 https://getcomposer.org/Composer-Setup.exe 에서 파일을 받아서 설치하면 됩니다.
composer.json 파일 설정
패키지의 목록을 가지고 있는 파일입니다. composer init 명령을 통해 생성할 수도 있습니다. require에 의존성 패키지를 기술합니다.
"소유자/패키지명" : "버전명"
예는 다음과 같습니다.
{
"name": "...",
"require": {
"composer/installers": "^1.9",
"drupal/core-composer-scaffold": "^9",
"drupal/core-project-message": "^9",
"drupal/core-recommended": "^9",
...
이제 패키지를 설치하거나 갱신할 수 있습니다.
composer install
composer update
코드에서 자동으로 의존성 로딩
composer를 사용한 라이브러리들은 autoload.php에 등록되기 때문에 코드에서 일일이 해당 패키지명을 지정하지 않아도 다음과 같이 하나만 적어주면 해당 패키지의 라이브러리를 사용할 수 있게 됩니다.
require 'vendor/autoload.php';
Troubleshooting
Failed to open stream: Permission denied
만일 failed to open stream: Permission denied와 같은 에러를 본다면 다음과 같이 소유자를 변경합니다.
sudo chown -R $USER ~/.composer/
메모리 문제
보기에도 무서운 Fatal 에러. 😠 최근 Composer는 1.5G 정도의 많은 메모리를 요구합니다. 다음과 같이 설정해서 메모리 제한을 없앨 수 있습니다.
PHP Fatal error: Allowed memory size of...
먼저 PHP의 메모리 제한을 php.ini 파일을 수정해 조정할 수 있습니다.
; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1
Composer에 정의된 환경변수 COMPOSER_MEMORY_LIMIT 를 사용해 명령을 내릴 수도 있죠.
COMPOSER_MEMORY_LIMIT=-1 composer install <package:version>
아니면 다음과 같이 PHP 명령 조합으로 구동할 수 있습니다.
php -d memory_limit=-1 composer ...
물론 자주 사용될 경우에는 which composer를 통해 해당 위치에 있는 실행 스크립트를 다음과 같이 바꿉니다.
#!/bin/sh
...
php -d memory_limit=-1 "${dir}/composer.phar" "$@"
윈도우라면 composer.bat파일에서 다음과 같이 바꿀 수 있습니다.
@echo OFF
:: in case DelayedExpansion is on and a path contains !
setlocal DISABLEDELAYEDEXPANSION
php -d memory_limit=-1 "%~dp0composer.phar" %*