Kompozytor: jak mogę zainstalować inną zależność bez aktualizacji starych?

196

Mam projekt z kilkoma zależnościami i chciałbym zainstalować inny, ale chciałbym, aby pozostałe były takie, jakie są. Więc edytowałem composer.json, ale jeśli uruchomię composer install, otrzymam następujące dane wyjściowe:

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.

Przede wszystkim mam zainstalowany mcrypt, więc nie wiem, dlaczego na to narzeka.

Jak mogę zainstalować tę nową zależność?

Mój composer.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"
}
dwoistość_
źródło
1
Ostrzeżenie mcrypt może pochodzić z wielu instalacji php… php z rozszerzeniem mcrypt może nie być taką samą instalacją jak php-cli
Matthemattics

Odpowiedzi:

293

Aby zainstalować nowy pakiet i tylko to, masz dwie opcje:

  1. Za pomocą requirepolecenia wystarczy uruchomić:

    composer require new/package
    

    Kompozytor odgadnie najlepsze ograniczenie wersji do użycia, zainstaluje pakiet i doda go composer.lock.

    Możesz również określić jawne ograniczenie wersji, uruchamiając:

    composer require new/package ~2.5
    

-LUB-

  1. Za pomocą updatepolecenia dodaj nowy pakiet ręcznie composer.json, a następnie uruchom:

    composer update new/package
    

Jeśli kompozytor narzeka, stwierdzając: „Nie można rozwiązać wymagań dotyczących instalowalnego zestawu pakietów.” Można to rozwiązać, przekazując flagę --with-dependencies. Spowoduje to dodanie do białej listy wszystkich zależności pakietu, który próbujesz zainstalować / zaktualizować (ale żadnych innych zależności).

Odnośnie problemów z pytającym z Laravelem i mcryptem: sprawdź, czy jest on poprawnie włączony w twoim CLI php.ini. Jeśli php -mnie ma na liście mcrypt, to go brakuje.

Ważne: nie zapomnij podać new/packagepodczas używania composer update! Pominięcie tego argumentu spowoduje, że wszystkie zależności, a także composer.lockzostaną zaktualizowane.

Seldaek
źródło
3
Otrzymałem komunikat „Pakiet [...] wymieniony do aktualizacji nie został zainstalowany. Ignorowanie”.
Gerry
11
To mi nie działa. Powiedziano mi, że „Pakiet” x / y wymieniony do aktualizacji nie jest zainstalowany. Ignorowanie. ”, A następnie chodzi o aktualizację wszystkiego. Więc nie instaluje nowego pakietu, którego chcę, i aktualizuje wszystko inne, co jest dokładnie przeciwne do tego, czego chcę.
tremby
3
To po prostu nie działa. „Twoje wymagania nie mogły zostać rozwiązane w instalowalnym zestawie pakietów.” (i tekst o niektórych starych pakietach, w ogóle niepowiązanych, o które pytam), kiedy poproszę o aktualizację jednego pakietu.
OZ_
@tremby Działa dobrze tutaj. Może zapomniałeś dodać sekcję "new/package" : "*",composer.json "require"?
Potherca
@OZ_ Nawet jeśli ma zostać zainstalowana tylko jedna zależność, nadal należy ją najpierw rozwiązać, aby upewnić się, że nie powoduje konfliktu z innymi zależnościami.
Potherca
30

Właściwie poprawne rozwiązanie to:

composer require vendor/package

Na podstawie dokumentacji CLI dla Composer :

requirePolecenie dodaje nowe pakiety do composer.jsonpliku z aktualnego katalogu.

php composer.phar require

Po dodaniu / zmianie wymagań zmodyfikowane wymagania zostaną zainstalowane lub zaktualizowane.

Jeśli nie chcesz wybierać wymagań interaktywnie, możesz po prostu przekazać je do polecenia.

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

