Composer : 이전 종속성을 업데이트하지 않고 다른 종속성을 설치하려면 어떻게해야합니까?


196

몇 가지 종속성이있는 프로젝트가 있고 다른 프로젝트를 설치하고 싶지만 다른 프로젝트를 그대로 유지하고 싶습니다. 그래서를 편집 composer.json했지만 실행 composer install하면 다음과 같은 출력이 나타납니다.

Installing dependencies 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.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

우선, 나는 mcrypt가 설치되어 있기 때문에 그것이 거기에 대해 왜 불평하는지 모르겠습니다.

그렇다면이 새로운 의존성을 어떻게 설치할 수 있습니까?

내 작곡가 .json :

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}

1
mcrypt 경고는 여러 PHP 설치에서 나올 수 있습니다 ... mcrypt 확장명을 가진 php는 php-cli와 동일한 설치가 아닐 수 있습니다
Matthemattics

답변:


294

새 패키지를 설치하기 위해서는 두 가지 옵션이 있습니다.

  1. require명령을 사용하여 다음을 실행하십시오.

    composer require new/package
    

    Composer는 사용할 최상의 버전 제약 조건을 추측하고 패키지를 설치 한 다음에 추가합니다 composer.lock.

    다음을 실행하여 명시 적 버전 제약 조건을 지정할 수도 있습니다.

    composer require new/package ~2.5
    

-또는-

  1. update명령을 사용하여 에 새 패키지를 수동으로 추가 composer.json한 후 다음을 실행하십시오.

    composer update new/package
    

Composer가 "요구 사항을 설치 가능한 패키지 세트로 해석 할 수 없습니다."라는 메시지가 표시되면 플래그를 전달하여이를 해결할 수 있습니다 --with-dependencies. 설치 / 업데이트하려는 패키지의 모든 종속성이 허용되지만 다른 종속성은 허용되지 않습니다.

Laravel 및 mcrypt와 관련하여 asker의 문제에 관한 질문 : CLI php.ini에서 제대로 활성화되어 있는지 확인하십시오. 경우 php -mMcrypt 라이브러리를 나열하지 않습니다 그것은 실종.

중요 : !를 사용할 때 반드시 지정하십시오 . 이 인수를 생략하면 모든 종속성과을 (를) 업데이트하게됩니다.new/packagecomposer updatecomposer.lock


3
"업데이트 용으로 나열된 패키지 [...]이 (가) 설치되지 않았습니다. 무시합니다."라는 메시지가 나타납니다.
Gerry

11
이것은 나를 위해 작동하지 않습니다. 업데이트 용으로 나열된 '패키지 "x / y"가 설치되어 있지 않다는 메시지가 나타납니다. 무시하고 "모든 것을 업데이트합니다. 그래서 원하는 새 패키지를 설치하지 않고 다른 모든 것을 업데이트합니다. 이는 내가 원하는 것과 정확히 반대입니다.
tremby

3
작동하지 않습니다. "요구 사항을 설치 가능한 패키지 세트로 해결할 수 없습니다." (그리고 내가 요청한 것과 전혀 관련이없는 오래된 패키지에 관한 텍스트) 하나의 패키지 만 업데이트하도록 요청할 때.
OZ_

@tremby는 여기서 잘 작동합니다. 아마 당신 "new/package" : "*",은 composer.json "require"섹션 에 추가 하는 것을 잊었 습니까?
Potherca

@OZ_ 하나의 종속성 만 설치 하더라도 다른 종속성과 충돌하지 않도록 먼저 해결 해야합니다.
Potherca

31

실제로 올바른 해결책은 다음과 같습니다.

composer require vendor/package

ComposerCLI 문서 에서 가져 왔습니다 .

require명령 composer.json은 현재 디렉토리에서 파일에 새 패키지를 추가합니다 .

php composer.phar require

요구 사항을 추가 / 변경 한 후 수정 된 요구 사항이 설치되거나 업데이트됩니다.

대화식으로 요구 사항을 선택하지 않으려면 요구 사항을 명령에 전달하면됩니다.

php composer.phar require vendor/package:2.* vendor/package2:dev-master

