h1. Installing Drush for working with Drupal 6-8 and Backdrop Palante has a few reasons to run different versions of Drush: * We're currently supporting or building Drupal 6, 7, 8 _and_ Backdrop sites. * We've fallen victim to the "weird gotcha where Drush destroys your git repo and other non-Drupal files":https://github.com/drush-ops/drush/issues/1581 that seems to happen more often with Drush 8 than other versions. * Some of our clients' servers don't support anything newer than Drush 6; if we run remote commands against those servers, like @drush sql-sync@, we need to use Drush 6 locally, too. Below is a solution that allows us to use Drush 6, 7 and 8 in the same environment. h2. Install Drush 6, 7 and 8 for all users I've followed the "To install for all users on the server" instructions under "Composer - One Drush for all Projects" in the "Drush 7 installation documentation":http://docs.drush.org/en/7.x/install/, adapted for different versions of Drush. Some of our clients' servers aren't capable of running anything newer than Drush 6. If you need to run commands like @drush sql-sync@ against those servers from your local or dev environment, you'll need Drush 6 installed. Run the following commands as root or using @sudo@.
git clone https://github.com/drush-ops/drush.git -b 6.6.0 /usr/local/src/drush6
cd /usr/local/src/drush6
composer install
ln -s /usr/local/src/drush6/drush /usr/bin/drush6
To install Drush 7, run the following commands as root or using @sudo@.
git clone https://github.com/drush-ops/drush.git -b 7.2.0 /usr/local/src/drush7
cd /usr/local/src/drush7
composer install
ln -s /usr/local/src/drush7/drush /usr/bin/drush7
Replace "7.2.0" with the tag of the most recent stable 7.x release (see https://github.com/drush-ops/drush/releases). Then install Drush 8, again running these commands as root or using @sudo@.
git clone https://github.com/drush-ops/drush.git -b 8.0.5 /usr/local/src/drush8
cd /usr/local/src/drush8
composer install
ln -s /usr/local/src/drush8/drush /usr/bin/drush8
Replace "8.0.5" with the tag of the most recent stable 8.x release (see https://github.com/drush-ops/drush/releases) You can now use the @drush6@, @drush7@ or @drush8@ commands to run each specific version of Drush. *EXTRA TIP:* To update version of Drush installed as outlined above, run the following commands within the @/usr/local/src/@ directory:
git pull origin master
git checkout tags/ -b 
composer install
Replace @@ with the most recent stable release of the Drush version you're updating. h2. Install Backdrop Drush commands In order for Drush to work with Backdrop, you must install the "Drush Backdrop commands":https://github.com/backdrop-contrib/drush within the Drush 8 installation itself. Assuming that Drush 8 is installed in @/usr/local/src/drush8@, as specified above:
git clone https://github.com/backdrop-contrib/drush.git /usr/local/src/drush8/commands/backdrop
h2. Create script to automatically switch Drush versions based on git configuration setting As per "this excellent guide from Marc van Gend of Triquanta":https://www.triquanta.nl/blog/automatically-switch-drush-versions-project, I've set up a script to let us switch between versions of Drush on a project-by-project basis using git configuration settings. The script, which lives at @/usr/bin/drush@ and is therefore called whenever someone runs the @drush@ command:
#!/bin/bash
version=$(git config --get drush.version)
if [ "$version" = '8' ];
then
    drush8 "$@"
elif [ "$version" = '6' ];
  then
  drush6 "$@"
else
    drush7 "$@"
fi
h2. Set drush.version git variable on a per-project basis In this configuration, Drush 7 is the default version of Drush. For the script above to automatically switch to a non-default version of Drush for a given project, set the @drush.version@ value in the git repo for the project by running @git config drush.version @. For example:
$ drush --version
 Drush Version   :  7.2.0
$ git config drush.version 8
$ drush --version
 Drush Version   :  8.0.5
h2. Update Drush remote site aliases to use correct Drush scripts If you've got Drush site aliases set up for remote sites on servers where multiple versions of Drush are available, update your @aliases.drushrc.php@ file to include the specific drush script that should be used on the remote site. See the "example.aliases.drushrc.php":https://github.com/drush-ops/drush/blob/master/examples/example.aliases.drushrc.php file if you need help creating your @aliases.drushrc.php@ file or learning about %drush-script. An example @aliases.drushrc.php@ file with %drush-script specified:
$aliases['drupal8'] = array(
  'remote-host' => 'fake-dev-server.palantetech.coop',
  'remote-user' => 'jack',
  'root' => '/var/www/dev/drupal8',
  'uri' => 'drupal8.palantetech.coop',
  'path-aliases' => array(
    '%drush-script' => '/usr/bin/drush8',
  )
);
$aliases['drupal7'] = array(
  'remote-host' => 'fake-dev-server.palantetech.coop',
  'remote-user' => 'jack',
  'root' => '/var/www/dev/drupal7',
  'uri' => 'drupal7.palantetech.coop',
  'path-aliases' => array(
    '%drush-script' => '/usr/bin/drush7',
  )
);
h2. Additional resources * https://www.triquanta.nl/blog/automatically-switch-drush-versions-project * https://www.lullabot.com/articles/switching-drush-versions