composer를 쓰는 대부분의 이유는 외부의 라이브러리들을 가져와서 잘 관리하고 잘 사용하기 위함이다.
composer 를 사용하기 위한 간단한 프로젝트를 구성해 보자. 실전에서도 다음과 같은 절차가 비슷하게 사용된다.
우선 나의 프로젝트에 해당하는 파일을 하나 만들어 본다. 어떤 프로젝트라도 첫 실행 진입점이 필요하므로 여기서도 index.php 를 만들어 보겠다.
<?php
// {projectRoot}/src/index.php
namespace MyComposerProject\Src;
echo "Hello Composer";
composer 실행 전에 한가지
Do not run Composer as root/super user!
리눅스의 경우, composer 를 root 계정에서 실행하려고 하면 root 에서 실행하지 말라는 메세지가 나온다.
> composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
링크를 따라가보면 composer 로 실행되는 스크립트들이 해당 계정에 대한 권한을 다 가지기 때문이라는 설명이 나온다.
즉, 보안상의 이유이다. root 에서는 composer 로 라이브러리를 설치하고 실행하지 않도록 하자.
실행은 언제나 project root 에서
composer 를 실행할 때는 언제나 project root 로 이동한 후 실행해야 한다. 그렇지 않으면 정상적으로 실행되지 않는다.
즉, 내 프로그램이 /user/myProject 나 c:\dev\myProject 에 위치하고 있다면, composer 는 언제나 /user/myProject 나 c:\dev\myProject 디렉토리로 가서 실행해야 한다.
composer init : 초기화
이제 내 프로젝트에 composer 를 사용할 차례다.
composer 를 사용하기 위해서는 맨 처음 내 프로젝트에 대해 composer 를 초기화 설정을 해 줘야 한다.
프로젝트 루트로 이동하여 composer init 을 실행한다.
>composer init
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [vendor/name]:
Description []:
Author [you <your@email.com>, n to skip]:
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []: library
License []:
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? n
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
{
"name": "vendor/name",
"type": "library",
"authors": [
{
"name": "you",
"email": "your@email.com"
}
],
"require": {}
}
Do you confirm generation [yes]? yes
>
쭉쭉 나가서 설정을 끝냈다. 이 과정은 프로젝트 루트에 기본적인 composer.json 을 생성하기 위한 과정으로, 앞으로 사용되는 모든 의존성이 composer.json 에 기록되고 관리된다.
패키지 타입은 공식문서에서 기본이라고 되어 있는 library 를 선택했는데, 설정하지 않아도 된다.
Would you like to define your dependencies (require) interactively [yes]? n Would you like to define your dev dependencies (require-dev) interactively [yes]? n |
이부분은 의존성 패키지를 지금 설정할 것인지를 묻는 질문인데 나중에 설정할 것이므로 패스했다.
보면 알겠지만 requre 와 require-dev 두종류로 나뉘어 있는데, require 는 실제 프로젝트에서 사용되는 의존성 패키지를 말하고, require-dev 는 개발중에 사용될 (실 서비스에서는 사용되지 않을) 의존성 패키지들을 말한다.
실제 composer.json 파일이 생성되었는지 한번 확인해 보고, 한 번 설치를 실행해 보자.
composer install : 의존성 설치 (1)
>composer install 은 composer 로 관리할 라이브러리들을 프로젝트 하위에 다운받아 배치하는 과정이다. 모든 다운과 배치는 {project root}/vendor 디렉토리 하위에서 이루어진다.
일단 실행해 보자.
>composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
다음과 같은 일이 일어났다.
1. 아무것도 설치되지도 업데이트되지도 않았다.
아무런 패키지도 composer.json 에 명시되어 있지 않으므로 아무것도 가져오지 않은 것이다.
2. autoload file 이 생성되었다.
필요한 파일/라이브러리들을 자동으로 인클루드가 가능하게 하는 오토로딩 설정 파일로, vendor 디렉토리 밑에 autoload.php 를 말한다.
composer install 한 뒤, document root 를 보면 하위에 vendor 라는 디렉토리가 생성되어 있는 것이 보인다. 여기에는 PSR-4 규칙을 따라 오토로딩이 가능케 하는 autoload.php 파일(파일을 열어보면 알겠지만 이 파일 하나만으로 다 되는 건 아니다)과, 기능 지원을 위한 파일들이 vendor/composer 디렉토리에 이미 설치되어 있는 것이 보인다.
composer는 PSR-4 autoloader 규칙을 준수한다.
PSR(PHP Standard Recommendation)은 PHP 코딩방식에 대한 표준 권고안으로, 최근의 수많은 프로젝트, 라이브러리, 프레임워크 등에서 준수하고 있는 규칙이며, 지금도 새로운 규칙이 논의되거나 지정, 폐기되고 있다.
조금 부연설명을 하자면 옛날 php 프로젝트들은 __autoload() 를 따로 정의하여 사용하거나, 그냥 include 나 require 를 사용하여 직접 파일들을 인클루드하여 사용해 왔지만, composer 를 사용하면 이런 부분들을 composer 에서 모두 관리해 주므로 매우 편리하다. 내부적으로는 spl_autoload_register() 를 사용한다.
composer 에서는 라이브러리들이 설치되면 그 정보를 내부에 파일로 캐쉬해 두고 있다가 오토로딩때 사용한다.
3. autoloader 를 내 프로젝트에 적용
간단하다. autoloader 를 한번만 인클루드 해 주면 된다.
# src/index.php
<?php
namespace MyComposerProject\Src;
include "vendor/autoload.php";
echo "Hello Composer";
추후 내 프로젝트에 코드가 추가되면서 상호간에 코드 인클루드가 필요하게 되는데,
이때는 composer.json 에 autoload 에 관한 설정이 추가되어야 한다. 이 부분은 나중에 다루자.
composer require : 의존성 라이브러리 추가
이제 https://packagist.org/ 의 수많은 라이브러리 들 중에서 내게 필요한 것을 찾아 설치해 보자.
예제로 설치해 볼 라이브러리는 https://packagist.org/packages/league/flysystem 이다.
이 라이브러리는 다양한 종류의 파일시스템을 하나의 API로 사용할 수 있도록 하는데 목표를 둔 라이브러리로, 링크를 읽어보면 알겠지만 이미 수많은 유명한 프로젝트들에서 사용되고 있는 라이브러리이다.
이제 composer 에게 이 라이브러리가 필요하다고 알려주자.
실행은 언제나 project root 에서 한다.
>composer require league/flysystem
Using version ^1.0 for league/flysystem # 1.0이상, 2.0 미만의 버전이 사용된다.
./composer.json has been updated # composer.json 이 수정된다
Loading composer repositories with package information # 라이브러리 저장소를 불러온다
Updating dependencies (including require-dev) # 개발용을 포함하여 이 라이브러리가 자체적으로 사용하고 있는 의존성 라이브러리들을 업데이트한다
Package operations: 1 install, 0 updates, 0 removals
- Installing league/flysystem (1.0.69): Downloading (100%)
# 아래는 어떤 상황에서는 어떤 라이브러리들을 더 추가해 쓰라고 안내해주는 문구이다
league/flysystem suggests installing league/flysystem-eventable-filesystem (Allows you to use EventableFilesystem)
league/flysystem suggests installing league/flysystem-rackspace (Allows you to use Rackspace Cloud Files)
league/flysystem suggests installing league/flysystem-azure (Allows you to use Windows Azure Blob storage)
league/flysystem suggests installing league/flysystem-webdav (Allows you to use WebDAV storage)
league/flysystem suggests installing league/flysystem-aws-s3-v2 (Allows you to use S3 storage with AWS SDK v2)
league/flysystem suggests installing league/flysystem-aws-s3-v3 (Allows you to use S3 storage with AWS SDK v3)
league/flysystem suggests installing spatie/flysystem-dropbox (Allows you to use Dropbox storage)
league/flysystem suggests installing srmklive/flysystem-dropbox-v2 (Allows you to use Dropbox storage for PHP 5 applications)
league/flysystem suggests installing league/flysystem-cached-adapter (Flysystem adapter decorator for metadata caching)
league/flysystem suggests installing league/flysystem-sftp (Allows you to use SFTP server storage via phpseclib)
league/flysystem suggests installing league/flysystem-ziparchive (Allows you to use ZipArchive adapter)
Writing lock file # composer.lock 파일을 생성한다.
Generating autoload files # 새 라이브러리가 설치되었으므로 autoloader 를 갱신한다.
이제 vendor 디렉토리 밑에는 league 라는 디렉토리가 추가로 생성되었고, 그 밑에 flysystem 이라는 디렉토리와 라이브러리 파일들이 설치되었다.
근데, flysystem 디렉토리 밑에도 composer.json 이 보인다. 이는 league/flysystem 자체도 composer 하에서 관리되는 것이기 때문으로 모든 설치되는 라이브러리들은 동일한 구성을 가지게 된다.
'PHP' 카테고리의 다른 글
composer (6) 추천 패키지 소개 (0) | 2020.05.30 |
---|---|
composer (5) composer.json (0) | 2020.05.29 |
composer (4) 자주 사용하는 커맨드 와 composer.json, composer.lock (0) | 2020.05.24 |
composer (2) 설치 (0) | 2020.05.23 |
composer (1) 기본개념 (0) | 2020.05.17 |