2015-06-06 10 views
6

Sono confuso dal comportamento del compositore quando provo ad aggiornare un singolo pacchetto.composer.lock cambia nonostante "Niente da installare o aggiornare"

Per the docs e Stack Overflow risposte come this one, dovrei essere in grado di aggiornare un unico pacchetto con un comando come

composer update somevendor/somepackage 

La mia aspettativa quando faccio questo è che la mia cartella vendor e composer.lock dovrebbe essere lasciato invariato ad eccezione di somevendor/somepackage e delle sue dipendenze. Tuttavia, questo non è il caso. Invece, vedo gli hash di alcuni pacchetti non correlati a quello che sto modificando in composer.lock. Infatti, anche se cerco di aggiornare un pacchetto inesistente da schiacciare la tastiera:

composer update adsfiodfsa/dsafiodsafio 

... quindi anche se Compositore mi dice che non c'è niente da aggiornare:

$ composer update adsfiodfsa/dsafiodsafio 
Package "adsfiodfsa/dsafiodsafio" listed for update is not installed. Ignoring. 
Loading composer repositories with package information 
Updating dependencies (including require-dev) 
Nothing to install or update 
Writing lock file 
Generating autoload files 
Generating optimized class loader

... Vedo ancora che composer.lock è cambiato! Ancora più strana, la cartella /vendor (che ho aggiunto al mio repository Git per testare questo) non è stata modificata, anche se il file di blocco sembra sostenere che ora ho versioni diverse di alcuni pacchetti:

$ git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 
Changes not staged for commit: 
    (use "git add ..." to update what will be committed) 
    (use "git checkout -- ..." to discard changes in working directory) 

    modified: composer.lock 

no changes added to commit (use "git add" and/or "git commit -a")

È questo comportamento previsto o un bug? Se è corretto, qualcuno può spiegare perché il mio file composer.lock sta cambiando nonostante non venga aggiornato nulla? In caso aiuta, l'esecuzione di un git diff sul mio composer.lock dopo l'aggiornamento (che non modificare la cartella vendor) produce il seguente diff, che sembra affermare chiaramente che alcuni pacchetti sono cambiati:

diff --git a/composer.lock b/composer.lock 
index e2f65b9..e6c9a95 100644 
--- a/composer.lock 
+++ b/composer.lock 
@@ -1,7 +1,7 @@ 
{ 
    "_readme": [ 
     "This file locks the dependencies of your project to a known state", 
-  "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 
+  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 
     "This file is @generated automatically" 
    ], 
    "hash": "3d8098978270f73f9829e9d1138edef9", 
@@ -583,7 +583,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/doctrine/dbal/zipball/9e7954694971a5fab6ebabb38f9ffeec49d0d2ad", 
+    "url": "https://api.github.com/repos/doctrine/dbal/zipball/a0a43c0eb15ed66e71f8160b6bb25f4071ed22ca", 
       "reference": "9e7954694971a5fab6ebabb38f9ffeec49d0d2ad", 
       "shasum": "" 
      }, 
@@ -879,7 +879,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/firebase/firebase-token-generator-php/zipball/61691f56372d32515350dd5522c78be64a0e8d60", 
+    "url": "https://api.github.com/repos/firebase/firebase-token-generator-php/zipball/1044f9f5ec8b270dc6c073c7bf2fe67081dbfbb2", 
       "reference": "61691f56372d32515350dd5522c78be64a0e8d60", 
       "shasum": "" 
      }, 
@@ -1076,7 +1076,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", 
+    "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/9465032ac5d6beaa55f10923403e6e1c36018d9c", 
       "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", 
       "shasum": "" 
      }, 
@@ -1425,7 +1425,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bf2bff61743f20a13dc46ff1e3bbd0f19c997d2b", 
+    "url": "https://api.github.com/repos/Seldaek/monolog/zipball/77aef55318035d37dbd4e87ea0c37a191f3e766e", 
       "reference": "bf2bff61743f20a13dc46ff1e3bbd0f19c997d2b", 
       "shasum": "" 
      }, 
@@ -2027,7 +2027,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/php-fig/log/zipball/bf2c13de4300e227d7b2fd08027673a79c519987", 
+    "url": "https://api.github.com/repos/php-fig/log/zipball/9e45edca52cc9c954680072c93e621f8b71fab26", 
       "reference": "bf2c13de4300e227d7b2fd08027673a79c519987", 
       "shasum": "" 
      }, 
@@ -2211,7 +2211,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/ac8b475454c120bfb31f5bef475233dd4fb6b626", 
+    "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/21b7eb31c51d98e9da0543527a0242875f3d92b9", 
       "reference": "ac8b475454c120bfb31f5bef475233dd4fb6b626", 
       "shasum": "" 
      }, 
