Browse Source

Force installs from lock to reinstall dev packages from the exact locked reference

Jordi Boggiano 13 năm trước cách đây
mục cha
commit
496188f714
2 tập tin đã thay đổi với 21 bổ sung1 xóa
  1. 20 0
      src/Composer/Command/InstallCommand.php
  2. 1 1
      src/Composer/Package/Locker.php

+ 20 - 0
src/Composer/Command/InstallCommand.php

@@ -113,6 +113,7 @@ EOT
         }
 
         // creating requirements request
+        $installFromLock = false;
         $request = new Request($pool);
         if ($update) {
             $io->write('<info>Updating dependencies</info>');
@@ -130,6 +131,7 @@ EOT
                 $request->install($link->getTarget(), $link->getConstraint());
             }
         } elseif ($composer->getLocker()->isLocked()) {
+            $installFromLock = true;
             $io->write('<info>Installing from lock file</info>');
 
             if (!$composer->getLocker()->isFresh()) {
@@ -196,7 +198,25 @@ EOT
             }
             if (!$dryRun) {
                 $eventDispatcher->dispatchPackageEvent(constant('Composer\Script\ScriptEvents::PRE_PACKAGE_'.strtoupper($operation->getJobType())), $operation);
+
+                // if installing from lock, restore dev packages' references to their locked state
+                if ($installFromLock) {
+                    $package = null;
+                    if ('update' === $operation->getJobType()) {
+                        $package = $operation->getTargetPackage();
+                    } elseif ('install' === $operation->getJobType()) {
+                        $package = $operation->getPackage();
+                    }
+                    if ($package && $package->isDev()) {
+                        foreach ($composer->getLocker()->getLockedPackages() as $lockedPackage) {
+                            if (!empty($lockedPackage['source_reference']) && strtolower($lockedPackage['package']) === $package->getName()) {
+                                $package->setSourceReference($lockedPackage['source_reference']);
+                            }
+                        }
+                    }
+                }
                 $installationManager->execute($operation);
+
                 $eventDispatcher->dispatchPackageEvent(constant('Composer\Script\ScriptEvents::POST_PACKAGE_'.strtoupper($operation->getJobType())), $operation);
             }
         }

+ 1 - 1
src/Composer/Package/Locker.php

@@ -119,7 +119,7 @@ class Locker
             $spec = array('package' => $name, 'version' => $version);
 
             if ($package->isDev()) {
-                $spec['reference'] = $package->getSourceReference();
+                $spec['source_reference'] = $package->getSourceReference();
             }
 
             $lock['packages'][] = $spec;