Composer의 개발 / 생산 스위치를 사용할 때 올바르게 배포하는 방법은 무엇입니까?


180

Composer에는 개발 중에 만 여러 종속성을로드 할 수있는 옵션이 있으므로 프로덕션 환경 (라이브 서버)에 도구가 설치되지 않습니다. 이것은 이론적으로 테스트, 가짜 데이터 도구, 디버거 등과 같이 개발에만 의미가있는 스크립트에 매우 유용합니다.

가는 방법 require-dev은 개발자가 필요로하는 도구 로 추가 블록 을 추가하는 것입니다 .

"require-dev": {
    "codeception/codeception": "1.6.0.3"
}

그런 다음 이론적으로 이러한 종속성을로드합니다.

composer install --dev

문제 및 질문 :

작곡가의 동작을 변경 install하고 update극적으로 2013 년, require-dev-dependencies가 기본으로 설치되어있다 (!)에있어서 A composer.json 만들어 주시기 require-dev블록과 수행 composer install재현.

가장 널리 배포되는 방법은 작곡가를 밀어내는 것입니다. (현재 작곡가 설정을 보유한) lock을 만든 다음 composer install프로덕션 서버에서 작업 을 수행 하면 개발 항목도 설치됩니다.

-dev 의존성 설치 하지 않고 이것을 배포하는 올바른 방법은 무엇입니까 ?

참고 : 이상한 Composer 배포를 명확히하기 위해 여기에 표준 Q / A를 만들려고합니다. 이 질문을 자유롭게 편집하십시오.