composer updatecomposer.json에있는 새 패키지 를 설치 하는 것이 사실이지만 composer.json 에있는 퍼지 논리 ( 또는 콜론 뒤의 문자) 에 따라 composer.lock 파일과 설치된 패키지도 업데이트합니다 ! 이것은을 사용하여 피할 수 있지만 잠재적으로 깨진 프로젝트에서 잊어 버린 논쟁이기 때문에 습관을 들이지 않는 것이 좋습니다 ...>*composer update vendor/package

composer require vendor/package새로운 의존성을 추가하기 위해 제정신을 유지하십시오 ! 😉


그러나 composer requirecomposer.lock 파일을 사용합니까?
Phil

2

내 유스 케이스는 더 단순하고 제목에 맞지만 세부 사항에는 맞지 않습니다.

composer.json, 다른 패키지를 모두 업데이트하지 않고 아직없는 새 패키지를 설치하고 싶습니다 .

여기에 해결책은 composer require x/y


1

제 경우에는 다음과 같은 저장소를 가졌습니다.

  • 요구 사항 A, B, C, D .json
  • 하지만 A, B, C 만 .lock

그 동안 A, B, C는 잠금 생성 시점과 관련하여 최신 버전을 사용했습니다.

어떤 이유로 나는 "공급 업체"를 삭제 composer install하고 메시지를 표시하고 실패했습니다.

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.
Your requirements could not be resolved to an installable set of packages.

Seldaek에서 솔루션을 실행하려고 composer update vendorD/libraryD했지만 작곡가가 더 많은 것을 업데이트해야한다고 주장 했으므로 .lock내 변경 도구가 너무 많이 변경되었습니다.

내가 사용한 솔루션은 다음과 같습니다.

  1. 모든 vendors디렉토리를 삭제하십시오 .
  2. 에서 요구 사항 VendorD/LibraryD을 일시적으로 제거합니다 .json.
  3. 을 실행하십시오 composer install.
  4. 그런 다음 파일을 삭제 .json하고 리포지토리 에서 파일 을 다시 체크 아웃 하십시오 (파일 을 다시 추가하는 것과 같지만 잠재적 인 공백 변경은 피함).
  5. 그런 다음 Seldaek의 솔루션을 실행하십시오. composer update vendorD/libraryD

그것은 라이브러리를 설치했지만, gitdiff는 .lock새로운 것들만 다른 것들을 편집하지 않고 추가 했다는 것을 보여주었습니다 .

(포인터에 대한 Thnx Seldaek;)


그것은 과잉입니다. 잠금 파일을 삭제하고 composer install을 실행하십시오. 그것은 작동
astroanu

6
이는 비 프로덕션 환경에서 그대로 유지되며, 의존성을 행복하게 재구성하고 문제가 발생하면 해결하고 해결할 수 있습니다. 그러나 서버 장애가 시간당 $ 10.000를 잃는다는 것을 의미한다면, 서버를 composer.lock행복하게 삭제하고 재 구축해서는 안된다는 것을 의심하지 않습니다 . .lock... 잠금입니다! ; D-그렇지 않으면 잠금 파일이 쓸모없고 커밋하지 않거나 전혀 존재하지 않습니다. 품질 지향적 인 회사에서 운영하고 1.000 종속성으로 잠금을 다시 구축하고 커밋하면 모두 변경되며 QA 직원이 하하하를 죽일 것입니다.
Xavi Montero

2
@astroanu 님은 이전에 종속성을 설치했고 일부 종속성이 최신 버전의 dev master를 가져간 경우 composer.lock을 삭제하고 설치를 누르는 데 중요한 문제가있을 수 있음을 분명히하기 위해 @astroanu입니다. 의존성 도입의 영향을 확인할 기회가 없다면 예기치 않은 결과가 발생하고 사용자에게 좋지 않은 경험이 발생할 수 있습니다.
dkcwd

물론 잠금 파일을 삭제하지 않고 잠금 파일을 삭제하고 설치 / 업데이트를 실행하거나 업데이트를 실행하면 응용 프로그램의 안정성에 영향을줍니다. 작성기 업데이트는 개발 환경에서만 실행해야합니다. 프로덕션 빌드는 잠금 파일에 저장된 내용에 대해 테스트되므로 프로덕션에서는 항상 composer 설치를 사용하십시오.
astroanu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.