Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The Love-Hate Relationship Between Composer and...
Search
Coen Jacobs
September 26, 2015
Programming
0
230
The Love-Hate Relationship Between Composer and WordPress (WordCamp Netherlands 2015)
Coen Jacobs
September 26, 2015
Tweet
Share
More Decks by Coen Jacobs
See All by Coen Jacobs
So You Think You Can Composer?
coenjacobs
0
46
State of WordPress and eCommerce (WordPress meetup Nijmegen september 2015)
coenjacobs
0
350
Other Decks in Programming
See All in Programming
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
560
フロントエンドのmonorepo化と責務分離のリアーキテクト
kajitack
2
140
Claude Codeで実装以外の開発フロー、どこまで自動化できるか?失敗と成功
ndadayo
2
1.6k
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
23
9.1k
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
250
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
300
エンジニアのための”最低限いい感じ”デザイン入門
shunshobon
0
130
AIコーディングAgentとの向き合い方
eycjur
0
240
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
15
8.8k
KessokuでDIでもgoroutineを活用する / Go Connect #6
mazrean
0
120
Trem on Rails - Prompt Engineering com Ruby
elainenaomi
1
100
オープンセミナー2025@広島「君はどこで動かすか?」アンケート結果
satoshi256kbyte
0
220
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
Bash Introduction
62gerente
614
210k
Into the Great Unknown - MozCon
thekraken
40
2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.6k
Why Our Code Smells
bkeepers
PRO
338
57k
It's Worth the Effort
3n
187
28k
Building Applications with DynamoDB
mza
96
6.6k
Transcript
The Love-Hate Relationship Between Composer and WordPress @CoenJacobs at #wcnl
2015
Hello My name is Coen Jacobs Developer at Radish Concepts
Jumped out of the bubble Still do WordPress projects
Outside of the WordPress ecosystem, fun stuff happens too!
Composer “Composer is a tool for dependency management in PHP.
It allows you to declare the libraries your project depends on and it will manage (install/ update) them for you.”
What does Composer do? » Load your dependencies » Loads
dependencies of your dependencies » And so on... » Offers a powerful autoloader » Inspired by npm and bundler » Made by Jordi Boggiano
Alright, but how does it work?
Autoloading
Manual loading... require_once 'classes/class-core.php'; require_once 'includes/wpseo-local-functions.php'; require_once 'includes/ajax-functions.php'; require_once 'classes/class-core.php';
require_once 'classes/class-admin.php'; require_once 'classes/class-admin-wrappers.php'; require_once 'classes/class-metaboxes.php'; require_once 'classes/class-frontend.php'; require_once 'classes/class-storelocator.php'; require_once 'classes/class-taxonomy.php';
Classmap: "autoload": { "classmap": [ "includes" ] } PSR-4: "autoload":
{ "psr-4": {"Never5\\ WPNotificationCenter\\": "src/"} }
Just add require 'vendor/autoload.php'; That's it Does this for dependencies
as well
Even PHP 5.2 compatible
All plugins should use Composer autoloading, seriously! (if you have
more than one file)
Nothing but love so far!
Trust me, we'll get to the good stuff soon!
Dependency management
Say, you have a fancy library or want to use
one
Add it to your composer.json "require": { "wpupdatephp/wp-update-php": "~1.0" }
run composer install
Package will be installed vendor/wpupdatephp/ wp-update-php/ Added to autoloader as
well
And one day... (actually, two days ago...)
Dependency hell
You'll have this problem with any dependency manager That includes:
doing it manually
What's wrong?
Plugin A: "require": { "wpupdatephp/wp-update-php": "~1.0" } Plugin B: "require":
{ "wpupdatephp/wp-update-php": "~1.0" } Solution: Install WPupdatePHP version 1.0.0, right?
Sadly, no... Users download zip files, with vendor directory bundled
Bundling is the only way
One plugin bundles 1.1.0, the other 1.0.0 Which one is
used?
The race is on!
Include the file or the autoloader autoloader does class_exists check
first one wins
In the example, 1.0.0 was loaded the plugin bundling 1.1.0,
assumes that version is there Fatal error: Call to undefined method
Now the fun stuff begins!
What can we do to prevent this?
Prefix everything!
Example: Pimple Pimple: namespace Pimple; Danny's prefixed version: namespace ScrollTriggeredBoxes\DI;
It works But where is the developer happiness?
Every update of Pimple... Update all the files Someone make
a SaaS for this...
How would a developer solve this?
Manage the entire site via Composer Including WordPress core Everything
works fine, at least 99% of the time
What if you can't? Want to bundle something with your
plugin What if you can't add your site to Composer?
well...
Add Composer to your site
Creates a master composer.json » loop through wp-content/plugins/ » check
for composer.json file » run wikimedia/composer-merge-plugin » composer install » installed in wp-content/vendor/ At least in theory, this works
In WordPress core? Maybe Requires PHP 5.3+ Fairly resource intensive
The only proper solution
Until that day...
Thank you! @CoenJacobs coenjacobs.me Want to work with me? We're
looking for both frontend & backend developers! Contact me or @radishconcepts
Image credit » Slide 1: https://www.flickr.com/photos/ lizadaly/4373330774/ » Slide 7:
https://www.flickr.com/photos/ diaper/7328032558/ » Slide 13: https://www.flickr.com/ photos/93277085@N08/12715023064/ » Slide 15: https://www.flickr.com/ photos/dandeluca/2720139047/ » Slide 22: https://www.flickr.com/ photos/usnavy/7879793204/
Image credit » Slide 27: https://www.flickr.com/ photos/mdpettitt/4954174041/ » Slide 30:
https://www.flickr.com/ photos/orphanjones/1769903155/ » Slide 36: https://www.flickr.com/ photos/twitteroffice/4524716820/ » Slide 43: https://www.flickr.com/ photos/doug88888/4537134655/