<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Modern Drupal Development with Composer</title> <meta name="description" content="Modern Drupal Development with Composer"> <meta name="author" content="Oliver Davies"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <link rel="stylesheet" href="css/reveal.css"> <link rel="stylesheet" href="css/theme/opdavies.css" id="theme"> <link rel="stylesheet" href="css/tomorrow-night-bright.css"> <!-- Printing and PDF exports --> <script> var link = document.createElement( 'link' ); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css'; document.getElementsByTagName( 'head' )[0].appendChild( link ); </script> <!--[if lt IE 9]> <script src="lib/js/html5shiv.js"></script> <![endif]--> </head> <body> <div class="reveal"> <div class="slides"> <section> <h1 class="is-big"> Modern Drupal Development with Composer </h1> <small>PHPSW Lightning Talks - November 2016</small> </section> <section> <h2>Oliver Davies</h2> <div class="columns"> <div class="column"> <ul class="bullets medium"> <li>Senior Drupal/PHP Developer</li> <li>Appnovation Technologies</li> <li>@opdavies</li> </ul> </div> <div class="column is-3"> <img class="no-border no-shadow" src="images/me_thumb.jpg"> <img class="no-border no-shadow" src="images/appnovation.png"> </div> </div> </section> <!-- <section> <h2>Also...</h2> <ul class="bullets medium"> <li>Former Drupal Association employee</li> <li>Drupal 7 and 8 core contributor and mentor</li> <li>Co-organiser of Drupal Bristol, SWDUG and PHPSW</li> <li>Co-founder and co-organiser of DrupalCamp Bristol</li> <li>Symfony/Silex/Laravel hobbyist</li> </ul> </section> --> <section> <h2> The Old Ways </h2> <ul class="bullets"> <li>Download an archive from Drupal.org</li> <li>Use Drush commands (<code>drush dl</code>)</li> <li>Use Drush Make</li> </ul> <aside class="notes"> </aside> </section> <section> <h2> Composer </h2> <ul class="bullets"> <li>Drupal Packagist (deprecated)</li> <li>Composer endpoints on Drupal.org (beta)</li> <li>Manage core and contrib as dependencies</li> <li>Both Drupal 7 and 8</li> </ul> </section> <section> <h2>Why?</h2> <ul class="bullets"> <li>"Getting off the island"</li> <li>Better versioning support</li> <li>Easier updates</li> <li>Automatic dependency management</li> </ul> <aside class="notes"> Increased adoption of common PHP tools like Composer and PHPUnit. Looser versioning No manually downloading core or additional projects, can update by changing one value. Automatically download dependencies of modules - other modules, external libraries. </aside> </section> <section data-background="#000" data-background-transition="none"> <h2 class="is-white"> Add a new repository </h2> <pre><code data-trim class="bash is-big"> $ composer config \ repositories.drupal composer \ https://packages.drupal.org/8 </code></pre> </section> <section data-background="#000" data-background-transition="none"> <h2 class="is-white"> composer.json </h2> <pre><code data-trim class="json is-medium"> { "repositories": { "drupal": { "type": "composer", "url": "https://packages.drupal.org/8" } } } </code></pre> </section> <section data-background="#000" data-background-transition="none"> <h2 class="is-white"> Custom directories </h2> <pre><code data-trim class="json is-small"> "extra": { "installer-paths": { "modules/contrib/{$name}": ["type:drupal-module"], "profiles/contrib/{$name}": ["type:drupal-profile"], "themes/contrib/{$name}": ["type:drupal-theme"] } } </code></pre> <aside class="notes"> Uses the composer/installers plugin Allows for adding packages into directories other than "vendor". </aside> </section> <section data-background="#000" data-background-transition="none"> <h2 class="is-white"> Adding Modules </h2> <pre><code data-trim class="bash is-small"> $ composer require drupal/pathauto:^1.0 ... - Installing drupal/token (1.0.0-beta2) Downloading: 100% - Installing drupal/ctools (3.0.0-alpha27) Downloading: 100% - Installing drupal/pathauto (1.0.0-beta1) Downloading: 100% </code></pre> <aside class="notes"> Also downloads token and ctools as they are dependencies. </aside> </section> <section data-background="#000" data-background-transition="none"> <h2 class="is-white"> Adding Modules with Dependencies </h2> <pre><code data-trim class="bash is-small"> $ composer require drupal/address:^1.0 ... - Installing commerceguys/addressing (v1.0.0-beta1) Downloading: 100% ... - Installing drupal/address (1.0.0-rc3) Downloading: 100% </code></pre> <aside class="notes"> Also downloads the commerceguys/addressing library as it’s added as a dependency within the modules’s composer.json. </aside> </section> <section> <h2> Composer template for Drupal projects </h2> <ul class="bullets"> <li>Downloads core into <code>web/</code></li> <li>Custom directories for modules, themes, profiles</li> <li>Manages directories and file permissions</li> <li>Includes Drush and Drupal Console</li> </ul> <aside class="notes"> Creates sites/default/files directory and manages directory permissions. </aside> </section> <section data-background="#000" data-background-transition="none"> <h2 class="is-white"> Composer template for Drupal projects </h2> <pre><code data-trim class="bash is-medium"> $ composer create-project \ drupal-composer/drupal-project:8.x-dev \ some-dir --stability dev \ --no-interaction </code></pre> </section> <section> <h2>Demo</h2> <video controls data-autoplay> <source src="videos/demo.mp4" type="video/mp4"> </video> </section> <section> <h2>Resources</h2> <ul class="bullets"> <li>Using Composer to manage Drupal site dependencies - https://www.drupal.org/node/2718229</li> <li>Composer template for Drupal projects - https://github.com/drupal-composer/drupal-project</li> </ul> </section> <section data-background="#0076C2" data-background-transition="none"> <h2 class="is-white"> Questions? </h2> </section> </div> </div> <script src="lib/js/head.min.js"></script> <script src="js/reveal.js"></script> <script> // More info https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ controls: false, progress: false, history: true, center: true, transition: 'none', // none/fade/slide/convex/concave/zoom // More info https://github.com/hakimel/reveal.js#dependencies dependencies: [ { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, { src: 'plugin/zoom-js/zoom.js', async: true }, { src: 'plugin/notes/notes.js', async: true } ] }); </script> </body> </html>