composer.json에서 require와 require-dev 섹션의 차이점은 무엇입니까?


102

저는 composer를 사용하기 시작했습니다. 저는 그것에 대해 거의 알지 못하며 웹 애플리케이션 개발에 대한 경험이 거의 없습니다.

Nettuts + Tutorial살펴 보았 기 때문에 작곡가에 대한 기본적인 질문이 있습니다.

{
  "require": {
    "laravel/framework": "4.0.*",
    "way/generators": "dev-master",
    "twitter/bootstrap": "dev-master",
    "conarwelsh/mustache-l4": "dev-master"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "mockery/mockery": "0.7.*"
  },
  "autoload": {
    "classmap": [
      "app/commands",
      "app/controllers",
      "app/models",
      "app/database/migrations",
      "app/database/seeds",
      "app/tests/TestCase.php"
    ]
  },
  "scripts": {
    "post-update-cmd": "php artisan optimize"
  },
  "minimum-stability": "dev"
}
  1. "require-dev"부분적으로 나타나는 것은 무엇이든 composer install --dev? 로만 다운로드 및 설치됩니다 .
  2. 작곡가의 문서 일부를 읽었지만 여전히 우리가 "require-dev"참여한 이유가 무엇인지 이해하지 못 합니까? 항상 최신 안정 버전을 얻기보다는 특정 버전 의 패키지 를 얻고 싶기 때문 입니까?

답변:


121

다른 환경

일반적으로 소프트웨어는 다른 환경에서 실행됩니다.

  • development
  • testing
  • staging
  • production

서로 다른 환경에서 서로 다른 종속성

require섹션 에서 선언 된 composer.json종속성은 일반적으로 응용 프로그램이나 패키지를 실행하는 데 필요한 종속성입니다.

  • staging
  • production

반면 require-dev섹션 에서 선언 된 종속성은 일반적으로

  • developing
  • testing

환경.

예를 들어, 실제로 응용 프로그램을 실행하는 데 사용되는 패키지 외에도 다음과 같은 소프트웨어 개발을 위해 패키지가 필요할 수 있습니다.

  • friendsofphp/php-cs-fixer (코딩 스타일 문제 감지 및 수정)
  • squizlabs/php_codesniffer (코딩 스타일 문제 감지 및 수정)
  • phpunit/phpunit (테스트를 사용하여 개발 추진)
  • 기타

전개

이제 developmenttesting환경에서 일반적으로

$ composer install

productiondevelopment종속성을 모두 설치합니다 .

그러나 stagingproduction환경에서는 응용 프로그램 실행에 필요한 종속성 만 설치하고 배포 프로세스의 일부로 일반적으로 다음을 실행합니다.

$ composer install --no-dev

production종속성 만 설치합니다 .

의미론

즉, 섹션

  • require
  • require-dev

composer실행할 때 설치해야하는 패키지 표시

$ composer install

또는

$ composer install --no-dev

그게 다입니다.

참고 애플리케이션 또는 패키지가 의존하는 패키지의 개발 종속성은 절대 설치되지 않습니다.

참고로 다음을 참조하십시오.


vendorFTP를 통해 전체 폴더를 업로드하여 "배포"하면 전혀 문제가되지 않는다는 것을 올바르게 이해하고 있습니까?
pilat

2
@pilat 할 수 있지만 —no-dev. 또한 FTP는 아마도 상당히 느릴 것입니다.
localheinz

애플리케이션을 빌드하는 데 필요한 종속성은 어떻습니까? 따라서 빌드 및 배포 파이프 라인에서 빌드를 위해 설치 한 다음 배포하기 전에 다시 제거하고 싶습니다. 예를 들어 축소 또는 LESS / SASS를 CSS로 전환합니다. 어떻게 하시겠습니까?
Richard Kiefer

1
@RichardKiefer 어떤 사람들은 phar.io를 사용 하고 다른 사람들은 PHARs 를 체크인하지만 다른 사람들은 Docker 이미지를 사용하며 어떤 사람들은 별도의 이미지를 사용합니다 composer.json-예를 들어 github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz

그렇다면 composer.json 만 커밋하고 저장소에 고정 하시겠습니까? 모든 것을 커밋하고 배포하려면 git을 사용하여 프로덕션에서 마스터 브랜치를 가져 오는 것이 더 합리적이지 않습니까?
mbomb007

