Updating Drupal with Composer
Tags: drupal, update, composer, drush
Published: 2019-10-08 12:15:12

---
title: Updating Drupal with Composer
published: true
description: Here are all the steps to update Drupal 8 under PHP Composer.
tags: drupal, update, composer, drush 
series: Drupal on OpenBSD
---

## Summary

All the steps to update [Drupal](https://www.drupal.org/) 8 under [PHP](https://www.php.net/) [Composer](https://getcomposer.org/) are:

```console
$ 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

1. It is necessary to create `php` symbolic link for `php-7.x` executable in order to avoid the error "env: php: No such file or directory" at running [`drush`](https://www.drush.org/).
1. Don't use `pkg_add drush` because `drush/drush` is already included as Drupal's "require" in `composer.json`.
1. Checking `drush status` finally is surely useful. 

## Tutorial

#### Case

8.7.7 -> 8.7.8

#### Get started

Go to the Drupal directory:

```console
$ cd <drupal-dir>
```

#### Update app

First, check which modules of Drupal core are outdated:

```console
$ php-7.3 /usr/local/libexec/composer.phar outdated "drupal/*"
```

The result was:

```console
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:

```console
$ php-7.3 /usr/local/libexec/composer.phar outdated
```

The result was:

```console
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:

```console
$ 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:

```console
> 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:

```console
# ln -s /usr/local/bin/php-7.3 /usr/local/bin/php
```

Then, update the database:

```console
$ ./vendor/bin/drush updatedb
```

The result was:

```console
 [success] No pending updates.
```

Well, table definitions are sometimes changed here.

Next, clear cache:

```console
$ ./vendor/bin/drush cr
```

```console
 [success] Cache rebuild complete.
```

#### Validate

The things are almost done.

Check the whole status at last:

```console
$ ./vendor/bin/drush status
```

The result was:

```console
 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:

```console
# rm /usr/local/bin/php
```

#### Done

Now everything seems fine :)

![available updates](https://thepracticaldev.s3.amazonaws.com/i/3gwsje11akhedrib85qg.png)

![status report](https://thepracticaldev.s3.amazonaws.com/i/q6iobdtus8r7o581ak89.png)

## Reference

- [Drupal official : Updating Drupal 8 - Update core via Composer]( https://www.drupal.org/docs/8/update/update-core-via-composer)