Summary
All the steps to update Drupal 8 under PHP Composer are:
$ cd <drupal-dir>
$ # check outdated php modules
$ php-7.3 /usr/local/libexec/composer.phar outdated "drupal/*"
$ # update app
$ php-7.3 /usr/local/libexec/composer.phar update
$ # prepare symbolic link of php executable
# ln -s /usr/local/bin/php-7.3 /usr/local/bin/php
$ # update database
$ ./vendor/bin/drush updatedb
$ # clear cache
$ ./vendor/bin/drush cr
$ # check the whole result
$ ./vendor/bin/drush status
$ # remove symbolic link of php executable
# rm /usr/local/bin/php
Points
- It is necessary to create
php
symbolic link forphp-7.x
executable in order to avoid the error "env: php: No such file or directory" at runningdrush
. - Don't use
pkg_add drush
becausedrush/drush
is already included as Drupal's "require" incomposer.json
. - Checking
drush status
finally is surely useful.
Tutorial
Case
8.7.7 -> 8.7.8
Get started
Go to the Drupal directory:
$ cd <drupal-dir>
Update app
First, check which modules of Drupal core are outdated:
$ php-7.3 /usr/local/libexec/composer.phar outdated "drupal/*"
The result was:
drupal/core 8.7.7 8.7.8 Drupal is an open source content management platform powering millions of ...
Besides, the command to check the overall modules is:
$ php-7.3 /usr/local/libexec/composer.phar outdated
The result was:
behat/mink-selenium2-driver dev-master 8684ee4 dev-master 3ab9f31 Selenium2 (WebDriver...
dflydev/dot-access-data v1.1.0 v2.0.0 Given a deep data st...
doctrine/annotations v1.7.0 v1.8.0 Docblock Annotations...
drupal/core 8.7.7 8.7.8 Drupal is an open so...
grasmash/yaml-expander 1.4.0 2.0.0 Expands internal pro...
instaclick/php-webdriver 1.4.5 1.4.6 PHP WebDriver for Se...
league/container 2.4.1 3.3.0 A fast and intuitive...
phar-io/manifest 1.0.1 1.0.3 Component for readin...
phar-io/version 1.0.1 2.0.1 Library for handling...
phpspec/prophecy 1.8.1 1.9.0 Highly opinionated m...
phpunit/php-code-coverage 5.3.2 7.0.8 Library that provide...
phpunit/php-file-iterator 1.4.5 2.0.2 FilterIterator imple...
phpunit/php-timer 1.0.9 2.1.2 Utility class for ti...
phpunit/php-token-stream 2.0.2 3.1.1 Wrapper around PHP's...
phpunit/phpunit 6.5.14 8.4.0 The PHP Unit Testing...
phpunit/phpunit-mock-objects 5.0.10 6.1.2 Mock Object library ...
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
sebastian/comparator 2.1.3 3.0.2 Provides the functio...
sebastian/diff 2.0.1 3.0.2 Diff implementation
sebastian/environment 3.1.0 4.2.2 Provides functionali...
sebastian/global-state 2.0.0 3.0.0 Snapshotting of glob...
sebastian/resource-operations 1.0.0 2.0.1 Provides a list of P...
squizlabs/php_codesniffer 3.4.2 3.5.0 PHP_CodeSniffer toke...
symfony-cmf/routing 1.4.1 2.1.0 Extends the Symfony2...
symfony/config v3.4.31 v4.3.4 Symfony Config Compo...
symfony/console v3.4.31 v4.3.4 Symfony Console Comp...
symfony/css-selector v3.4.31 v4.3.4 Symfony CssSelector ...
symfony/debug v3.4.31 v4.3.4 Symfony Debug Component
symfony/dependency-injection v3.4.31 v4.3.4 Symfony DependencyIn...
symfony/dom-crawler v3.4.31 v4.3.4 Symfony DomCrawler C...
symfony/event-dispatcher v3.4.31 v4.3.4 Symfony EventDispatc...
symfony/filesystem v3.4.31 v4.3.4 Symfony Filesystem C...
symfony/finder v3.4.31 v4.3.4 Symfony Finder Compo...
symfony/http-foundation v3.4.31 v4.3.4 Symfony HttpFoundati...
symfony/http-kernel v3.4.31 v4.3.4 Symfony HttpKernel C...
symfony/phpunit-bridge v3.4.31 v4.3.4 Symfony PHPUnit Bridge
symfony/process v3.4.31 v4.3.4 Symfony Process Comp...
symfony/routing v3.4.31 v4.3.4 Symfony Routing Comp...
symfony/serializer v3.4.31 v4.3.4 Symfony Serializer C...
symfony/translation v3.4.31 v4.3.4 Symfony Translation ...
symfony/validator v3.4.31 v4.3.4 Symfony Validator Co...
symfony/yaml v3.4.31 v4.3.4 Symfony Yaml Component
twig/twig v1.42.3 v2.12.0 Twig, the flexible, ...
typo3/phar-stream-wrapper v2.1.2 v3.1.2 Interceptors for PHP...
vlucas/phpdotenv v2.6.1 v3.6.0 Loads environment va...
webflo/drupal-core-require-dev 8.7.7 8.7.8 require-dev dependen...
zaporylie/composer-drupal-optimizations 1.1.0 1.1.1 Composer plugin to i...
zendframework/zend-diactoros 1.8.7 2.1.3 PSR HTTP Message imp...
Well, update them actually:
$ php-7.3 /usr/local/libexec/composer.phar update
* Note: Adding --dry-run
option to the above enables you to check what will be updated without actually updating.
The result was:
> DrupalProject\composer\ScriptHandler::checkComposerVersion
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 7 updates, 0 removals
- Updating zaporylie/composer-drupal-optimizations (1.1.0 => 1.1.1): Downloading (100%)
- Updating phpspec/prophecy (1.8.1 => 1.9.0): Downloading (100%)
- Updating squizlabs/php_codesniffer (3.4.2 => 3.5.0): Downloading (100%)
- Updating instaclick/php-webdriver (1.4.5 => 1.4.6): Downloading (100%)
- Updating doctrine/annotations (v1.7.0 => v1.8.0): Downloading (100%)
- Updating drupal/core (8.7.7 => 8.7.8): Downloading (100%)
- Updating webflo/drupal-core-require-dev (8.7.7 => 8.7.8)
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files
- .csslintrc (https://git.drupalcode.org/project/drupal/raw/8.7.8/.csslintrc): Downloading (connectiDownloading (100%)
- .editorconfig (https://git.drupalcode.org/project/drupal/raw/8.7.8/.editorconfig): Downloading (coDownloading (100%)
- .eslintignore (https://git.drupalcode.org/project/drupal/raw/8.7.8/.eslintignore): Downloading (coDownloading (100%)
- .eslintrc.json (https://git.drupalcode.org/project/drupal/raw/8.7.8/.eslintrc.json): Downloading (Downloading (100%)
- .gitattributes (https://git.drupalcode.org/project/drupal/raw/8.7.8/.gitattributes): Downloading (Downloading (100%)
- .ht.router.php (https://git.drupalcode.org/project/drupal/raw/8.7.8/.ht.router.php): Downloading (Downloading (100%)
- .htaccess (https://git.drupalcode.org/project/drupal/raw/8.7.8/.htaccess): Downloading (connectingDownloading (100%)
- index.php (https://git.drupalcode.org/project/drupal/raw/8.7.8/index.php): Downloading (connectingDownloading (100%)
- robots.txt (https://git.drupalcode.org/project/drupal/raw/8.7.8/robots.txt): Downloading (connectiDownloading (100%)
- sites/default/default.services.yml (https://git.drupalcode.org/project/drupal/raw/8.7.8/sites/default/default.services.yml): Downloading (100%)
- sites/default/default.settings.php (https://git.drupalcode.org/project/drupal/raw/8.7.8/sites/default/default.settings.php): Downloading (100%)
- sites/development.services.yml (https://git.drupalcode.org/project/drupal/raw/8.7.8/sites/development.services.yml): Downloading (100%)
- sites/example.settings.local.php (https://git.drupalcode.org/project/drupal/raw/8.7.8/sites/example.settings.local.php): Downloading (100%)
- sites/example.sites.php (https://git.drupalcode.org/project/drupal/raw/8.7.8/sites/example.sites.php): Downloading (100%)
- update.php (https://git.drupalcode.org/project/drupal/raw/8.7.8/update.php): Downloading (connectiDownloading (100%)
- web.config (https://git.drupalcode.org/project/drupal/raw/8.7.8/web.config): Downloading (connectiDownloading (100%)
> DrupalProject\composer\ScriptHandler::createRequiredFiles
Update DB
Drush requires php
executable.
So let's create it as a symbolic link:
# ln -s /usr/local/bin/php-7.3 /usr/local/bin/php
Then, update the database:
$ ./vendor/bin/drush updatedb
The result was:
[success] No pending updates.
Well, table definitions are sometimes changed here.
Next, clear cache:
$ ./vendor/bin/drush cr
[success] Cache rebuild complete.
Validate
The things are almost done.
Check the whole status at last:
$ ./vendor/bin/drush status
The result was:
Drupal version : 8.7.8
Site URI : http://default
DB driver : mysql
DB hostname : 127.0.0.1
DB port : 3306
DB username : <dbuser>
DB name : <database>
Database : Connected
Drupal bootstrap : Successful
Default theme : bartik
Admin theme : bartik
PHP binary : /usr/local/bin/php-7.3
PHP config : /etc/php-7.3.ini
PHP OS : OpenBSD
Drush script : /var/www/<drupal-dir>/vendor/drush/drush/drush
Drush version : 9.7.1
Drush temp : /tmp
Drush configs : /var/www/<drupal-dir>/vendor/drush/drush/drush.yml
/var/www/<drupal-dir>/drush/drush.yml
Install profile : standard
Drupal root : /var/www/<drupal-dir>/drupal/web
Site path : sites/default
Files, Public : sites/default/files
Files, Temp : /tmp
"Drupal version : 8.7.8" was got. O.K.
Clean up
Remove the symbolic link at last:
# rm /usr/local/bin/php
Done
Now everything seems fine :)