Chociaż prawdą jest, że composer updateinstaluje nowe pakiety znalezione w composer.json, zaktualizuje również plik composer.lock i wszelkie zainstalowane pakiety zgodnie z dowolną logiką rozmytą ( >lub *znakami po dwukropkach) znalezionymi w composer.json! Można tego uniknąć, używając composer update vendor/package, ale nie polecam nawykania się, ponieważ jesteś jednym zapomnianym argumentem od potencjalnie zepsutego projektu…

Zachowaj rozsądek i trzymaj się przy composer require vendor/packagedodawaniu nowych zależności! 😉

Matematyka
źródło
Ale czy za pomocą composer requireaktualizacji plik composer.lock?
Phil
2

Mój przypadek użycia jest prostszy i pasuje do twojego tytułu, ale nie do dalszych szczegółów.

To znaczy, chcę zainstalować nowy pakiet, który nie jest jeszcze w moim pakiecie composer.jsonbez aktualizacji wszystkich innych pakietów.

Rozwiązaniem jest tutaj composer require x/y

drżenie
źródło
1

W moim przypadku miałem repozytorium z:

  • wymagania A, B, C, D w .json
  • ale tylko A, B, C w .lock

W międzyczasie A, B, C miały nowsze wersje w odniesieniu do momentu wygenerowania blokady.

Z jakiegoś powodu usunąłem „dostawców” i chciałem to zrobić, composer installa komunikat nie powiódł się:

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.

Próbowałem uruchomić rozwiązanie od Seldaek, wydając, composer update vendorD/libraryDale kompozytor nalegał, aby zaktualizować więcej rzeczy, więc .lockzbyt zmiany zobaczyły moje narzędzie git.

Zastosowałem rozwiązanie:

  1. Usuń cały vendorskatalog.
  2. Tymczasowo usuń wymaganie VendorD/LibraryDz .json.
  3. biegnij composer install.
  4. Następnie usuń plik .jsoni pobierz go ponownie z repozytorium (odpowiednik ponownego dodania pliku, ale unikając potencjalnych zmian białych znaków).
  5. Następnie uruchom rozwiązanie Seldaek composer update vendorD/libraryD

Zainstalował bibliotekę, ale oprócz tego gitdiff pokazał mi, że .locktylko w jednym nowe elementy zostały dodane bez edycji pozostałych.

(Thnx Seldaek dla wskaźnika;))

Xavi Montero
źródło
to przesada. po prostu usuń plik blokady i uruchom instalację kompozytora. to działa
astroanu
6
Tak jest w przypadku środowisk nieprofesjonalnych, w których można z radością odbudować zależności, a jeśli coś się zepsuje, możesz to naprawić. Ale jeśli dla Ciebie awarie serwerów oznaczają utratę 10 000 USD na godzinę, nie masz wątpliwości, że composer.locknigdy nie powinno być z radością usunięte i odbudowane. .lockjest ... do blokowania !! ; D - w przeciwnym razie plik blokady byłby bezużyteczny i nie zatwierdziłbyś go, albo w ogóle by nie istniał. Jeśli działasz w firmie zorientowanej na jakość i przebudowujesz i blokujesz z powiedzmy 1000 zależności, wszystkie one się zmienią, a ludzie QA przyjdą cię zabić hahaha.
Xavi Montero
2
Hej @astroanu, aby wyjaśnić, że jeśli wcześniej zainstalowałeś zależność, a niektóre z jej zależności pobierały najnowszą wersję dev master, mogą wystąpić poważne problemy z usunięciem pliku composer.lock i uruchomieniem instalacji. Jeśli nie miałeś okazji zweryfikować wpływu wprowadzenia zależności, istnieje ryzyko nieoczekiwanych wyników i być może niekorzystnego wpływu na użytkowników.
dkcwd
oczywiście usunięcie pliku blokady i uruchomienie instalacji / aktualizacji lub uruchomienie aktualizacji nawet bez usuwania pliku blokady wpłynie na stabilność aplikacji. Aktualizacja kompozytora powinna być uruchamiana tylko w środowisku deweloperskim. Podczas produkcji zawsze używaj instalacji kompozytora, ponieważ wersja produkcyjna jest testowana pod kątem zawartości zapisanej w pliku blokady.
astroanu