Install WP-CLI via composer on Trellis servers.
- Goal
- Role Variables
- Requirements
- Installation
- FAQ
- How to install certain commands only instead of the whole WP-CLI bundle?
- What to do when composer couldn't install packages because of conflicting version constraints?
- How to verify WP-CLI is installed via composer?
- Is it idempotent or deterministic?
- It looks awesome. Where can I find more goodies like this?
- Where can I give ⭐⭐⭐⭐⭐ reviews?
- Testing
- Feedback
- Security
- Credits
- License
[Since WP-CLI v2.0.0,] the most problematic set of the dependencies, the hard requirement on an old version of Symfony, is gone. The only Symfony component we still have (yet) is
symfony/finder
, as there’s no upper version limit for that one.-- https://make.wordpress.org/cli/2018/08/08/wp-cli-v2-0-0-release-notes/
However, the phar bundles with WP-CLI's dependencies. Those dependencies' always being loaded from the phar. As a result, their versions are locked.
For example: WP-CLI v2.4.0 phar bundles with symfony/process
v2.8.5 (as a dependency of symfony/finder
). Assume we have my-awesome-command
which requires symfony/process:5.0.0
. $ wp package install my-awesome-command
installs symfony/process
v5.0.0 as expected. However, symfony/process
v2.8.5 (from the WP-CLI phar) is always used; the newer version of symfony/process
(which required by my-awesome-command
) is being ignored. Thus, my-awesome-command
fails when trying to use symfony/process
.
$ wp shell
wp> $reflector = new \ReflectionClass('Symfony\Component\Process\Process');
=> object(ReflectionClass)#2801 (1) {
["name"]=>
string(33) "Symfony\Component\Process\Process"
}
wp> echo $reflector->getFileName(); // Note that it is loaded form the WP-CLI phar.
phar:///usr/bin/wp/vendor/symfony/process/Process.php
This problem affects symfony/finder
and its dependencies.
Installing WP-CLI via composer resolves the problem.
$ wp shell
wp> $reflector = new \ReflectionClass('Symfony\Component\Process\Process');
=> object(ReflectionClass)#2801 (1) {
["name"]=>
string(33) "Symfony\Component\Process\Process"
}
wp> echo $reflector->getFileName(); // Note that it is loaded form composer's vendor folder.
/home/web/.composer/vendor/symfony/process/Process.php
# Composer packages to be removed before installing WP-CLI
# Default: []
wp_cli_composer_global_remove_packages:
- wp-cli/wp-cli-bundle
- psy/psysh
# Composer packages to be installed
# Default: "wp-cli/wp-cli-bundle:{{ wp_cli_version }}"
wp_cli_composer_global_require_packages:
- "wp-cli/wp-cli:2.4.0"
- "wp-cli/package-command:^2"
- "psy/psysh:^0.9.12"
- "xxx/yyy:'^1.2.3 || ^2.2.3'"
# WP-CLI package to be installed
# Default: []
# Taken form https://github.com/roots/trellis/blob/4425669bab0665f0c9aed92c80eb9b8c54f63e85/roles/wp-cli/defaults/main.yml#L10
wp_cli_packages:
- "typisttech/image-optimize-command:@stable"
- "[email protected]:Yoast/wp-cli-faker.git"
# WP-CLI path
# Default: /usr/bin/wp
# Taken form https://github.com/roots/trellis/blob/4425669bab0665f0c9aed92c80eb9b8c54f63e85/roles/wp-cli/defaults/main.yml#L3
wp_cli_bin_path: /usr/bin/wp
# WP-CLI bash completion path
# Default: /etc/bash_completion.d/wp-completion.bash
# Taken form https://github.com/roots/trellis/blob/4425669bab0665f0c9aed92c80eb9b8c54f63e85/roles/wp-cli/defaults/main.yml#L9
wp_cli_completion_path: /etc/bash_completion.d/wp-completion.bash
- Trellis v1.3.0 or later
- Ansible v2.7.0 or later
- Python v3.7.6 or later
-
Add
itinerisltd.trellis_install_wp_cli_via_composer
togalaxy.yml
# galaxy.yml + - src: itinerisltd.trellis_install_wp_cli_via_composer + version: XXX.YYY.ZZZ # Check for latest version!
-
Replace
wp-cli
role withitinerisltd.trellis_install_wp_cli_via_composer
# server.yml - - { role: wp-cli, tags: [wp-cli] } + - { role: itinerisltd.trellis_install_wp_cli_via_composer, tags: [wp-cli] }
-
Install galaxy roles
trellis galaxy install # Alternatively ansible-galaxy install -r galaxy.yml --force
-
Re-provision
trellis provision production # Alternatively ansible-playbook server.yml -e env=production
By default, the whole WP-CLI bundle (wp-cli/wp-cli-bundle
) installed. If you want to keep your servers lean, install command packages selectively:
wp_cli_composer_global_remove_packages:
- wp-cli/wp-cli-bundle
wp_cli_composer_global_require_packages:
# Required: WP-CLI framework
- "wp-cli/wp-cli:^2.4"
# Only install commands you need:
- "wp-cli/core-command:^2"
- "wp-cli/cron-command:^2"
- "wp-cli/db-command:^2"
- "wp-cli/package-command:^2"
Double check existing composer packages. Then, change version constraints via role variables. You might need to uninstall some packages.
These commands are your friends:
composer global show
cat $(composer config --global --absolute home)/composer.json
wp package list
cat $(wp package path)/composer.json
# Bad: Installed via Trellis, i.e: the phar
$ wp cli info
WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli
# Good: Installed via this role, i.e: composer
$ wp cli info
WP-CLI root dir: /home/web/.composer/vendor/wp-cli/wp-cli
No.
Specific exact package versions might help but you will need to manage them manually.
- Articles on Itineris' blog
- More projects on Itineris' GitHub profile
- More plugins on Itineris and TangRufus wp.org profiles
- Follow @itineris_ltd and @TangRufus on Twitter
- Hire Itineris to build your next awesome site
Thanks! Glad you like it. It's important to let my boss knows somebody is using this project. Since this is not hosted on wordpress.org, please consider:
- tweet something good with mentioning @itineris_ltd and @TangRufus
- ⭐ star this Github repo
- 👀 watch this Github repo
- write blog posts
- submit pull requests
- hire Itineris
ansible-playbook -i 'localhost,' --syntax-check tests/test.yml
Please provide feedback! We want to make this library useful in as many projects as possible. Please submit an issue and point out what you do and don't like, or fork the project and make suggestions. No issue is too small.
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
trellis_install_wp_cli_via_composer is a Itineris Limited project created by Tang Rufus.
Full list of contributors can be found here.
trellis_install_wp_cli_via_composer is released under the MIT License.