@all : 현상금이 어디에 있는지 모르겠다 :( 나는 또 다른 접근법을 시작할 것이다.
Sliq

1
적극적으로 수여하지 않고 답변을받지 못하거나 충분한 투표를받지 못하면 현상금을받는 사람이 없습니다.
Sven

2
나는 개인적으로이 접근법을 전혀 좋아하지 않습니다. 은 composer.lock, 망할 놈의 repo에 결코 추가해서는 안됩니다. 올바른 접근 방식은 스테이징에서 composer 업데이트를 사용한 다음 파일을 프로덕션에 동기화하는 것입니다 (물론 모든 것이 작동하는 경우). 스테이징은 프로덕션 환경의 정확한 사본이어야합니다. composer.lock의 일부 여야합니다 .gitignore.
명사

6
composer.lock이 확실히 CSV에 포함되었습니다 !!! 모두가 같은 버전을 사용하도록하려면 어떻게해야합니까 ?? 따라서 CSV에서 composer.lock을 제외하지 마십시오!
Tobias Gaertner

3
@TobiasGaertner VCS (버전 제어 소프트웨어)를 의미한다고 생각하지만 그렇지 않으면 프로젝트의 공식 권장 사항 과 일치하고 정확 합니다 .
Xiong Chiamiov

답변:


327

오늘날 Composer가 --dev기본적으로 (설치 업데이트시) 플래그를 사용하는 이유는 IMHO 입니다. Composer는 주로 시나리오에서 원하는 동작으로 실행됩니다.

기본 Composer 워크 플로우는 다음과 같습니다.

  • composer.phar install --dev, json 및 lock 파일이 VCS에 커밋 된 새 프로젝트가 시작 됩니다.
  • 다른 개발자는 프로젝트 작업을 시작 : VCS의 체크 아웃하고 composer.phar install --dev.
  • 개발자는 dependancies : composer.phar require <package>를 추가 --dev합니다. require-dev섹션 에서 패키지를 원하면 추가 하십시오 (및 커밋).
  • (체크 아웃 등) : 다른 사람을 따라 간다 composer.phar install --dev.
  • 개발자는 최신 버전의 종속성 composer.phar update --dev <package>(및 커밋)을 원합니다 .
  • (체크 아웃 등) : 다른 사람을 따라 간다 composer.phar install --dev.
  • 프로젝트가 배포되었습니다 : composer.phar install --no-dev

보시다시피 --dev깃발은--no-dev , 특히 프로젝트에서 작업하는 개발자 수가 증가 할 때 플래그가 플래그 .

프로덕션 배포

"dev"의존성을 설치하지 않고 이것을 배포하는 올바른 방법은 무엇입니까?

composer.jsoncomposer.lock파일은 VCS에 커밋되어야합니다. composer.lock사용해야하는 패키지 버전에 대한 중요한 정보가 포함되어 있으므로 생략하지 마십시오 .

프로덕션 배포를 수행 할 때 --no-dev플래그를 Composer에 전달할 수 있습니다 .

composer.phar install --no-dev

composer.lock파일에는 dev-packages에 대한 정보가 포함될 수 있습니다. 이것은 중요하지 않습니다. 이 --no-dev플래그는 해당 개발 패키지가 설치되지 않았는지 확인합니다.

"프로덕션 배포"라고 말하면 프로덕션에서 사용되는 것을 목표로하는 배포를 의미합니다. composer.phar install프로덕션 서버에서 수행해야하는지 또는 검토 할 수있는 준비 서버에서 수행 해야하는지에 대해서는 논쟁하지 않습니다 . 이것이이 답변의 범위가 아닙니다. 나는 단지 방법을 지적하고있다.composer.phar install "dev"의존성을 설치하지 않고 .

주제를 벗어

--optimize-autoloader플래그는 생산에 바람직 할 수있다 (이것은 응용 프로그램에서 자동 로딩 속도가 빨라집니다 클래스 맵을 생성) :

composer.phar install --no-dev --optimize-autoloader

또는 자동 배포가 완료된 경우 :

composer.phar install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --no-suggest --optimize-autoloader

당신의 코드베이스가 지원하는 경우에, 당신은 밖으로 교환 수 --optimize-autoloader에 대해 --classmap-authoritative. 더 많은 정보는 여기에


5
한 가지 예외를 제외하고는 대부분의 내용에 동의합니다. "composer install --no-dev"는 준비 환경에서만 실행해야하며 해당 환경은 변경 불가능한 것으로 간주해야합니다. 프로덕션 서버에서 직접 다운로드하거나 미리보기 / 스테이징을 거치지 않고 종속성을 다운로드하고 싶지 않습니다. 그것은 약간의주의입니다.
확장 가능

3
@Scalable : 비록 당신에게 동의하지만 (그리고 Sven은 그의 대답에서 이것을 훌륭하게 다루고 있습니다), 그것은 내 대답의 범위가 아니며 "생산 배포"의 의미가 아닙니다. 나는 그것을 분명히하기 위해 단락을 추가했습니다.
Jasper N. Brouwer 8:25에

5
실제로 나는 기본값이 덜 위험한 옵션이어야한다고 생각합니다. --dev를 기본값으로 설정하고 실수로 프로덕션에서 작곡가 설치를하는 것은 치명적일 수 있습니다.
Hector Ordonez

3
의 좋은 지적 --optimize-autoloader. 참고 사항 --classmap-authoritative-여기 getcomposer.org/doc/03-cli.md 문서에서 다음을 볼 수 있습니다. "클래스 맵에서 클래스 자동로드 만. 암시 적으로 --optimize-autoloader를 활성화합니다." 클래스를 동적으로 생성하지 않으면 제품 환경에서 발생해야합니다.
Xavi Montero

6
큰 대답 optimize-autoloadercomposer.json다음 과 같이 직접 추가하는 것이 좋습니다 .{"config": { "optimize-autoloader": true } }
Yvan

79

실제로 프로덕션 서버에 종속성을 설치하는 것이 좋습니다.

권장 사항은 배포 컴퓨터에서 코드를 체크 아웃하고 필요에 따라 종속성을 설치 한 다음 (코드가 프로덕션 환경으로 갈 경우 개발자 종속성을 설치하지 않는 것을 포함) 모든 파일을 대상 컴퓨터로 옮기는 것이 좋습니다.

왜?

  • 공유 호스팅에서 명령 행에 도달하지 못할 수 있습니다.
  • 하더라도 PHP는 명령, 메모리 또는 네트워크 액세스 측면에서 제한 될 수 있습니다.
  • 저장소 CLI 도구 (Git, Svn)가 설치되지 않았을 수 있습니다. 잠금 파일이 해당 커밋을 ZIP으로 다운로드하는 대신 특정 커밋을 체크 아웃하는 종속성을 기록한 경우 실패합니다 (--prefer-source를 사용했거나 Composer가 그 버전을 얻는 다른 방법은 없습니다)
  • 프로덕션 머신이 소규모 테스트 서버와 비슷한 경우 (Amazon EC2 마이크로 인스턴스 생각) 실행할 메모리가 충분하지 않을 수 있습니다. composer install
  • 작곡가가 문제를 일으키지 않으면 서 작곡가 설치 단계에서 임의의 종속성을로드 할 수 없기 때문에 부분적으로 깨진 프로덕션 웹 사이트로 끝나는 것에 대해 어떻게 생각하십니까

간단히 말해 : 제어 할 수있는 환경에서 Composer를 사용하십시오. Composer를 작동하는 데 필요한 모든 것이 이미 있으므로 개발 시스템이 적합합니다.

-dev 의존성을 설치하지 않고 이것을 배포하는 올바른 방법은 무엇입니까?

사용할 명령은

composer install --no-dev

이것은 실제 환경에서 개발 요구 사항이 잘못 사용되었는지 확인하기 위해 마지막 검사를 수행해야하는 개발 서버 또는 프로덕션 서버 자체 또는 모든 환경에서 작동합니다.

이 명령은 composer.lock 파일에 선언 된 dev 요구 사항을 설치하거나 적극적으로 제거하지 않습니다.

프로덕션 서버에 개발 소프트웨어 구성 요소를 배포하는 데 신경 쓰지 않으면 실행 composer install은 동일한 작업을 수행하지만 이동하는 바이트 수를 늘리고 더 큰 자동 로더 선언을 만듭니다.


14
흥미로운 워크 플로우이지만 큰 단점이 있습니다 . 리포지토리에는 공급 업체 폴더 / 컨텐츠 자체 (Composer 페이지의 공식 설명)가 포함되어서는 안되므로 git 기반 배포 (공통 표준 afaik, 틀 렸으면 말해줘). 따라서 기본적으로 위의 솔루션은 "오래된"FTP 배포에서만 작동합니다!? 이것에 대해 더 논의 해 봅시다 ...
Sliq

17
내가 제안한 워크 플로에는 GIT를 통해 코드를 프로덕션 서버로 푸시하는 작업이 포함되어 있지 않습니다. 실제로 프로덕션 서버에 Composer 종속성을 설치해야하므로 여러 가지 문제가 발생할 수 있으므로 권장하지 않습니다. 배포를 원활하게 실행하려면 현재 버전을 삭제하고 교체하기 전에 응용 프로그램을 실행하는 데 필요한 모든 코드를 어셈블해야합니다. FTP를 좋아하지 않습니까? SSH를 통해 RSync 한 다음 심볼릭 링크를 뒤집어 버전을 전환하십시오. 그러나 원하는 경우 제품을 푸시, 체크 아웃 및 작성기를 설치할 수도 있습니다.
Sven

2
@Panique : 귀하의 의견의 일부를 보았습니다. "git 기반 배포 (일반적인 표준 afaik입니다. 잘못된 경우 수정))로 프로덕션에 푸시했습니다."-아니요,이 일반적인 표준이 아닙니다. 그것을하는 한 가지 방법 일뿐입니다.
Sven

1
내가 지금있는 팀은이 작업을 워크 플로에 성공적으로 통합했습니다. 우리는 다음과 같은 빌드 머신 (Jenkins, 물론)을 가지고 있습니다 : 1) SC에서 체크 아웃 2) composer 설치 / 업데이트 실행 3) 단위 테스트 실행 4) dev 종속성 제거 5) phar 파일 생성 app-1.34.phar등 별도의 메커니즘이 있으며 해당 파일을 언제 가져올 지, 어디로 전송할 것인지, 무엇을해야 할지를 결정합니다. 일부 팀은 서버에 일단 phar가 풀리도록 선택하고 일부 팀은 그대로 실행합니다. 배포의 안정성과 재현성에 대해 많은 확신을 가지고 있습니다.
Josh Johnson