62
  1. 작곡가 매뉴얼 에 따르면 :

    require-dev (루트 전용)

    이 패키지를 개발하거나 테스트를 실행하는 데 필요한 패키지를 나열합니다. 루트 패키지의 개발 요구 사항은 기본적으로 설치됩니다. 둘 다 install또는 dev 종속성 설치를 방지 update하는 --no-dev옵션을 지원합니다 .

    따라서 실행 composer install하면 개발 종속성도 다운로드됩니다.

  2. 그 이유는 사실 아주 간단합니다. 특정 라이브러리에 기여할 때 테스트 스위트 또는 기타 개발 도구 (예 : 심포니)를 실행할 수 있습니다. 그러나이 라이브러리를 프로젝트에 설치하면 이러한 개발 종속성이 필요하지 않을 수 있습니다. 모든 프로젝트에 테스트 실행기가 필요한 것은 아닙니다.


19

작곡가 사이트에서 (충분히 명확합니다)

필요 #

이 패키지에 필요한 패키지를 나열합니다. 이러한 요구 사항이 충족되지 않으면 패키지가 설치되지 않습니다.

require-dev (루트 전용) #

이 패키지를 개발하거나 테스트를 실행하는 데 필요한 패키지를 나열합니다. 루트 패키지의 개발 요구 사항은 기본적으로 설치됩니다. 설치 또는 업데이트 모두 dev 종속성 설치를 방지하는 --no-dev 옵션을 지원합니다.

Composer에서 require-dev를 사용하면 프로젝트 개발 / 테스트에 필요하지만 프로덕션에는 필요하지 않은 종속성을 선언 할 수 있습니다. 프로젝트를 프로덕션 서버에 업로드하면 (git 사용) require-dev부분이 무시됩니다.

또한 게시 한이 답변 확인 저자이 게시물 은 물론입니다.


3
"way / generators": "dev-master"가 "require"섹션에있는 이유를 설명해주세요. 더 이상 프로덕션에 필요하지 않습니다.
Artisan

1
이것은 완전한 추측이지만 내가 생각할 수있는 유일한 것은 방식 / 발전기가 서비스 제공 업체로 추가되기 때문에 프로덕션 환경에서 누락되면 Laravel이 작동하지 않는다는 것입니다.
Daniel Hollands

2
부분 루트 패키지의 디바이스 요구 사항은 기본적으로 설치됩니다은 분명히 필요-DEV에서 depencies 심지어 프로덕션 서버에 설치되어있는 상태.
Gemmu

3
아이디어는 프로덕션에서 --no-dev 플래그를 사용한다는 것입니다.
John Pancoast 2015

2

섹션을 요구하는 이 섹션에서는 패키지 / 프로덕션 환경에 필요한 설치 될 더 나은 후보 / 있습니다 종속성이 포함되어 있습니다.

require-dev 섹션 : 이 섹션에는 개발자가 코드를 테스트하는 데 사용할 수있는 패키지 / 종속성이 포함되어 있습니다 (또는 로컬 컴퓨터에서 실험하고 이러한 패키지가 프로덕션 환경에 설치되는 것을 원하지 않음).


1

일반적인 규칙은 로컬 환경과 같은 개발 (dev) 환경에서만 require-dev 섹션의 패키지를 원한다는 것입니다.

의 패키지 가 필요-dev에 섹션 등 당신이 응용 프로그램을 디버깅 도움 패키지, 테스트를 실행하다

에서 준비생산 환경 당신은 아마에서 패키지 만 할 필요 절을 참조하십시오.

그러나 어쨌든 composer install --no-devcomposer update --no-dev 를 모든 환경에서 실행할 수 있으며 명령은 require-dev가 아닌 필수 섹션의 패키지 만 설치 하지만 스테이징프로덕션 에서만 실행하고 싶을 것입니다. 로컬이 아닌 환경.

이론적으로는 모든 패키지를 require 섹션 에 넣을 수 있으며 아무 일도 일어나지 않지만 다음과 같은 이유로 프로덕션 환경에서 패키지를 개발하고 싶지 않습니다.

  1. 속도
  2. 디버깅 정보 노출 가능성
  3. 기타

require-dev에 대한 좋은 후보 는 다음과 같습니다.

"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"

위의 패키지가 수행하는 작업을 볼 수 있으며 프로덕션에서 왜 필요하지 않은지 알 수 있습니다.

여기에서 더 많은 것을보십시오 : https://getcomposer.org/doc/04-schema.md


0

require-dev (루트 전용)에 유의하십시오. !

즉, require-dev 섹션은 패키지가 전체 프로젝트의 루트 일 때만 유효합니다. 즉 실행하면composer update 패키지 폴더에서 하는 .

자체 composer.json이있는 일부 주요 프로젝트 용 플러그인을 개발하는 경우 require-dev 섹션이 완전히 무시됩니다! 개발 종속성이 필요한 경우 require-dev 를 기본 프로젝트의 composer.json 으로 이동해야 합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.