@@ -2744,7 +2744,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/7b1632cf2bdbc69c59a44942b70d5aae91034304", 
+    "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/31652385d94eafc2103a98435d6d5bd7eea61736", 
       "reference": "7b1632cf2bdbc69c59a44942b70d5aae91034304", 
       "shasum": "" 
      }, 
@@ -3405,7 +3405,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/phpspec/phpspec/zipball/73d0335bf8473be8bcfab5a9d66adce8d0db3857", 
+    "url": "https://api.github.com/repos/phpspec/phpspec/zipball/147ff359413be67781d1dd1f3be5d7a4d4af769a", 
       "reference": "73d0335bf8473be8bcfab5a9d66adce8d0db3857", 
       "shasum": "" 
      }, 
@@ -3483,7 +3483,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", 
+    "url": "https://api.github.com/repos/phpspec/prophecy/zipball/5a355f91730c845301a9e28f91c8a5053353c496", 
       "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", 
       "shasum": "" 
      }, 
@@ -3543,7 +3543,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9ef4b8cbf3e839a44a9b375d8c59e109ac7aa020", 
+    "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/688b6a58acb19c1899dc887b1efb6403dc6dc0bd", 
       "reference": "9ef4b8cbf3e839a44a9b375d8c59e109ac7aa020", 
       "shasum": "" 
      }, 
@@ -3861,7 +3861,7 @@ 
      }, 
      "dist": { 
       "type": "zip", 
-    "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/74ffb87f527f24616f72460e54b595f508dccb5c", 
+    "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5034a3d9f2057a7b7d6ad03a984509dadfdda3cc", 
       "reference": "74ffb87f527f24616f72460e54b595f508dccb5c", 
       "shasum": "" 
      }, 

risposta

1

La sezione readme indica che è stata aggiornata la versione del compositore poiché il file di blocco è stato creato causando l'aggiornamento dei metadati di base del blocco.

Il modo in cui la whitelist funziona con il programma di installazione è che ogni pacchetto che non è nella whitelist ha il vincolo aggiornato alla versione esatta installata.

Quindi, ciò che sta accadendo è che ogni pacchetto è tecnicamente considerato per l'installazione nel caso di pacchetti mancanti e per scoprire e risolvere correttamente le dipendenze dei pacchetti autorizzati. È come se avessi temporaneamente modificato il tuo composer.json in modo che fossero dichiarate versioni esplicite per ogni pacchetto che non hai autorizzato nella whitelist e un aggiornamento completo.

Quando il file di blocco viene rigenerato Composer\Package\Locker sarà iterare su tutti i pacchetti che sono stati considerati per l'installazione e passarli a Composer\Package\Dumper\ArrayDumper che sputare fuori i metadati source e dist per ogni pacchetto per creare l'output.

Quando i pacchetti vengono installati con un riferimento hash che equivale a qualcosa lungo le linee di #9e7954694971a5fab6ebabb38f9ffeec49d0d2ad per la versione. Come sottolinea lo stof in composer/composer#1458, la gestione degli hash espliciti per una versione viene eseguita a livello di installazione e non sa come generare un distro corretto per esso, che viene eseguito a livello di driver vcs.I metadati utilizzati per creare il dist URL per il file di blocco quando hash provengono da dev-master, motivo per cui gli URL api vengono aggiornati.

Il programma di installazione non utilizza il distur per installare il pacchetto, il distzzo utilizzato durante l'installazione proviene dal repository che fornisce il pacchetto nel pool utilizzato dal risolutore.

+0

https://github.com/composer/composer/issues/1458#issuecomment-18857768 sembra molto probabile che sia correlato al mio problema - mostra similmente il riferimento di 'dist e l'url' di una sincronizzazione senza una ovvio motivo - ma confesso che come qualcuno con una conoscenza di base del Composer gran parte della tua risposta - come la distinzione tra "livello installatore" e "livello driver vcs" - mi è passata per la testa. –

+0

Aggiungerò più dettagli in pochi. Risposta breve è l'URL non è importante. Viene ricostruito durante l'installazione in base al riferimento e alla classe che fornisce il pacchetto. È tuttavia confuso e fuorviante. –

+0

Esiste una soluzione ottimale o una soluzione alternativa per gestire questo tipo di modifica con il controllo della versione? Preferirei non inviare aggiornamenti di url per pacchetti diversi da quello che sto aggiornando/installando, ma non riesco a trovare un modo per far sì che il compositore non apporti le modifiche a composer.lock se qualche pacchetto vcs ha nuove versioni upstream. – tubes

Problemi correlati