3
이 답변에 100 % 동의합니다. Composer는 배포 서버 나 git에 설치해서는 안됩니다. 지속적인 배포 / 통합 서버는 소스 및 종속성 가져 오기를 정확하게 관리해야합니다. git pull> composer install> deploy
Eric MORAND

4

이제 require-dev기본적으로 활성화되어 지역 발전을 위해 당신이 할 수 composer installcomposer update포함하지 않는 --dev옵션을 선택합니다.

프로덕션에 배포하려면 composer.lock에서 제공 한 패키지가 없는지 확인해야합니다 require-dev.

당신은 이것을 할 수 있습니다

composer update --no-dev

로컬에서 테스트 한 후에는에 --no-dev모든 것을 프로덕션에 배포하고에 따라 설치할 수 있습니다 composer.lock. --no-dev여기서 다시 옵션 이 필요합니다 . 그렇지 않으면 작곡가에 "잠금 파일에 require-dev 정보가 없습니다"라고 표시 됩니다.

composer install --no-dev

참고 : 개발자와 프로덕션간에 차이가 생길 수있는 모든 것에주의하십시오! 개발자 도구를 포함시키는 것이 큰 오버 헤드가 아니기 때문에 일반적으로 가능한 경우 require-dev를 피하려고합니다.


1
이것은 실제로 세부 사항에서 잘못되었습니다. composer.lock개발 종속성 을 확인할 필요가 없습니다 . 간단하게 실행 composer install --no-dev하면 일반 종속성 만 설치됩니다. 실제로 Composer는이 단계에서 모든 dev 종속성을 제거합니다.
Sven

