Compositore: come posso installare un'altra dipendenza senza aggiornare quelle vecchie?


196

Ho un progetto con alcune dipendenze e vorrei installarne un altro, ma vorrei mantenere gli altri così come sono. Quindi ho modificato il composer.json, ma se corro composer install, ottengo il seguente output:

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.

Prima di tutto, ho installato mcrypt, quindi non so perché ci si sta lamentando.

Quindi, come posso installare questa nuova dipendenza?

My 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"
}

1
L'avviso mcrypt potrebbe provenire da più installazioni php ... il php con estensione mcrypt potrebbe non essere la stessa installazione del tuo php-cli
Matthemattics,

Risposte:


294

Per installare un nuovo pacchetto e solo quello, hai due opzioni:

  1. Utilizzando il requirecomando, basta eseguire:

    composer require new/package
    

    Composer indovina il vincolo della versione migliore da utilizzare, installa il pacchetto e lo aggiunge composer.lock.

    È inoltre possibile specificare un vincolo di versione esplicito eseguendo:

    composer require new/package ~2.5
    

-O-

  1. Utilizzando il updatecomando, aggiungi manualmente il nuovo pacchetto composer.json, quindi esegui:

    composer update new/package
    

Se Composer si lamenta, dichiarando "I tuoi requisiti non possono essere risolti in un set installabile di pacchetti", puoi risolverlo passando il flag --with-dependencies. Ciò consentirà di inserire nella whitelist tutte le dipendenze del pacchetto che si sta tentando di installare / aggiornare (ma nessuna delle altre dipendenze).

Per quanto riguarda i problemi di chi pone domande con Laravel e mcrypt: verifica che sia abilitato correttamente nella tua CLI php.ini. Se php -mnon elenca mcrypt, manca.

Importante: non dimenticare di specificare new/packagequando si utilizza composer update! Se si omette tale argomento, tutte le dipendenze composer.lockverranno aggiornate.


3
Ho ricevuto il messaggio "Il pacchetto [...] elencato per l'aggiornamento non è installato. Ignorando."
Gerry,

12
Questo non funziona per me. Mi viene detto che il pacchetto "x / y" elencato per l'aggiornamento non è installato. Ignorando "e poi si aggiorna tutto. Quindi non installa il nuovo pacchetto che voglio e aggiorna tutto il resto, che è esattamente l'opposto di quello che voglio.
tremby,

3
Semplicemente non funziona. "I tuoi requisiti non possono essere risolti in un set di pacchetti installabili." (e testo su alcuni vecchi pacchetti, non correlati affatto a cui chiedo) quando chiedo basta aggiornare un pacchetto.
OZ_

@tremby Funziona bene qui. Forse hai dimenticato di aggiungere "new/package" : "*",nella "require"sezione composer.json ?
Potherca,

@OZ_ Anche se deve essere installata una sola dipendenza, deve comunque essere risolta prima per assicurarsi che non sia in conflitto con le altre dipendenze.
Potherca,

31

In realtà, la soluzione corretta è:

composer require vendor/package

Tratto dalla documentazione della CLI per Composer :

Il requirecomando aggiunge nuovi pacchetti al composer.jsonfile dalla directory corrente.

php composer.phar require

Dopo aver aggiunto / modificato i requisiti, i requisiti modificati verranno installati o aggiornati.

Se non si desidera scegliere i requisiti in modo interattivo, è sufficiente passarli al comando.

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

Mentre è vero che composer updateinstalla nuovi pacchetti trovati in composer.json, aggiornerà anche il file composer.lock e tutti i pacchetti installati secondo qualsiasi logica fuzzy ( >o *caratteri dopo i due punti) trovati in composer.json! Questo può essere evitato usando composer update vendor/package, ma non consiglierei di prenderne l'abitudine, poiché sei un argomento dimenticato lontano da un progetto potenzialmente rotto ...

Mantieni le cose sane e resta fedele con l' composer require vendor/packageaggiunta di nuove dipendenze! 😉


Ma usando composer requireaggiorna il file composer.lock?
Phil,

2

Il mio caso d'uso è più semplice e si adatta semplicemente al tuo titolo ma non ai tuoi ulteriori dettagli.

Cioè, voglio installare un nuovo pacchetto che non è ancora nel mio composer.jsonsenza aggiornare tutti gli altri pacchetti.

La soluzione qui è composer require x/y


1

Nel mio caso, ho avuto un repository con:

  • requisiti A, B, C, D in .json
  • ma solo A, B, C in .lock

Nel frattempo, A, B, C avevano versioni più recenti rispetto a quando veniva generato il blocco.

Per qualche motivo, ho eliminato i "fornitori" e volevo fare un composer installe fallito con il messaggio:

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.

Ho provato a eseguire la soluzione da Seldaek pubblicando un composer update vendorD/libraryDma il compositore ha insistito per aggiornare più cose, quindi.lock anche il mio strumento git aveva visto troppi cambiamenti.

La soluzione che ho usato era:

  1. Elimina tutto il vendorsdir.
  2. Rimuovere temporaneamente il requisito VendorD/LibraryDdal .json.
  3. corri composer install.
  4. Quindi elimina il file .jsoned esegui nuovamente il checkout dal repository (equivale a aggiungere nuovamente il file, evitando possibili modifiche agli spazi bianchi).
  5. Quindi eseguire la soluzione di Seldaek composer update vendorD/libraryD

Ha installato la libreria, ma inoltre, gitdiff mi ha mostrato che .locksolo le nuove cose sono state aggiunte senza modificare le altre.

(Thnx Seldaek per il puntatore;))


è eccessivo. basta eliminare il file di blocco ed eseguire l'installazione di Composer. funziona
astroanu il

6
Questo è vero per gli ambienti non professionali, dove puoi ricostruire felicemente le dipendenze e se qualcosa si rompe vai a ripararlo. Ma se per te, i server che falliscono significano che perdi $ 10.000 all'ora, allora non dubiti che composer.locknon dovrebbero mai essere felicemente cancellati e ricostruiti. .lockè ... per bloccare !! ; D - altrimenti il ​​file di blocco sarebbe inutile e non lo commetterebbe o non esisterebbe affatto. Se corri in un'azienda orientata alla qualità e ricostruisci e commetti un blocco con diciamo 1.000 dipendenze, tutte cambieranno e le persone del QA verranno a ucciderti ahahah.
Xavi Montero,

2
Ehi @astroanu solo per chiarire che se hai installato una dipendenza in una data precedente e alcune delle sue dipendenze stavano prendendo l'ultima versione di dev master, ci potrebbero essere problemi significativi nella semplice eliminazione di composer.lock e nel colpire semplicemente install. Se non hai avuto l'opportunità di verificare l'impatto dell'introduzione di una dipendenza, allora c'è il potenziale per risultati imprevisti e la possibilità di creare un'esperienza negativa per gli utenti.
dkcwd,

naturalmente, l'eliminazione del file di blocco e l'esecuzione dell'installazione / aggiornamento o l'esecuzione dell'aggiornamento anche senza eliminare il file di blocco influiranno sulla stabilità delle applicazioni. L'aggiornamento del compositore deve essere eseguito solo nell'ambiente di sviluppo. In produzione, utilizzare sempre l'installazione del compositore perché la build di produzione viene testata rispetto a ciò che è salvato nel file di blocco.
astroanu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.