diff --git a/core/composer.json b/core/composer.json index 78ef4f7..dde4d9c 100644 --- a/core/composer.json +++ b/core/composer.json @@ -149,6 +149,9 @@ }, "scripts": { "pre-autoload-dump": "Drupal\\Core\\Composer\\Composer::preAutoloadDump", - "post-autoload-dump": "Drupal\\Core\\Composer\\Composer::ensureHtaccess" + "post-autoload-dump": [ + "Drupal\\Core\\Composer\\Composer::dumpDeploymentIdentifier", + "Drupal\\Core\\Composer\\Composer::ensureHtaccess" + ] } } diff --git a/core/lib/Drupal/Core/Composer/Composer.php b/core/lib/Drupal/Core/Composer/Composer.php index 12164c3..c901f56 100644 --- a/core/lib/Drupal/Core/Composer/Composer.php +++ b/core/lib/Drupal/Core/Composer/Composer.php @@ -24,6 +24,9 @@ public static function preAutoloadDump(Event $event) { $composer = $event->getComposer(); $package = $composer->getPackage(); $autoload = $package->getAutoload(); + $autoload['files'] = array_merge($autoload['files'], [ + 'vendor/DeploymentIdentifier.php' + ]); $autoload['classmap'] = array_merge($autoload['classmap'], array( 'vendor/symfony/http-foundation/Request.php', 'vendor/symfony/http-foundation/ParameterBag.php', @@ -70,4 +73,46 @@ public static function ensureHtaccess(Event $event) { } } + /** + * Generates the DeploymentIdentifier class. + * + * This class has a method that will return an ID that matches a particular + * Composer installation. It is used to ensure that PHP opcode caches will be + * invalidated whenever the Composer dependencies change. + * + * @param \Composer\Script\Event $event + */ + public static function dumpDeploymentIdentifier(Event $event) { + $vendor_dir = $event->getComposer()->getConfig()->get('vendor-dir'); + $hash = $event->getComposer()->getLocker()->getLockData()['hash']; + + $lines = <<classLoader) && Settings::get('class_loader_auto_detect', TRUE) && function_exists('apc_fetch')) { + $identifier = new DeploymentIdentifier(); $prefix = Settings::getApcuPrefix('class_loader', $this->root); - $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $this->classLoader); + $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix . $identifier->getIdentifier(), $this->classLoader); $this->classLoader->unregister(); $apc_loader->register(); $this->classLoader = $apc_loader; diff --git a/core/tests/Drupal/Tests/Core/Composer/DeploymentIdentifierTest.php b/core/tests/Drupal/Tests/Core/Composer/DeploymentIdentifierTest.php new file mode 100644 index 0000000..cc781c6 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Composer/DeploymentIdentifierTest.php @@ -0,0 +1,25 @@ +root . '/core/composer.lock'), TRUE); + $identifier = new DeploymentIdentifier(); + $this->assertEquals($lock_file['hash'], $identifier->getIdentifier()); + } + +} diff --git a/core/vendor/DeploymentIdentifier.php b/core/vendor/DeploymentIdentifier.php new file mode 100644 index 0000000..afa5455 --- /dev/null +++ b/core/vendor/DeploymentIdentifier.php @@ -0,0 +1,24 @@ +