내 지역 composer.lock에 dev 의존성이 있고 잠재적으로 비 dev 패키지 버전에 영향을 미친다면 프로덕션 환경에 반영하기 위해 업데이트하고 싶습니다. 또한 오류 composer install --no-dev와 같이 프로덕션 환경에서 실행해야합니다 composer install. 기술적으로는 당신이 옳다고 생각합니다. 이것은 필수는 아니지만 추가 안전 수준입니다.
dave1010

좋습니다, 데모 시나리오 : 앱에는 dev/tool및이 필요합니다 prod/lib:~1.0. 최신 prod / lib는 1.3이지만 dev / tool에도 필요합니다 prod/lib:1.1.*. 결과 : 버전 1.1.9 (최신 1.1.x 지점)를 설치하고 개발 중에 사용합니다. 그냥 업데이트하는 것이 안전하지 --no-dev않으므로 최신 prod / lib 1.3을 포함하고 모든 것이 테스트없이 작동한다고 가정합니다. 그리고 dev / tool이 없기 때문에 테스트가 불가능할 수도 있습니다. 프로덕션에서는 dev / tool이 필요하지 않기 때문에 롤아웃해서는 안되지만 소프트웨어는 prod / lib 1.1.9를 사용해야합니다.
Sven

사용하는 경우 --no-dev답변에서 언급 한 것처럼 로컬에서 테스트해야합니다. 그래도 전혀 사용하지 않는 것이 좋습니다 --no-dev.
dave1010

따라서 기본적으로 다음과 같이 제안합니다. composer update, 그런 다음 개발을 수행 composer update --no-dev한 다음 수행을 수행 한 다음 릴리스 테스트를 수행 한 다음 생산을 진행하고 수행 composer install --no-dev합니다. 두 가지 문제 : 1. 개발자 종속성없이 릴리스를 테스트 할 수 없으며, 2. 프로덕션에서 Git과 같은 방식으로 설치할 수 없습니다.
Sven

3

프로덕션 서버에서는로 이름 vendor을 바꾸고 vendor-<datetime>배포하는 동안 두 개의 공급 업체 디렉토리가 있습니다.

HTTP 쿠키는 시스템이 새로운 공급 업체를 선택하게합니다 autoload.php 테스트 후 모든 미래 요청에 대해 이전 공급 업체 디렉토리를 비활성화하기 위해 완전히 원자 / 순간 전환을 수행 한 다음 며칠 후에 이전 디렉토리를 삭제합니다.

이것은 아파치 / PHP에서 사용중인 파일 시스템 캐시로 인한 문제를 피하고 활성 PHP 코드가 이전 공급 업체 디렉토리를 계속 사용할 수있게합니다.


그것에 대해 추천하는 다른 답변에도 불구하고, 나는 개인적으로 달려 composer install , 서버에서 . 이는 내 준비 영역 (노트북의 VM)에서 rsync보다 빠르기 때문입니다.

사용 --no-dev --no-scripts --optimize-autoloader합니다. 각 문서에 대한 문서를 읽고 이것이 환경에 적합한 지 확인해야합니다.


2

프로세스를 자동화하는 것이 좋습니다.

git 저장소에 composer.lock 파일을 추가하고 composer.phar install --no-dev 를 사용하십시오 릴리스 할 때 . 그러나 dev 시스템에서는 composer 명령을 걱정하지 않고 사용할 수 있습니다. 이는 프로덕션으로 이동하지 않습니다. 프로덕션은 잠금 파일에서 해당 종속성을 기반으로합니다.

테스트가 통과되면 서버에서이 특정 버전 또는 레이블을 체크 아웃하고 앱을 교체하기 전에 모든 테스트를 실행하십시오.

테스트가 개발자 종속성에 의존하는 경우, composer에 테스트 범위 종속성이 없기 때문에 개발에 의존하지 않는 솔루션 ( composer.phar install )으로 공급 업체 라이브러리를 제거하고 composer.phar install- -no-dev 다시 캐시 된 종속성을 사용하므로 더 빠릅니다. 그러나 다른 빌드 도구에서 범위 개념을 알고 있다면 그것은 해킹입니다.

이것을 자동화하고 나머지를 잊고 맥주를 마시십시오 :-)

추신 : @Sven 주석 아래에서와 같이 composer.lock 파일을 체크 아웃하지 않는 것이 좋습니다. 이는 composer 설치가 composer 업데이트로 작동하기 때문입니다.

http://deployer.org/를 사용 하여 자동화를 수행 할 수 있습니다. 간단한 도구입니다.


2
커밋 및 체크 아웃되지 composer.lockcomposer install처럼 행동을 composer update. 따라서 배포 한 버전은 개발 한 버전이 아닙니다. 이로 인해 문제가 발생할 가능성이 있습니다 (Composer에서 "바꾸기"로 최근에 해결 된 유일한 보안 문제에 비추어 볼 때 더욱 그렇습니다). composer update아무 것도 깨지 않았 음을 확인하지 않고 무인으로 실행해서는 안됩니다 .
Sven

1
@Sven은 배포 전에 단위 테스트를 자동으로 실행하는 동일한 주석의 제안입니다. 그러나 당신은 옳습니다, 어쨌든 composer.lock 파일을 유지하는 것이 좋습니다.
Giovanni Silva

이제 당신이 설명해야 할 유일한 것은 : PHPUnit과 같은 개발자 의존성없이 서버에서 테스트를 어떻게 실행합니까?
Sven

의존성, 테스트 및 배포가 Java Gradle 또는 SBT 또는 Maven과 같은 하나의 도구에 함께 배치 된 경우 매우 좋을 것입니다 (maven은 그렇게 좋지 않습니다). 작곡가 phpunit과 배포가 함께 작동하도록하는 하나의 PHP 도구. 또는 Gradle 또는 Scala SBT 플러그인 조차도이 작업을 수행 할 수 있습니다. 무제한 빌드 도구이므로 플러그인은 Javascript 최소화 및 sass 컴파일, CSS 최소화와 같은 자산과 함께 작동 할 수도 있습니다. 누군가 뭔가 알아?
Giovanni Silva

1
물론 이것은 실제 환경을 테스트하기 위해 서버에서 수행되지만 사이트 vhost에서 직접하지는 않습니다. 별도의 임시 폴더 에서이 작업을 수행하고 성공하면 결과를 가상 호스트로 옮길 수 있습니다.
Giovanni Silva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.