├── .gitignore ├── 01-Init ├── README.md └── composer.json ├── 02-Install ├── README.md └── composer.json ├── 03-Require ├── README.md ├── composer.json └── composer.lock ├── 04-Require-dev ├── README.md ├── composer.json └── composer.lock ├── 05-Versions ├── README.md └── composer.json ├── 06-Stability ├── README.md └── composer.json ├── 07-Repositories ├── README.md └── composer.json ├── 08-Conflict ├── README.md └── composer.json ├── 09-Scripts ├── README.md └── composer.json ├── 10-Extra ├── README.md └── composer.json ├── 11-Update ├── README.md └── composer.json ├── 12-Create-project └── README.md ├── 13-Patches ├── README.md └── composer.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | .idea 3 | .docksal 4 | docroot -------------------------------------------------------------------------------- /01-Init/README.md: -------------------------------------------------------------------------------- 1 | # Using the Init Command 2 | 3 | https://getcomposer.org/doc/03-cli.md#init 4 | 5 | Everything Composer does it based on a `composer.json` file sitting in the root 6 | of your project. You can create this file yourself if you want, but the `init` 7 | command can get you started. It will walk you through creating basic parts of the 8 | file, like the description and initial requirements. 9 | 10 | ```$xslt 11 | $ composer init 12 | 13 | Welcome to the Composer config generator 14 | 15 | This command will guide you through creating your composer.json config. 16 | ``` 17 | 18 | This generator will prompt you for basic information to create your initial 19 | `composer.json` file. 20 | 21 | ``` 22 | Package name (/) [root/www]: david-hernandez/init 23 | ``` 24 | 25 | I used my Github username and a made up project name. This isn't required for 26 | your local project purposes, but is if you want to make your project public and 27 | create an account on Packagist.org. 28 | 29 | ``` 30 | Description []: Using the init command to create a new project. 31 | ``` 32 | 33 | Add a helpful description for the project. 34 | 35 | ``` 36 | Author [, n to skip]: David Hernandez 37 | ``` 38 | 39 | The author isn't required, but helpful. It provides contact information. 40 | 41 | ``` 42 | Minimum Stability []: dev 43 | ``` 44 | 45 | Minimum stability dictates what versions of packages you consider acceptable. 46 | Setting to `dev` means it is ok to download development versions of packages. 47 | Whether a version is considered dev, alpha, stable, etc, is dictated by the package 48 | Composer retrieves, not you. 49 | 50 | https://getcomposer.org/doc/04-schema.md#minimum-stability 51 | 52 | ``` 53 | Package Type (e.g. library, project, metapackage, composer-plugin) []: project 54 | ``` 55 | 56 | Set the package type. For a website or application, `project` is likely the type. 57 | 58 | ``` 59 | License []: 60 | ``` 61 | 62 | If you want to define the open source license your project will use, like GPL, 63 | put it here. This is optional. 64 | 65 | ```Define your dependencies. 66 | 67 | Would you like to define your dependencies (require) interactively [yes]? no 68 | ``` 69 | 70 | The generator lets you define the packages your projects requires at this step. These 71 | can be added later, so it is not necessary to do it now. 72 | 73 | ``` 74 | Would you like to define your dev dependencies (require-dev) interactively [yes]? no 75 | ``` 76 | 77 | Development dependencies are grouped separately. We'll get to this later. 78 | 79 | 80 | ``` 81 | { 82 | "name": "david-hernandez/init", 83 | "description": "Using the init command to create a new project.", 84 | "type": "project", 85 | "authors": [ 86 | { 87 | "name": "David Hernandez", 88 | "email": "david@example.com" 89 | } 90 | ], 91 | "minimum-stability": "dev", 92 | "require": {} 93 | } 94 | ``` 95 | 96 | When the generator is done, it will display what the resultant `composer.json` 97 | file will look like. 98 | 99 | ``` 100 | Do you confirm generation [yes]? yes 101 | ``` 102 | 103 | The file will not be written unless you say `yes` to the 104 | confirmation prompt. 105 | 106 | -------------------------------------------------------------------------------- /01-Init/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "require": {} 13 | } 14 | -------------------------------------------------------------------------------- /02-Install/README.md: -------------------------------------------------------------------------------- 1 | # Using the Install Command 2 | 3 | https://getcomposer.org/doc/03-cli.md#install 4 | 5 | The `install` command sets up your project using all of the information 6 | in the `composer.json` file. This is the power of a package manager. If you 7 | move the config file to another directory or computer, you can replicate 8 | all of the setup tasks and dependencies for the project. 9 | 10 | In this directory you will find a `composer.json` file that is the result 11 | of the steps taken in the first step of the tutorial. 12 | 13 | ```$xslt 14 | composer install 15 | ``` 16 | 17 | Run this command from the same location as the `composer.json` file. 18 | 19 | ```$xslt 20 | 1/11: http://packagist.org/p/provider-archived$afa373e95aa9fa7678612f8c7a961c6373160760005c1f8f41450f2860d933f9.json 21 | 2/11: http://packagist.org/p/provider-latest$906c970475603cf8253151905fee2dbaad7f2a95e41fb7a4477fae2a0987d9b2.json 22 | 3/11: http://packagist.org/p/provider-2018-04$312ab290f669dc52354b4211b61bda5377c496c9a641f7ec2ba4e0cc29f85984.json 23 | 4/11: http://packagist.org/p/provider-2014$ac705a4d1c9d787f47c7d17837173ffc7df3b4494ea8ca5f23f9cbd52be80457.json 24 | 5/11: http://packagist.org/p/provider-2017-07$37db856f75795d614325ebebc96133ada2848fc20df8d59d8044da590a4be728.json 25 | 6/11: http://packagist.org/p/provider-2013$e8a58721d48f09fca4bf257fac28558dc991cef7b48c19788e27bff3a99281d4.json 26 | 7/11: http://packagist.org/p/provider-2017-10$7ae8967e7d3971c313626809b38683c065775ad5d7020d1001895da729a7881a.json 27 | 8/11: http://packagist.org/p/provider-2015$d8af00cb324d408f74e33f20ec721d08538d1ef8237ab97ff0ec99803c8d581d.json 28 | 9/11: http://packagist.org/p/provider-2017$8ce5fb77f3af8fd8ccf18a1a6190b0ee9a80f958934dac688e5e673bea403ce2.json 29 | 10/11: http://packagist.org/p/provider-2018-01$3fdaed0b8be86588b9fa5499aaf4a494d7376f4b554e91b239913baf4c55e8c7.json 30 | 11/11: http://packagist.org/p/provider-2016$4fdf60a32e59900cc7b4a265f421d347d9c0ce0aee07b6a1567eed7f0c114fa7.json 31 | Finished: success: 11, skipped: 0, failure: 0, total: 11 32 | Loading composer repositories with package information 33 | Updating dependencies (including require-dev) 34 | Nothing to install or update 35 | Generating autoload files 36 | ``` 37 | 38 | Composer will read the json file and get to work. Even with no packages 39 | required in the json file it still performs certain setup tasks. 40 | 41 | In the example above, Composer is downloading lists of providers. It doesn't 42 | have to do this every time, so you may not see it again after you run 43 | it the first time. 44 | 45 | ```$xslt 46 | $ ls -l 47 | -rw-r--r-- 1 davidhernandez staff 2392 May 11 15:31 README.md 48 | -rw-r--r-- 1 davidhernandez staff 307 May 11 14:36 composer.json 49 | drwxr-xr-x 4 davidhernandez staff 136 May 11 15:28 vendor 50 | ``` 51 | 52 | We can see here that one of the setup tasks is to create a `vendor` directory. 53 | This is where Composer will put all the packages you will use in your project. 54 | 55 | ```$xslt 56 | $ ls -l vendor/ 57 | -rw-r--r-- 1 davidhernandez staff 178 May 11 15:28 autoload.php 58 | drwxr-xr-x 10 davidhernandez staff 340 May 11 15:28 composer 59 | ``` 60 | 61 | Without requiring any packages, Composer will still download and setup one thing. 62 | That is an autoloader. An autoloader is used by a PHP application to automatically 63 | load classes and interfaces. How that works is beyond the scope of this tutorial 64 | but it is something a lot of applications will take advantage of. 65 | -------------------------------------------------------------------------------- /02-Install/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "require": {} 13 | } 14 | -------------------------------------------------------------------------------- /03-Require/README.md: -------------------------------------------------------------------------------- 1 | # Requiring Dependencies 2 | 3 | https://getcomposer.org/doc/03-cli.md#require 4 | 5 | In order for composer to retrieve packages needed for your project, you have 6 | to declare them as dependencies. Don't think of the packages as something Composer 7 | installs. Remember that everything Composer does is about building and deploying 8 | an application. Instead of "installing packages," we "require dependencies." 9 | 10 | Starting with the json file from the previous steps in this tutorial, we'll use 11 | the `require` command to dictate what packages the project requires. 12 | 13 | The command uses this syntax. 14 | 15 | ```$xslt 16 | composer require [vendor]/[package_name]:[version] [additional options] 17 | ``` 18 | 19 | To add Drupal 8 as a dependency run this command. 20 | 21 | ```$xslt 22 | composer require drupal/drupal 23 | ``` 24 | 25 | The result: 26 | 27 | ```$xslt 28 | Using version 8.6.x-dev for drupal/drupal 29 | ./composer.json has been updated 30 | Loading composer repositories with package information 31 | Updating dependencies (including require-dev) 32 | Package operations: 3 installs, 0 updates, 0 removals 33 | - Installing wikimedia/composer-merge-plugin (v1.4.1): Downloading (100%) 34 | - Installing composer/installers (v1.5.0): Loading from cache 35 | - Installing drupal/drupal (8.6.x-dev c2585a1): Cloning c2585a1888 from cache 36 | Writing lock file 37 | Generating autoload files 38 | Loading composer repositories with package information 39 | Updating dependencies (including require-dev) 40 | Nothing to install or update 41 | Generating autoload files 42 | ``` 43 | 44 | You can see Composer downloads a few things that it will stick in the `vendor` 45 | directory, including a copy of Drupal 8. Each package is organized into folders 46 | based on the vendor name. So Drupal ends up in a `drupal` folder. 47 | 48 | ```$xslt 49 | $ ls -l vendor/ 50 | total 8 51 | drwxr-xr-x 6 davidhernandez staff 204 May 11 16:41 . 52 | drwxr-xr-x 6 davidhernandez staff 204 May 11 16:45 .. 53 | -rw-r--r-- 1 davidhernandez staff 178 May 11 16:41 autoload.php 54 | drwxr-xr-x 11 davidhernandez staff 374 May 11 16:41 composer 55 | drwxr-xr-x 3 davidhernandez staff 102 May 11 16:40 drupal 56 | drwxr-xr-x 3 davidhernandez staff 102 May 11 16:40 wikimedia 57 | 58 | ``` 59 | 60 | Well, if you know anything about Drupal, you know this is no good. Drupal is a CMS 61 | and is the basis for our project. It needs to be outside of the vendor directory 62 | in a web or document root directory. We'll get to that later, and you can see why 63 | Drupal isn't a straightforward use-case, but let's look at the json file. 64 | 65 | ```$xslt 66 | { 67 | "name": "david-hernandez/init", 68 | "description": "Using the init command to create a new project.", 69 | "type": "project", 70 | "authors": [ 71 | { 72 | "name": "David Hernandez", 73 | "email": "david@example.com" 74 | } 75 | ], 76 | "minimum-stability": "dev", 77 | "require": { 78 | "drupal/drupal": "8.6.x-dev" 79 | } 80 | } 81 | ``` 82 | 83 | Composer has added a new section to the file. The `require` section. This is where dependencies 84 | get listed. 85 | 86 | Composer goes and gets `drupal/drupal` using the public information from the account 87 | on Packagist.org. 88 | 89 | https://packagist.org/packages/drupal/drupal 90 | 91 | Since we did not specify the version to get, it grabs the most recent one. Furthermore, 92 | because we set `minimum-stability` to `dev` we told Composer it is ok to get the dev version. 93 | Thus, it retrieved `8.6.x-dev` which is Drupal 8's development branch. 94 | 95 | If we save this `composer.json` file and give it to someone else, when they run 96 | `composer install` they will get the same result. A vendor directory with Drupal in it, 97 | the Composer autoloader, and one or two other packages. 98 | 99 | Lastly, you'll discover Composer did one more thing. It wrote a lock file. 100 | 101 | Here is just a small section of that lock file. The part that concerns Drupal. 102 | ```$xslt 103 | "name": "drupal/drupal", 104 | "version": "8.6.x-dev", 105 | "source": { 106 | "type": "git", 107 | "url": "https://github.com/drupal/drupal.git", 108 | "reference": "c2585a1888dba714a61b48dc619c88674084e118" 109 | }, 110 | "dist": { 111 | "type": "zip", 112 | "url": "https://api.github.com/repos/drupal/drupal/zipball/c2585a1888dba714a61b48dc619c88674084e118", 113 | "reference": "c2585a1888dba714a61b48dc619c88674084e118", 114 | "shasum": "" 115 | }, 116 | "require": { 117 | "composer/installers": "^1.0.24", 118 | "wikimedia/composer-merge-plugin": "^1.4" 119 | }, 120 | "replace": { 121 | "drupal/core": "^8.6" 122 | }, 123 | "type": "project", 124 | ``` 125 | 126 | Drupal, being a public project we retrieved though Packagist.org, also has a json 127 | file. Composer reads it and performs the tasks necessary to also satisfy Drupal's 128 | dependencies. That is why it also retrieved `composer/installers` and `wikimedia/composer-merge-plugin`. 129 | This is the whole point of using a package manager. We don't want to manage all 130 | the dependencies of the projects, libraries, etc, we use. That's a lot to keep track of 131 | and we're much better off letting Composer do it for us. 132 | 133 | We can also see in the lock file the ultimate source of the code, version, reference hash, 134 | and other detailed information. 135 | 136 | The lock file is critically important, because it shows the result of everything Composer 137 | did. And, when you move your project to another location (like after committing the 138 | `composer.json` and `composer.lock` file to a Git repo and sharing with a teammate,) 139 | Composer will replicate what it did in the lock file. It will **not** rely on the json file 140 | when you run `composer install`. 141 | 142 | What is critically important here, is the lock file will specify the **exact** versions 143 | of the packages it retrieved. No ambiguous wildcards. We need to know exactly 144 | what software we have. -------------------------------------------------------------------------------- /03-Require/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "require": { 13 | "drupal/drupal": "8.6.x-dev" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /03-Require/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "d18e0f00088baabc075a9d02e03a31b0", 8 | "packages": [ 9 | { 10 | "name": "composer/installers", 11 | "version": "v1.5.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/composer/installers.git", 15 | "reference": "049797d727261bf27f2690430d935067710049c2" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/composer/installers/zipball/049797d727261bf27f2690430d935067710049c2", 20 | "reference": "049797d727261bf27f2690430d935067710049c2", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "composer-plugin-api": "^1.0" 25 | }, 26 | "replace": { 27 | "roundcube/plugin-installer": "*", 28 | "shama/baton": "*" 29 | }, 30 | "require-dev": { 31 | "composer/composer": "1.0.*@dev", 32 | "phpunit/phpunit": "^4.8.36" 33 | }, 34 | "type": "composer-plugin", 35 | "extra": { 36 | "class": "Composer\\Installers\\Plugin", 37 | "branch-alias": { 38 | "dev-master": "1.0-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Composer\\Installers\\": "src/Composer/Installers" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Kyle Robinson Young", 53 | "email": "kyle@dontkry.com", 54 | "homepage": "https://github.com/shama" 55 | } 56 | ], 57 | "description": "A multi-framework Composer library installer", 58 | "homepage": "https://composer.github.io/installers/", 59 | "keywords": [ 60 | "Craft", 61 | "Dolibarr", 62 | "Eliasis", 63 | "Hurad", 64 | "ImageCMS", 65 | "Kanboard", 66 | "Lan Management System", 67 | "MODX Evo", 68 | "Mautic", 69 | "Maya", 70 | "OXID", 71 | "Plentymarkets", 72 | "Porto", 73 | "RadPHP", 74 | "SMF", 75 | "Thelia", 76 | "WolfCMS", 77 | "agl", 78 | "aimeos", 79 | "annotatecms", 80 | "attogram", 81 | "bitrix", 82 | "cakephp", 83 | "chef", 84 | "cockpit", 85 | "codeigniter", 86 | "concrete5", 87 | "croogo", 88 | "dokuwiki", 89 | "drupal", 90 | "eZ Platform", 91 | "elgg", 92 | "expressionengine", 93 | "fuelphp", 94 | "grav", 95 | "installer", 96 | "itop", 97 | "joomla", 98 | "kohana", 99 | "laravel", 100 | "lavalite", 101 | "lithium", 102 | "magento", 103 | "majima", 104 | "mako", 105 | "mediawiki", 106 | "modulework", 107 | "modx", 108 | "moodle", 109 | "osclass", 110 | "phpbb", 111 | "piwik", 112 | "ppi", 113 | "puppet", 114 | "pxcms", 115 | "reindex", 116 | "roundcube", 117 | "shopware", 118 | "silverstripe", 119 | "sydes", 120 | "symfony", 121 | "typo3", 122 | "wordpress", 123 | "yawik", 124 | "zend", 125 | "zikula" 126 | ], 127 | "time": "2017-12-29T09:13:20+00:00" 128 | }, 129 | { 130 | "name": "drupal/drupal", 131 | "version": "8.6.x-dev", 132 | "source": { 133 | "type": "git", 134 | "url": "https://github.com/drupal/drupal.git", 135 | "reference": "c2585a1888dba714a61b48dc619c88674084e118" 136 | }, 137 | "dist": { 138 | "type": "zip", 139 | "url": "https://api.github.com/repos/drupal/drupal/zipball/c2585a1888dba714a61b48dc619c88674084e118", 140 | "reference": "c2585a1888dba714a61b48dc619c88674084e118", 141 | "shasum": "" 142 | }, 143 | "require": { 144 | "composer/installers": "^1.0.24", 145 | "wikimedia/composer-merge-plugin": "^1.4" 146 | }, 147 | "replace": { 148 | "drupal/core": "^8.6" 149 | }, 150 | "type": "project", 151 | "extra": { 152 | "_readme": [ 153 | "By default Drupal loads the autoloader from ./vendor/autoload.php.", 154 | "To change the autoloader you can edit ./autoload.php.", 155 | "This file specifies the packages.drupal.org repository.", 156 | "You can read more about this composer repository at:", 157 | "https://www.drupal.org/node/2718229" 158 | ], 159 | "merge-plugin": { 160 | "include": [ 161 | "core/composer.json" 162 | ], 163 | "recurse": true, 164 | "replace": false, 165 | "merge-extra": false 166 | }, 167 | "installer-paths": { 168 | "core": [ 169 | "type:drupal-core" 170 | ], 171 | "modules/contrib/{$name}": [ 172 | "type:drupal-module" 173 | ], 174 | "profiles/contrib/{$name}": [ 175 | "type:drupal-profile" 176 | ], 177 | "themes/contrib/{$name}": [ 178 | "type:drupal-theme" 179 | ], 180 | "drush/contrib/{$name}": [ 181 | "type:drupal-drush" 182 | ], 183 | "modules/custom/{$name}": [ 184 | "type:drupal-custom-module" 185 | ], 186 | "themes/custom/{$name}": [ 187 | "type:drupal-custom-theme" 188 | ] 189 | } 190 | }, 191 | "autoload": { 192 | "psr-4": { 193 | "Drupal\\Core\\Composer\\": "core/lib/Drupal/Core/Composer" 194 | } 195 | }, 196 | "notification-url": "https://packagist.org/downloads/", 197 | "license": [ 198 | "GPL-2.0-or-later" 199 | ], 200 | "description": "Drupal is an open source content management platform powering millions of websites and applications.", 201 | "time": "2018-05-11 14:20:00" 202 | }, 203 | { 204 | "name": "wikimedia/composer-merge-plugin", 205 | "version": "v1.4.1", 206 | "source": { 207 | "type": "git", 208 | "url": "https://github.com/wikimedia/composer-merge-plugin.git", 209 | "reference": "81c6ac72a24a67383419c7eb9aa2b3437f2ab100" 210 | }, 211 | "dist": { 212 | "type": "zip", 213 | "url": "https://api.github.com/repos/wikimedia/composer-merge-plugin/zipball/81c6ac72a24a67383419c7eb9aa2b3437f2ab100", 214 | "reference": "81c6ac72a24a67383419c7eb9aa2b3437f2ab100", 215 | "shasum": "" 216 | }, 217 | "require": { 218 | "composer-plugin-api": "^1.0", 219 | "php": ">=5.3.2" 220 | }, 221 | "require-dev": { 222 | "composer/composer": "~1.0.0", 223 | "jakub-onderka/php-parallel-lint": "~0.8", 224 | "phpunit/phpunit": "~4.8|~5.0", 225 | "squizlabs/php_codesniffer": "~2.1.0" 226 | }, 227 | "type": "composer-plugin", 228 | "extra": { 229 | "branch-alias": { 230 | "dev-master": "1.3.x-dev" 231 | }, 232 | "class": "Wikimedia\\Composer\\MergePlugin" 233 | }, 234 | "autoload": { 235 | "psr-4": { 236 | "Wikimedia\\Composer\\": "src/" 237 | } 238 | }, 239 | "notification-url": "https://packagist.org/downloads/", 240 | "license": [ 241 | "MIT" 242 | ], 243 | "authors": [ 244 | { 245 | "name": "Bryan Davis", 246 | "email": "bd808@wikimedia.org" 247 | } 248 | ], 249 | "description": "Composer plugin to merge multiple composer.json files", 250 | "time": "2017-04-25T02:31:25+00:00" 251 | } 252 | ], 253 | "packages-dev": [], 254 | "aliases": [], 255 | "minimum-stability": "dev", 256 | "stability-flags": { 257 | "drupal/drupal": 20 258 | }, 259 | "prefer-stable": false, 260 | "prefer-lowest": false, 261 | "platform": [], 262 | "platform-dev": [] 263 | } 264 | -------------------------------------------------------------------------------- /04-Require-dev/README.md: -------------------------------------------------------------------------------- 1 | # Requiring Development Dependencies 2 | 3 | https://getcomposer.org/doc/04-schema.md#require-dev 4 | 5 | Sometimes there are things you want to use in your project, but only when developing. 6 | Testing frameworks, debugging tools, etc. Composer has a section for this called `require-dev`. 7 | 8 | You can add this section to your `composer.json` file or use the `require` command 9 | to include these development dependencies. Just add `--dev` to the end of the `require` 10 | command. 11 | 12 | ```$xslt 13 | composer require drupal/console --dev 14 | ``` 15 | 16 | Drupal Console is a development tool specifically designed to work with Drupal. It 17 | is based on Symfony's Console project. It's handy, but something only needed when 18 | developing, not on a production server. 19 | 20 | After running this, let's look at the result. 21 | 22 | ```$xslt 23 | $ composer require drupal/console --dev 24 | ... 25 | Using version dev-master for drupal/console 26 | ./composer.json has been updated 27 | Loading composer repositories with package information 28 | Updating dependencies (including require-dev) 29 | 1/50: https://codeload.github.com/php-fig/http-message/legacy.zip/f6561bf28d520154e4b0ec72be95418abe6d9363 30 | 2/50: https://codeload.github.com/alchemy-fr/Zippy/legacy.zip/5ffdc93de0af2770d396bf433d8b2667c77277ea 31 | 3/50: https://codeload.github.com/composer/installers/legacy.zip/049797d727261bf27f2690430d935067710049c2 32 | 4/50: https://codeload.github.com/ralouphie/getallheaders/legacy.zip/5601c8a83fbba7ef674a7369456d12f1e0d0eafa 33 | 5/50: https://codeload.github.com/wikimedia/composer-merge-plugin/legacy.zip/81c6ac72a24a67383419c7eb9aa2b3437f2ab100 34 | ... 35 | 49/50: https://codeload.github.com/symfony/filesystem/legacy.zip/d961178b56f0fdacd7d2d1dc13202b7cb36b4a51 36 | 50/50: https://codeload.github.com/drupal/drupal/legacy.zip/c2585a1888dba714a61b48dc619c88674084e118 37 | Finished: success: 50, skipped: 0, failure: 0, total: 50 38 | Package operations: 50 installs, 0 updates, 0 removals 39 | - Installing composer/installers (v1.5.0): Loading from cache 40 | - Installing wikimedia/composer-merge-plugin (v1.4.1): Loading from cache 41 | - Installing symfony/polyfill-ctype (dev-master 7cc359f): Cloning 7cc359f1b7 from cache 42 | - Installing symfony/yaml (3.4.x-dev c5010cc): Cloning c5010cc169 from cache 43 | - Installing symfony/finder (3.4.x-dev bd14efe): Cloning bd14efe8b1 from cache 44 | ... 45 | - Installing guzzlehttp/guzzle (dev-master 0773d44): Cloning 0773d442aa from cache 46 | - Installing drupal/console (dev-master f69efe5): Cloning f69efe5ccd from cache 47 | - Installing drupal/drupal (8.6.x-dev c2585a1): Cloning c2585a1888 from cache 48 | symfony/translation suggests installing psr/log-implementation (To use logging capability in translator) 49 | symfony/event-dispatcher suggests installing symfony/http-kernel () 50 | symfony/dependency-injection suggests installing symfony/expression-language (For using expressions in service container configuration) 51 | symfony/dependency-injection suggests installing symfony/proxy-manager-bridge (Generate service proxies to lazy load them) 52 | symfony/console suggests installing symfony/lock () 53 | symfony/console suggests installing psr/log-implementation (For using the console logger) 54 | paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.) 55 | psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.) 56 | psy/psysh suggests installing hoa/console (A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit.) 57 | alchemy/zippy suggests installing guzzle/guzzle (To use the GuzzleTeleporter with Guzzle 3) 58 | drupal/console suggests installing symfony/thanks (Thank your favorite PHP projects on Github using the CLI!) 59 | drupal/console suggests installing vlucas/phpdotenv (Loads environment variables from .env to getenv(), $_ENV and $_SERVER automagically.) 60 | Writing lock file 61 | Generating autoload files 62 | 1/1: http://packagist.org/p/provider-latest$b3bf2022fdc8e1bbd261e1b0d965488d30cb006a736d01e951739fdfa4ce58c4.json 63 | Finished: success: 1, skipped: 0, failure: 0, total: 1 64 | Loading composer repositories with package information 65 | Installing dependencies (including require-dev) from lock file 66 | Nothing to install or update 67 | Generating autoload files 68 | ``` 69 | 70 | As you can see, Console requires a whole bunch of stuff, and that stuff requires 71 | a whole bunch of other stuff. This one package jumps the codebase up a notch in size. 72 | 73 | Let's take a look at the `composer.json` file. 74 | 75 | ```$xslt 76 | { 77 | "name": "david-hernandez/init", 78 | "description": "Using the init command to create a new project.", 79 | "type": "project", 80 | "authors": [ 81 | { 82 | "name": "David Hernandez", 83 | "email": "david@example.com" 84 | } 85 | ], 86 | "minimum-stability": "dev", 87 | "require": { 88 | "drupal/drupal": "8.6.x-dev" 89 | }, 90 | "require-dev": { 91 | "drupal/console": "dev-master" 92 | } 93 | } 94 | ``` 95 | 96 | Not much has changed, but we do have the new `require-dev` section with 97 | Drupal Console in it. And, once again, it downloaded the dev branch of the 98 | package, because we didn't specify a version, and we set `minimum-stability` 99 | to `dev`. 100 | 101 | Take a look at the lock file now. **It is huge!** We went from a three hundred 102 | line file to a three _thousand_ line file. 103 | 104 | ## Using `composer install` with Development Dependencies 105 | 106 | Here is the gotcha you need to know. When you run `composer install` it 107 | will retrieve everything in the `require` section **and** the `require-dev` 108 | section. It defaults to assuming you are running these commands while developing 109 | your project. 110 | 111 | When building for production, or any case when you don't want the development 112 | dependencies, run `composer install --no-dev`. This will ignore the `require-dev` 113 | section. 114 | 115 | Also note, including `require-dev` when you install is a root-level operation only. 116 | Composer will not include the development dependencies of the packages it retrieves. 117 | It assumes I'm developing my project, not Drupal Console or any of the other packages. -------------------------------------------------------------------------------- /04-Require-dev/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "require": { 13 | "drupal/drupal": "8.6.x-dev" 14 | }, 15 | "require-dev": { 16 | "drupal/console": "dev-master" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /04-Require-dev/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "921a7f8cd63535690a3d97c23a4af6f7", 8 | "packages": [ 9 | { 10 | "name": "composer/installers", 11 | "version": "v1.5.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/composer/installers.git", 15 | "reference": "049797d727261bf27f2690430d935067710049c2" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/composer/installers/zipball/049797d727261bf27f2690430d935067710049c2", 20 | "reference": "049797d727261bf27f2690430d935067710049c2", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "composer-plugin-api": "^1.0" 25 | }, 26 | "replace": { 27 | "roundcube/plugin-installer": "*", 28 | "shama/baton": "*" 29 | }, 30 | "require-dev": { 31 | "composer/composer": "1.0.*@dev", 32 | "phpunit/phpunit": "^4.8.36" 33 | }, 34 | "type": "composer-plugin", 35 | "extra": { 36 | "class": "Composer\\Installers\\Plugin", 37 | "branch-alias": { 38 | "dev-master": "1.0-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Composer\\Installers\\": "src/Composer/Installers" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Kyle Robinson Young", 53 | "email": "kyle@dontkry.com", 54 | "homepage": "https://github.com/shama" 55 | } 56 | ], 57 | "description": "A multi-framework Composer library installer", 58 | "homepage": "https://composer.github.io/installers/", 59 | "keywords": [ 60 | "Craft", 61 | "Dolibarr", 62 | "Eliasis", 63 | "Hurad", 64 | "ImageCMS", 65 | "Kanboard", 66 | "Lan Management System", 67 | "MODX Evo", 68 | "Mautic", 69 | "Maya", 70 | "OXID", 71 | "Plentymarkets", 72 | "Porto", 73 | "RadPHP", 74 | "SMF", 75 | "Thelia", 76 | "WolfCMS", 77 | "agl", 78 | "aimeos", 79 | "annotatecms", 80 | "attogram", 81 | "bitrix", 82 | "cakephp", 83 | "chef", 84 | "cockpit", 85 | "codeigniter", 86 | "concrete5", 87 | "croogo", 88 | "dokuwiki", 89 | "drupal", 90 | "eZ Platform", 91 | "elgg", 92 | "expressionengine", 93 | "fuelphp", 94 | "grav", 95 | "installer", 96 | "itop", 97 | "joomla", 98 | "kohana", 99 | "laravel", 100 | "lavalite", 101 | "lithium", 102 | "magento", 103 | "majima", 104 | "mako", 105 | "mediawiki", 106 | "modulework", 107 | "modx", 108 | "moodle", 109 | "osclass", 110 | "phpbb", 111 | "piwik", 112 | "ppi", 113 | "puppet", 114 | "pxcms", 115 | "reindex", 116 | "roundcube", 117 | "shopware", 118 | "silverstripe", 119 | "sydes", 120 | "symfony", 121 | "typo3", 122 | "wordpress", 123 | "yawik", 124 | "zend", 125 | "zikula" 126 | ], 127 | "time": "2017-12-29T09:13:20+00:00" 128 | }, 129 | { 130 | "name": "drupal/drupal", 131 | "version": "8.6.x-dev", 132 | "source": { 133 | "type": "git", 134 | "url": "https://github.com/drupal/drupal.git", 135 | "reference": "c2585a1888dba714a61b48dc619c88674084e118" 136 | }, 137 | "dist": { 138 | "type": "zip", 139 | "url": "https://api.github.com/repos/drupal/drupal/zipball/c2585a1888dba714a61b48dc619c88674084e118", 140 | "reference": "c2585a1888dba714a61b48dc619c88674084e118", 141 | "shasum": "" 142 | }, 143 | "require": { 144 | "composer/installers": "^1.0.24", 145 | "wikimedia/composer-merge-plugin": "^1.4" 146 | }, 147 | "replace": { 148 | "drupal/core": "^8.6" 149 | }, 150 | "type": "project", 151 | "extra": { 152 | "_readme": [ 153 | "By default Drupal loads the autoloader from ./vendor/autoload.php.", 154 | "To change the autoloader you can edit ./autoload.php.", 155 | "This file specifies the packages.drupal.org repository.", 156 | "You can read more about this composer repository at:", 157 | "https://www.drupal.org/node/2718229" 158 | ], 159 | "merge-plugin": { 160 | "include": [ 161 | "core/composer.json" 162 | ], 163 | "recurse": true, 164 | "replace": false, 165 | "merge-extra": false 166 | }, 167 | "installer-paths": { 168 | "core": [ 169 | "type:drupal-core" 170 | ], 171 | "modules/contrib/{$name}": [ 172 | "type:drupal-module" 173 | ], 174 | "profiles/contrib/{$name}": [ 175 | "type:drupal-profile" 176 | ], 177 | "themes/contrib/{$name}": [ 178 | "type:drupal-theme" 179 | ], 180 | "drush/contrib/{$name}": [ 181 | "type:drupal-drush" 182 | ], 183 | "modules/custom/{$name}": [ 184 | "type:drupal-custom-module" 185 | ], 186 | "themes/custom/{$name}": [ 187 | "type:drupal-custom-theme" 188 | ] 189 | } 190 | }, 191 | "autoload": { 192 | "psr-4": { 193 | "Drupal\\Core\\Composer\\": "core/lib/Drupal/Core/Composer" 194 | } 195 | }, 196 | "notification-url": "https://packagist.org/downloads/", 197 | "license": [ 198 | "GPL-2.0-or-later" 199 | ], 200 | "description": "Drupal is an open source content management platform powering millions of websites and applications.", 201 | "time": "2018-05-11T14:20:00+00:00" 202 | }, 203 | { 204 | "name": "wikimedia/composer-merge-plugin", 205 | "version": "v1.4.1", 206 | "source": { 207 | "type": "git", 208 | "url": "https://github.com/wikimedia/composer-merge-plugin.git", 209 | "reference": "81c6ac72a24a67383419c7eb9aa2b3437f2ab100" 210 | }, 211 | "dist": { 212 | "type": "zip", 213 | "url": "https://api.github.com/repos/wikimedia/composer-merge-plugin/zipball/81c6ac72a24a67383419c7eb9aa2b3437f2ab100", 214 | "reference": "81c6ac72a24a67383419c7eb9aa2b3437f2ab100", 215 | "shasum": "" 216 | }, 217 | "require": { 218 | "composer-plugin-api": "^1.0", 219 | "php": ">=5.3.2" 220 | }, 221 | "require-dev": { 222 | "composer/composer": "~1.0.0", 223 | "jakub-onderka/php-parallel-lint": "~0.8", 224 | "phpunit/phpunit": "~4.8|~5.0", 225 | "squizlabs/php_codesniffer": "~2.1.0" 226 | }, 227 | "type": "composer-plugin", 228 | "extra": { 229 | "branch-alias": { 230 | "dev-master": "1.3.x-dev" 231 | }, 232 | "class": "Wikimedia\\Composer\\MergePlugin" 233 | }, 234 | "autoload": { 235 | "psr-4": { 236 | "Wikimedia\\Composer\\": "src/" 237 | } 238 | }, 239 | "notification-url": "https://packagist.org/downloads/", 240 | "license": [ 241 | "MIT" 242 | ], 243 | "authors": [ 244 | { 245 | "name": "Bryan Davis", 246 | "email": "bd808@wikimedia.org" 247 | } 248 | ], 249 | "description": "Composer plugin to merge multiple composer.json files", 250 | "time": "2017-04-25T02:31:25+00:00" 251 | } 252 | ], 253 | "packages-dev": [ 254 | { 255 | "name": "alchemy/zippy", 256 | "version": "0.4.3", 257 | "source": { 258 | "type": "git", 259 | "url": "https://github.com/alchemy-fr/Zippy.git", 260 | "reference": "5ffdc93de0af2770d396bf433d8b2667c77277ea" 261 | }, 262 | "dist": { 263 | "type": "zip", 264 | "url": "https://api.github.com/repos/alchemy-fr/Zippy/zipball/5ffdc93de0af2770d396bf433d8b2667c77277ea", 265 | "reference": "5ffdc93de0af2770d396bf433d8b2667c77277ea", 266 | "shasum": "" 267 | }, 268 | "require": { 269 | "doctrine/collections": "~1.0", 270 | "ext-mbstring": "*", 271 | "php": ">=5.5", 272 | "symfony/filesystem": "^2.0.5|^3.0", 273 | "symfony/process": "^2.1|^3.0" 274 | }, 275 | "require-dev": { 276 | "ext-zip": "*", 277 | "guzzle/guzzle": "~3.0", 278 | "guzzlehttp/guzzle": "^6.0", 279 | "phpunit/phpunit": "^4.0|^5.0", 280 | "symfony/finder": "^2.0.5|^3.0" 281 | }, 282 | "suggest": { 283 | "ext-zip": "To use the ZipExtensionAdapter", 284 | "guzzle/guzzle": "To use the GuzzleTeleporter with Guzzle 3", 285 | "guzzlehttp/guzzle": "To use the GuzzleTeleporter with Guzzle 6" 286 | }, 287 | "type": "library", 288 | "extra": { 289 | "branch-alias": { 290 | "dev-master": "0.4.x-dev" 291 | } 292 | }, 293 | "autoload": { 294 | "psr-4": { 295 | "Alchemy\\Zippy\\": "src/" 296 | } 297 | }, 298 | "notification-url": "https://packagist.org/downloads/", 299 | "license": [ 300 | "MIT" 301 | ], 302 | "authors": [ 303 | { 304 | "name": "Alchemy", 305 | "email": "dev.team@alchemy.fr", 306 | "homepage": "http://www.alchemy.fr/" 307 | } 308 | ], 309 | "description": "Zippy, the archive manager companion", 310 | "keywords": [ 311 | "bzip", 312 | "compression", 313 | "tar", 314 | "zip" 315 | ], 316 | "time": "2016-11-03T16:10:31+00:00" 317 | }, 318 | { 319 | "name": "dflydev/dot-access-configuration", 320 | "version": "dev-master", 321 | "source": { 322 | "type": "git", 323 | "url": "https://github.com/dflydev/dflydev-dot-access-configuration.git", 324 | "reference": "ae6e7138b1d9063d343322cca63994ee1ac5161d" 325 | }, 326 | "dist": { 327 | "type": "zip", 328 | "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-configuration/zipball/ae6e7138b1d9063d343322cca63994ee1ac5161d", 329 | "reference": "ae6e7138b1d9063d343322cca63994ee1ac5161d", 330 | "shasum": "" 331 | }, 332 | "require": { 333 | "dflydev/dot-access-data": "1.*", 334 | "dflydev/placeholder-resolver": "1.*", 335 | "php": ">=5.3.2" 336 | }, 337 | "require-dev": { 338 | "symfony/yaml": "~2.1" 339 | }, 340 | "suggest": { 341 | "symfony/yaml": "Required for using the YAML Configuration Builders" 342 | }, 343 | "type": "library", 344 | "extra": { 345 | "branch-alias": { 346 | "dev-master": "1.0-dev" 347 | } 348 | }, 349 | "autoload": { 350 | "psr-0": { 351 | "Dflydev\\DotAccessConfiguration": "src" 352 | } 353 | }, 354 | "notification-url": "https://packagist.org/downloads/", 355 | "license": [ 356 | "MIT" 357 | ], 358 | "authors": [ 359 | { 360 | "name": "Dragonfly Development Inc.", 361 | "email": "info@dflydev.com", 362 | "homepage": "http://dflydev.com" 363 | }, 364 | { 365 | "name": "Beau Simensen", 366 | "email": "beau@dflydev.com", 367 | "homepage": "http://beausimensen.com" 368 | } 369 | ], 370 | "description": "Given a deep data structure representing a configuration, access configuration by dot notation.", 371 | "homepage": "https://github.com/dflydev/dflydev-dot-access-configuration", 372 | "keywords": [ 373 | "config", 374 | "configuration" 375 | ], 376 | "time": "2016-12-12T17:43:40+00:00" 377 | }, 378 | { 379 | "name": "dflydev/dot-access-data", 380 | "version": "v1.1.0", 381 | "source": { 382 | "type": "git", 383 | "url": "https://github.com/dflydev/dflydev-dot-access-data.git", 384 | "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a" 385 | }, 386 | "dist": { 387 | "type": "zip", 388 | "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a", 389 | "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a", 390 | "shasum": "" 391 | }, 392 | "require": { 393 | "php": ">=5.3.2" 394 | }, 395 | "type": "library", 396 | "extra": { 397 | "branch-alias": { 398 | "dev-master": "1.0-dev" 399 | } 400 | }, 401 | "autoload": { 402 | "psr-0": { 403 | "Dflydev\\DotAccessData": "src" 404 | } 405 | }, 406 | "notification-url": "https://packagist.org/downloads/", 407 | "license": [ 408 | "MIT" 409 | ], 410 | "authors": [ 411 | { 412 | "name": "Dragonfly Development Inc.", 413 | "email": "info@dflydev.com", 414 | "homepage": "http://dflydev.com" 415 | }, 416 | { 417 | "name": "Beau Simensen", 418 | "email": "beau@dflydev.com", 419 | "homepage": "http://beausimensen.com" 420 | }, 421 | { 422 | "name": "Carlos Frutos", 423 | "email": "carlos@kiwing.it", 424 | "homepage": "https://github.com/cfrutos" 425 | } 426 | ], 427 | "description": "Given a deep data structure, access data by dot notation.", 428 | "homepage": "https://github.com/dflydev/dflydev-dot-access-data", 429 | "keywords": [ 430 | "access", 431 | "data", 432 | "dot", 433 | "notation" 434 | ], 435 | "time": "2017-01-20T21:14:22+00:00" 436 | }, 437 | { 438 | "name": "dflydev/placeholder-resolver", 439 | "version": "dev-master", 440 | "source": { 441 | "type": "git", 442 | "url": "https://github.com/dflydev/dflydev-placeholder-resolver.git", 443 | "reference": "c498d0cae91b1bb36cc7d60906dab8e62bb7c356" 444 | }, 445 | "dist": { 446 | "type": "zip", 447 | "url": "https://api.github.com/repos/dflydev/dflydev-placeholder-resolver/zipball/c498d0cae91b1bb36cc7d60906dab8e62bb7c356", 448 | "reference": "c498d0cae91b1bb36cc7d60906dab8e62bb7c356", 449 | "shasum": "" 450 | }, 451 | "require": { 452 | "php": ">=5.3.2" 453 | }, 454 | "type": "library", 455 | "extra": { 456 | "branch-alias": { 457 | "dev-master": "1.0-dev" 458 | } 459 | }, 460 | "autoload": { 461 | "psr-0": { 462 | "Dflydev\\PlaceholderResolver": "src" 463 | } 464 | }, 465 | "notification-url": "https://packagist.org/downloads/", 466 | "license": [ 467 | "MIT" 468 | ], 469 | "authors": [ 470 | { 471 | "name": "Dragonfly Development Inc.", 472 | "email": "info@dflydev.com", 473 | "homepage": "http://dflydev.com" 474 | }, 475 | { 476 | "name": "Beau Simensen", 477 | "email": "beau@dflydev.com", 478 | "homepage": "http://beausimensen.com" 479 | } 480 | ], 481 | "description": "Given a data source representing key => value pairs, resolve placeholders like ${foo.bar} to the value associated with the 'foo.bar' key in the data source.", 482 | "homepage": "https://github.com/dflydev/dflydev-placeholder-resolver", 483 | "keywords": [ 484 | "placeholder", 485 | "resolver" 486 | ], 487 | "time": "2012-10-28T21:08:28+00:00" 488 | }, 489 | { 490 | "name": "dnoegel/php-xdg-base-dir", 491 | "version": "0.1", 492 | "source": { 493 | "type": "git", 494 | "url": "https://github.com/dnoegel/php-xdg-base-dir.git", 495 | "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" 496 | }, 497 | "dist": { 498 | "type": "zip", 499 | "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", 500 | "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", 501 | "shasum": "" 502 | }, 503 | "require": { 504 | "php": ">=5.3.2" 505 | }, 506 | "require-dev": { 507 | "phpunit/phpunit": "@stable" 508 | }, 509 | "type": "project", 510 | "autoload": { 511 | "psr-4": { 512 | "XdgBaseDir\\": "src/" 513 | } 514 | }, 515 | "notification-url": "https://packagist.org/downloads/", 516 | "license": [ 517 | "MIT" 518 | ], 519 | "description": "implementation of xdg base directory specification for php", 520 | "time": "2014-10-24T07:27:01+00:00" 521 | }, 522 | { 523 | "name": "doctrine/annotations", 524 | "version": "1.7.x-dev", 525 | "source": { 526 | "type": "git", 527 | "url": "https://github.com/doctrine/annotations.git", 528 | "reference": "232c5da3903f788e02328b4e8486eceea0c76e58" 529 | }, 530 | "dist": { 531 | "type": "zip", 532 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/232c5da3903f788e02328b4e8486eceea0c76e58", 533 | "reference": "232c5da3903f788e02328b4e8486eceea0c76e58", 534 | "shasum": "" 535 | }, 536 | "require": { 537 | "doctrine/lexer": "1.*", 538 | "php": "^7.1" 539 | }, 540 | "require-dev": { 541 | "doctrine/cache": "1.*", 542 | "phpunit/phpunit": "^7.0" 543 | }, 544 | "type": "library", 545 | "extra": { 546 | "branch-alias": { 547 | "dev-master": "1.7.x-dev" 548 | } 549 | }, 550 | "autoload": { 551 | "psr-4": { 552 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 553 | } 554 | }, 555 | "notification-url": "https://packagist.org/downloads/", 556 | "license": [ 557 | "MIT" 558 | ], 559 | "authors": [ 560 | { 561 | "name": "Roman Borschel", 562 | "email": "roman@code-factory.org" 563 | }, 564 | { 565 | "name": "Benjamin Eberlei", 566 | "email": "kontakt@beberlei.de" 567 | }, 568 | { 569 | "name": "Guilherme Blanco", 570 | "email": "guilhermeblanco@gmail.com" 571 | }, 572 | { 573 | "name": "Jonathan Wage", 574 | "email": "jonwage@gmail.com" 575 | }, 576 | { 577 | "name": "Johannes Schmitt", 578 | "email": "schmittjoh@gmail.com" 579 | } 580 | ], 581 | "description": "Docblock Annotations Parser", 582 | "homepage": "http://www.doctrine-project.org", 583 | "keywords": [ 584 | "annotations", 585 | "docblock", 586 | "parser" 587 | ], 588 | "time": "2018-05-06T10:14:50+00:00" 589 | }, 590 | { 591 | "name": "doctrine/collections", 592 | "version": "dev-master", 593 | "source": { 594 | "type": "git", 595 | "url": "https://github.com/doctrine/collections.git", 596 | "reference": "33407e41a31e448426563e33a6edf688461a9a86" 597 | }, 598 | "dist": { 599 | "type": "zip", 600 | "url": "https://api.github.com/repos/doctrine/collections/zipball/33407e41a31e448426563e33a6edf688461a9a86", 601 | "reference": "33407e41a31e448426563e33a6edf688461a9a86", 602 | "shasum": "" 603 | }, 604 | "require": { 605 | "php": "^7.1" 606 | }, 607 | "require-dev": { 608 | "doctrine/coding-standard": "^4.0", 609 | "phpstan/phpstan-shim": "^0.9.2", 610 | "phpunit/phpunit": "^7.0" 611 | }, 612 | "type": "library", 613 | "extra": { 614 | "branch-alias": { 615 | "dev-master": "1.6.x-dev" 616 | } 617 | }, 618 | "autoload": { 619 | "psr-4": { 620 | "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" 621 | } 622 | }, 623 | "notification-url": "https://packagist.org/downloads/", 624 | "license": [ 625 | "MIT" 626 | ], 627 | "authors": [ 628 | { 629 | "name": "Roman Borschel", 630 | "email": "roman@code-factory.org" 631 | }, 632 | { 633 | "name": "Benjamin Eberlei", 634 | "email": "kontakt@beberlei.de" 635 | }, 636 | { 637 | "name": "Guilherme Blanco", 638 | "email": "guilhermeblanco@gmail.com" 639 | }, 640 | { 641 | "name": "Jonathan Wage", 642 | "email": "jonwage@gmail.com" 643 | }, 644 | { 645 | "name": "Johannes Schmitt", 646 | "email": "schmittjoh@gmail.com" 647 | } 648 | ], 649 | "description": "Collections Abstraction library", 650 | "homepage": "http://www.doctrine-project.org", 651 | "keywords": [ 652 | "array", 653 | "collections", 654 | "iterator" 655 | ], 656 | "time": "2018-04-27T18:28:22+00:00" 657 | }, 658 | { 659 | "name": "doctrine/lexer", 660 | "version": "dev-master", 661 | "source": { 662 | "type": "git", 663 | "url": "https://github.com/doctrine/lexer.git", 664 | "reference": "b4f2b2fe5d5726e08a7d46fe3149b577e738463a" 665 | }, 666 | "dist": { 667 | "type": "zip", 668 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/b4f2b2fe5d5726e08a7d46fe3149b577e738463a", 669 | "reference": "b4f2b2fe5d5726e08a7d46fe3149b577e738463a", 670 | "shasum": "" 671 | }, 672 | "require": { 673 | "php": ">=5.3.2" 674 | }, 675 | "require-dev": { 676 | "phpunit/phpunit": "^4.5" 677 | }, 678 | "type": "library", 679 | "extra": { 680 | "branch-alias": { 681 | "dev-master": "1.0.x-dev" 682 | } 683 | }, 684 | "autoload": { 685 | "psr-4": { 686 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" 687 | } 688 | }, 689 | "notification-url": "https://packagist.org/downloads/", 690 | "license": [ 691 | "MIT" 692 | ], 693 | "authors": [ 694 | { 695 | "name": "Roman Borschel", 696 | "email": "roman@code-factory.org" 697 | }, 698 | { 699 | "name": "Guilherme Blanco", 700 | "email": "guilhermeblanco@gmail.com" 701 | }, 702 | { 703 | "name": "Johannes Schmitt", 704 | "email": "schmittjoh@gmail.com" 705 | } 706 | ], 707 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 708 | "homepage": "http://www.doctrine-project.org", 709 | "keywords": [ 710 | "lexer", 711 | "parser" 712 | ], 713 | "time": "2018-04-24T03:37:48+00:00" 714 | }, 715 | { 716 | "name": "drupal/console", 717 | "version": "dev-master", 718 | "source": { 719 | "type": "git", 720 | "url": "https://github.com/hechoendrupal/drupal-console.git", 721 | "reference": "f69efe5ccd775fa05cd3166ddcd6576e5511461b" 722 | }, 723 | "dist": { 724 | "type": "zip", 725 | "url": "https://api.github.com/repos/hechoendrupal/drupal-console/zipball/f69efe5ccd775fa05cd3166ddcd6576e5511461b", 726 | "reference": "f69efe5ccd775fa05cd3166ddcd6576e5511461b", 727 | "shasum": "" 728 | }, 729 | "require": { 730 | "alchemy/zippy": "0.4.3", 731 | "composer/installers": "~1.0", 732 | "doctrine/annotations": "^1.2", 733 | "doctrine/collections": "^1.3", 734 | "drupal/console-core": "1.8.0", 735 | "drupal/console-extend-plugin": "~0", 736 | "guzzlehttp/guzzle": "~6.1", 737 | "php": "^5.5.9 || ^7.0", 738 | "psy/psysh": "0.6.* || ~0.8", 739 | "symfony/css-selector": "~2.8|~3.0", 740 | "symfony/dom-crawler": "~2.8|~3.0", 741 | "symfony/http-foundation": "~2.8|~3.0" 742 | }, 743 | "suggest": { 744 | "symfony/thanks": "Thank your favorite PHP projects on Github using the CLI!", 745 | "vlucas/phpdotenv": "Loads environment variables from .env to getenv(), $_ENV and $_SERVER automagically." 746 | }, 747 | "bin": [ 748 | "bin/drupal" 749 | ], 750 | "type": "library", 751 | "autoload": { 752 | "psr-4": { 753 | "Drupal\\Console\\": "src" 754 | } 755 | }, 756 | "notification-url": "https://packagist.org/downloads/", 757 | "license": [ 758 | "GPL-2.0-or-later" 759 | ], 760 | "authors": [ 761 | { 762 | "name": "David Flores", 763 | "email": "dmousex@gmail.com", 764 | "homepage": "http://dmouse.net" 765 | }, 766 | { 767 | "name": "Jesus Manuel Olivas", 768 | "email": "jesus.olivas@gmail.com", 769 | "homepage": "http://jmolivas.com" 770 | }, 771 | { 772 | "name": "Eduardo Garcia", 773 | "email": "enzo@enzolutions.com", 774 | "homepage": "http://enzolutions.com/" 775 | }, 776 | { 777 | "name": "Omar Aguirre", 778 | "email": "omersguchigu@gmail.com" 779 | }, 780 | { 781 | "name": "Drupal Console Contributors", 782 | "homepage": "https://github.com/hechoendrupal/drupal-console/graphs/contributors" 783 | } 784 | ], 785 | "description": "The Drupal CLI. A tool to generate boilerplate code, interact with and debug Drupal.", 786 | "homepage": "http://drupalconsole.com/", 787 | "keywords": [ 788 | "console", 789 | "development", 790 | "drupal", 791 | "symfony" 792 | ], 793 | "time": "2018-05-09T06:48:39+00:00" 794 | }, 795 | { 796 | "name": "drupal/console-core", 797 | "version": "1.8.0", 798 | "source": { 799 | "type": "git", 800 | "url": "https://github.com/hechoendrupal/drupal-console-core.git", 801 | "reference": "bf1fb4a6f689377acec1694267f674178d28e5d1" 802 | }, 803 | "dist": { 804 | "type": "zip", 805 | "url": "https://api.github.com/repos/hechoendrupal/drupal-console-core/zipball/bf1fb4a6f689377acec1694267f674178d28e5d1", 806 | "reference": "bf1fb4a6f689377acec1694267f674178d28e5d1", 807 | "shasum": "" 808 | }, 809 | "require": { 810 | "dflydev/dot-access-configuration": "^1.0", 811 | "drupal/console-en": "1.8.0", 812 | "php": "^5.5.9 || ^7.0", 813 | "stecman/symfony-console-completion": "~0.7", 814 | "symfony/config": "~2.8|~3.0", 815 | "symfony/console": "~2.8|~3.0", 816 | "symfony/debug": "~2.8|~3.0", 817 | "symfony/dependency-injection": "~2.8|~3.0", 818 | "symfony/event-dispatcher": "~2.8|~3.0", 819 | "symfony/filesystem": "~2.8|~3.0", 820 | "symfony/finder": "~2.8|~3.0", 821 | "symfony/process": "~2.8|~3.0", 822 | "symfony/translation": "~2.8|~3.0", 823 | "symfony/yaml": "~2.8|~3.0", 824 | "twig/twig": "^1.23.1", 825 | "webflo/drupal-finder": "^1.0", 826 | "webmozart/path-util": "^2.3" 827 | }, 828 | "type": "library", 829 | "autoload": { 830 | "files": [ 831 | "src/functions.php" 832 | ], 833 | "psr-4": { 834 | "Drupal\\Console\\Core\\": "src" 835 | } 836 | }, 837 | "notification-url": "https://packagist.org/downloads/", 838 | "license": [ 839 | "GPL-2.0-or-later" 840 | ], 841 | "authors": [ 842 | { 843 | "name": "David Flores", 844 | "email": "dmousex@gmail.com", 845 | "homepage": "http://dmouse.net" 846 | }, 847 | { 848 | "name": "Jesus Manuel Olivas", 849 | "email": "jesus.olivas@gmail.com", 850 | "homepage": "http://jmolivas.com" 851 | }, 852 | { 853 | "name": "Drupal Console Contributors", 854 | "homepage": "https://github.com/hechoendrupal/DrupalConsole/graphs/contributors" 855 | }, 856 | { 857 | "name": "Eduardo Garcia", 858 | "email": "enzo@enzolutions.com", 859 | "homepage": "http://enzolutions.com/" 860 | }, 861 | { 862 | "name": "Omar Aguirre", 863 | "email": "omersguchigu@gmail.com" 864 | } 865 | ], 866 | "description": "Drupal Console Core", 867 | "homepage": "http://drupalconsole.com/", 868 | "keywords": [ 869 | "console", 870 | "development", 871 | "drupal", 872 | "symfony" 873 | ], 874 | "time": "2018-03-21T19:33:23+00:00" 875 | }, 876 | { 877 | "name": "drupal/console-en", 878 | "version": "1.8.0", 879 | "source": { 880 | "type": "git", 881 | "url": "https://github.com/hechoendrupal/drupal-console-en.git", 882 | "reference": "ea956ddffab04f519a89858810e5f695b9def92b" 883 | }, 884 | "dist": { 885 | "type": "zip", 886 | "url": "https://api.github.com/repos/hechoendrupal/drupal-console-en/zipball/ea956ddffab04f519a89858810e5f695b9def92b", 887 | "reference": "ea956ddffab04f519a89858810e5f695b9def92b", 888 | "shasum": "" 889 | }, 890 | "type": "drupal-console-language", 891 | "notification-url": "https://packagist.org/downloads/", 892 | "license": [ 893 | "GPL-2.0-or-later" 894 | ], 895 | "authors": [ 896 | { 897 | "name": "David Flores", 898 | "email": "dmousex@gmail.com", 899 | "homepage": "http://dmouse.net" 900 | }, 901 | { 902 | "name": "Jesus Manuel Olivas", 903 | "email": "jesus.olivas@gmail.com", 904 | "homepage": "http://jmolivas.com" 905 | }, 906 | { 907 | "name": "Drupal Console Contributors", 908 | "homepage": "https://github.com/hechoendrupal/DrupalConsole/graphs/contributors" 909 | }, 910 | { 911 | "name": "Eduardo Garcia", 912 | "email": "enzo@enzolutions.com", 913 | "homepage": "http://enzolutions.com/" 914 | }, 915 | { 916 | "name": "Omar Aguirre", 917 | "email": "omersguchigu@gmail.com" 918 | } 919 | ], 920 | "description": "Drupal Console English Language", 921 | "homepage": "http://drupalconsole.com/", 922 | "keywords": [ 923 | "console", 924 | "development", 925 | "drupal", 926 | "symfony" 927 | ], 928 | "time": "2018-03-21T19:16:27+00:00" 929 | }, 930 | { 931 | "name": "drupal/console-extend-plugin", 932 | "version": "0.9.2", 933 | "source": { 934 | "type": "git", 935 | "url": "https://github.com/hechoendrupal/drupal-console-extend-plugin.git", 936 | "reference": "f3bac233fd305359c33e96621443b3bd065555cc" 937 | }, 938 | "dist": { 939 | "type": "zip", 940 | "url": "https://api.github.com/repos/hechoendrupal/drupal-console-extend-plugin/zipball/f3bac233fd305359c33e96621443b3bd065555cc", 941 | "reference": "f3bac233fd305359c33e96621443b3bd065555cc", 942 | "shasum": "" 943 | }, 944 | "require": { 945 | "composer-plugin-api": "^1.0", 946 | "symfony/finder": "~2.7|~3.0", 947 | "symfony/yaml": "~2.7|~3.0" 948 | }, 949 | "type": "composer-plugin", 950 | "extra": { 951 | "class": "Drupal\\Console\\Composer\\Plugin\\Extender" 952 | }, 953 | "autoload": { 954 | "psr-4": { 955 | "Drupal\\Console\\Composer\\Plugin\\": "src" 956 | } 957 | }, 958 | "notification-url": "https://packagist.org/downloads/", 959 | "license": [ 960 | "GPL-2.0+" 961 | ], 962 | "authors": [ 963 | { 964 | "name": "Jesus Manuel Olivas", 965 | "email": "jesus.olivas@gmail.com" 966 | } 967 | ], 968 | "description": "Drupal Console Extend Plugin", 969 | "time": "2017-07-28T17:11:54+00:00" 970 | }, 971 | { 972 | "name": "guzzlehttp/guzzle", 973 | "version": "dev-master", 974 | "source": { 975 | "type": "git", 976 | "url": "https://github.com/guzzle/guzzle.git", 977 | "reference": "0773d442aa96baf19d7195f14ba6e9c2da11f8ed" 978 | }, 979 | "dist": { 980 | "type": "zip", 981 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0773d442aa96baf19d7195f14ba6e9c2da11f8ed", 982 | "reference": "0773d442aa96baf19d7195f14ba6e9c2da11f8ed", 983 | "shasum": "" 984 | }, 985 | "require": { 986 | "guzzlehttp/promises": "^1.0", 987 | "guzzlehttp/psr7": "^1.4", 988 | "php": ">=5.5" 989 | }, 990 | "require-dev": { 991 | "ext-curl": "*", 992 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 993 | "psr/log": "^1.0" 994 | }, 995 | "suggest": { 996 | "psr/log": "Required for using the Log middleware" 997 | }, 998 | "type": "library", 999 | "extra": { 1000 | "branch-alias": { 1001 | "dev-master": "6.3-dev" 1002 | } 1003 | }, 1004 | "autoload": { 1005 | "files": [ 1006 | "src/functions_include.php" 1007 | ], 1008 | "psr-4": { 1009 | "GuzzleHttp\\": "src/" 1010 | } 1011 | }, 1012 | "notification-url": "https://packagist.org/downloads/", 1013 | "license": [ 1014 | "MIT" 1015 | ], 1016 | "authors": [ 1017 | { 1018 | "name": "Michael Dowling", 1019 | "email": "mtdowling@gmail.com", 1020 | "homepage": "https://github.com/mtdowling" 1021 | } 1022 | ], 1023 | "description": "Guzzle is a PHP HTTP client library", 1024 | "homepage": "http://guzzlephp.org/", 1025 | "keywords": [ 1026 | "client", 1027 | "curl", 1028 | "framework", 1029 | "http", 1030 | "http client", 1031 | "rest", 1032 | "web service" 1033 | ], 1034 | "time": "2018-04-23T13:18:18+00:00" 1035 | }, 1036 | { 1037 | "name": "guzzlehttp/promises", 1038 | "version": "dev-master", 1039 | "source": { 1040 | "type": "git", 1041 | "url": "https://github.com/guzzle/promises.git", 1042 | "reference": "136531aa4e42f9b1971a47fb0faf60da00d2fefa" 1043 | }, 1044 | "dist": { 1045 | "type": "zip", 1046 | "url": "https://api.github.com/repos/guzzle/promises/zipball/136531aa4e42f9b1971a47fb0faf60da00d2fefa", 1047 | "reference": "136531aa4e42f9b1971a47fb0faf60da00d2fefa", 1048 | "shasum": "" 1049 | }, 1050 | "require": { 1051 | "php": ">=5.5.0" 1052 | }, 1053 | "require-dev": { 1054 | "phpunit/phpunit": "^4.8.36" 1055 | }, 1056 | "type": "library", 1057 | "extra": { 1058 | "branch-alias": { 1059 | "dev-master": "1.4-dev" 1060 | } 1061 | }, 1062 | "autoload": { 1063 | "psr-4": { 1064 | "GuzzleHttp\\Promise\\": "src/" 1065 | }, 1066 | "files": [ 1067 | "src/functions_include.php" 1068 | ] 1069 | }, 1070 | "notification-url": "https://packagist.org/downloads/", 1071 | "license": [ 1072 | "MIT" 1073 | ], 1074 | "authors": [ 1075 | { 1076 | "name": "Michael Dowling", 1077 | "email": "mtdowling@gmail.com", 1078 | "homepage": "https://github.com/mtdowling" 1079 | } 1080 | ], 1081 | "description": "Guzzle promises library", 1082 | "keywords": [ 1083 | "promise" 1084 | ], 1085 | "time": "2018-03-25T01:26:01+00:00" 1086 | }, 1087 | { 1088 | "name": "guzzlehttp/psr7", 1089 | "version": "dev-master", 1090 | "source": { 1091 | "type": "git", 1092 | "url": "https://github.com/guzzle/psr7.git", 1093 | "reference": "239912a01c502f2d8f3c642eb2fcd4e58cf82a72" 1094 | }, 1095 | "dist": { 1096 | "type": "zip", 1097 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/239912a01c502f2d8f3c642eb2fcd4e58cf82a72", 1098 | "reference": "239912a01c502f2d8f3c642eb2fcd4e58cf82a72", 1099 | "shasum": "" 1100 | }, 1101 | "require": { 1102 | "php": ">=5.4.0", 1103 | "psr/http-message": "~1.0", 1104 | "ralouphie/getallheaders": "^2.0.5" 1105 | }, 1106 | "provide": { 1107 | "psr/http-message-implementation": "1.0" 1108 | }, 1109 | "require-dev": { 1110 | "phpunit/phpunit": "~4.0" 1111 | }, 1112 | "type": "library", 1113 | "extra": { 1114 | "branch-alias": { 1115 | "dev-master": "1.4-dev" 1116 | } 1117 | }, 1118 | "autoload": { 1119 | "psr-4": { 1120 | "GuzzleHttp\\Psr7\\": "src/" 1121 | }, 1122 | "files": [ 1123 | "src/functions_include.php" 1124 | ] 1125 | }, 1126 | "notification-url": "https://packagist.org/downloads/", 1127 | "license": [ 1128 | "MIT" 1129 | ], 1130 | "authors": [ 1131 | { 1132 | "name": "Michael Dowling", 1133 | "email": "mtdowling@gmail.com", 1134 | "homepage": "https://github.com/mtdowling" 1135 | }, 1136 | { 1137 | "name": "Tobias Schultze", 1138 | "homepage": "https://github.com/Tobion" 1139 | } 1140 | ], 1141 | "description": "PSR-7 message implementation that also provides common utility methods", 1142 | "keywords": [ 1143 | "http", 1144 | "message", 1145 | "request", 1146 | "response", 1147 | "stream", 1148 | "uri", 1149 | "url" 1150 | ], 1151 | "time": "2018-04-24T00:35:57+00:00" 1152 | }, 1153 | { 1154 | "name": "jakub-onderka/php-console-color", 1155 | "version": "0.1", 1156 | "source": { 1157 | "type": "git", 1158 | "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", 1159 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" 1160 | }, 1161 | "dist": { 1162 | "type": "zip", 1163 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", 1164 | "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", 1165 | "shasum": "" 1166 | }, 1167 | "require": { 1168 | "php": ">=5.3.2" 1169 | }, 1170 | "require-dev": { 1171 | "jakub-onderka/php-code-style": "1.0", 1172 | "jakub-onderka/php-parallel-lint": "0.*", 1173 | "jakub-onderka/php-var-dump-check": "0.*", 1174 | "phpunit/phpunit": "3.7.*", 1175 | "squizlabs/php_codesniffer": "1.*" 1176 | }, 1177 | "type": "library", 1178 | "autoload": { 1179 | "psr-0": { 1180 | "JakubOnderka\\PhpConsoleColor": "src/" 1181 | } 1182 | }, 1183 | "notification-url": "https://packagist.org/downloads/", 1184 | "license": [ 1185 | "BSD-2-Clause" 1186 | ], 1187 | "authors": [ 1188 | { 1189 | "name": "Jakub Onderka", 1190 | "email": "jakub.onderka@gmail.com", 1191 | "homepage": "http://www.acci.cz" 1192 | } 1193 | ], 1194 | "time": "2014-04-08T15:00:19+00:00" 1195 | }, 1196 | { 1197 | "name": "jakub-onderka/php-console-highlighter", 1198 | "version": "v0.3.2", 1199 | "source": { 1200 | "type": "git", 1201 | "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", 1202 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" 1203 | }, 1204 | "dist": { 1205 | "type": "zip", 1206 | "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", 1207 | "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", 1208 | "shasum": "" 1209 | }, 1210 | "require": { 1211 | "jakub-onderka/php-console-color": "~0.1", 1212 | "php": ">=5.3.0" 1213 | }, 1214 | "require-dev": { 1215 | "jakub-onderka/php-code-style": "~1.0", 1216 | "jakub-onderka/php-parallel-lint": "~0.5", 1217 | "jakub-onderka/php-var-dump-check": "~0.1", 1218 | "phpunit/phpunit": "~4.0", 1219 | "squizlabs/php_codesniffer": "~1.5" 1220 | }, 1221 | "type": "library", 1222 | "autoload": { 1223 | "psr-0": { 1224 | "JakubOnderka\\PhpConsoleHighlighter": "src/" 1225 | } 1226 | }, 1227 | "notification-url": "https://packagist.org/downloads/", 1228 | "license": [ 1229 | "MIT" 1230 | ], 1231 | "authors": [ 1232 | { 1233 | "name": "Jakub Onderka", 1234 | "email": "acci@acci.cz", 1235 | "homepage": "http://www.acci.cz/" 1236 | } 1237 | ], 1238 | "time": "2015-04-20T18:58:01+00:00" 1239 | }, 1240 | { 1241 | "name": "nikic/php-parser", 1242 | "version": "dev-master", 1243 | "source": { 1244 | "type": "git", 1245 | "url": "https://github.com/nikic/PHP-Parser.git", 1246 | "reference": "e6452e8d15cab62075ffabeed44d1e378f3fc270" 1247 | }, 1248 | "dist": { 1249 | "type": "zip", 1250 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e6452e8d15cab62075ffabeed44d1e378f3fc270", 1251 | "reference": "e6452e8d15cab62075ffabeed44d1e378f3fc270", 1252 | "shasum": "" 1253 | }, 1254 | "require": { 1255 | "ext-tokenizer": "*", 1256 | "php": ">=7.0" 1257 | }, 1258 | "require-dev": { 1259 | "phpunit/phpunit": "^6.5 || ^7.0" 1260 | }, 1261 | "bin": [ 1262 | "bin/php-parse" 1263 | ], 1264 | "type": "library", 1265 | "extra": { 1266 | "branch-alias": { 1267 | "dev-master": "4.0-dev" 1268 | } 1269 | }, 1270 | "autoload": { 1271 | "psr-4": { 1272 | "PhpParser\\": "lib/PhpParser" 1273 | } 1274 | }, 1275 | "notification-url": "https://packagist.org/downloads/", 1276 | "license": [ 1277 | "BSD-3-Clause" 1278 | ], 1279 | "authors": [ 1280 | { 1281 | "name": "Nikita Popov" 1282 | } 1283 | ], 1284 | "description": "A PHP parser written in PHP", 1285 | "keywords": [ 1286 | "parser", 1287 | "php" 1288 | ], 1289 | "time": "2018-05-05T21:45:25+00:00" 1290 | }, 1291 | { 1292 | "name": "paragonie/random_compat", 1293 | "version": "v2.0.12", 1294 | "source": { 1295 | "type": "git", 1296 | "url": "https://github.com/paragonie/random_compat.git", 1297 | "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" 1298 | }, 1299 | "dist": { 1300 | "type": "zip", 1301 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", 1302 | "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", 1303 | "shasum": "" 1304 | }, 1305 | "require": { 1306 | "php": ">=5.2.0" 1307 | }, 1308 | "require-dev": { 1309 | "phpunit/phpunit": "4.*|5.*" 1310 | }, 1311 | "suggest": { 1312 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 1313 | }, 1314 | "type": "library", 1315 | "autoload": { 1316 | "files": [ 1317 | "lib/random.php" 1318 | ] 1319 | }, 1320 | "notification-url": "https://packagist.org/downloads/", 1321 | "license": [ 1322 | "MIT" 1323 | ], 1324 | "authors": [ 1325 | { 1326 | "name": "Paragon Initiative Enterprises", 1327 | "email": "security@paragonie.com", 1328 | "homepage": "https://paragonie.com" 1329 | } 1330 | ], 1331 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 1332 | "keywords": [ 1333 | "csprng", 1334 | "pseudorandom", 1335 | "random" 1336 | ], 1337 | "time": "2018-04-04T21:24:14+00:00" 1338 | }, 1339 | { 1340 | "name": "psr/container", 1341 | "version": "dev-master", 1342 | "source": { 1343 | "type": "git", 1344 | "url": "https://github.com/php-fig/container.git", 1345 | "reference": "2cc4a01788191489dc7459446ba832fa79a216a7" 1346 | }, 1347 | "dist": { 1348 | "type": "zip", 1349 | "url": "https://api.github.com/repos/php-fig/container/zipball/2cc4a01788191489dc7459446ba832fa79a216a7", 1350 | "reference": "2cc4a01788191489dc7459446ba832fa79a216a7", 1351 | "shasum": "" 1352 | }, 1353 | "require": { 1354 | "php": ">=5.3.0" 1355 | }, 1356 | "type": "library", 1357 | "extra": { 1358 | "branch-alias": { 1359 | "dev-master": "1.0.x-dev" 1360 | } 1361 | }, 1362 | "autoload": { 1363 | "psr-4": { 1364 | "Psr\\Container\\": "src/" 1365 | } 1366 | }, 1367 | "notification-url": "https://packagist.org/downloads/", 1368 | "license": [ 1369 | "MIT" 1370 | ], 1371 | "authors": [ 1372 | { 1373 | "name": "PHP-FIG", 1374 | "homepage": "http://www.php-fig.org/" 1375 | } 1376 | ], 1377 | "description": "Common Container Interface (PHP FIG PSR-11)", 1378 | "homepage": "https://github.com/php-fig/container", 1379 | "keywords": [ 1380 | "PSR-11", 1381 | "container", 1382 | "container-interface", 1383 | "container-interop", 1384 | "psr" 1385 | ], 1386 | "time": "2017-06-28T15:35:32+00:00" 1387 | }, 1388 | { 1389 | "name": "psr/http-message", 1390 | "version": "dev-master", 1391 | "source": { 1392 | "type": "git", 1393 | "url": "https://github.com/php-fig/http-message.git", 1394 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1395 | }, 1396 | "dist": { 1397 | "type": "zip", 1398 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1399 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1400 | "shasum": "" 1401 | }, 1402 | "require": { 1403 | "php": ">=5.3.0" 1404 | }, 1405 | "type": "library", 1406 | "extra": { 1407 | "branch-alias": { 1408 | "dev-master": "1.0.x-dev" 1409 | } 1410 | }, 1411 | "autoload": { 1412 | "psr-4": { 1413 | "Psr\\Http\\Message\\": "src/" 1414 | } 1415 | }, 1416 | "notification-url": "https://packagist.org/downloads/", 1417 | "license": [ 1418 | "MIT" 1419 | ], 1420 | "authors": [ 1421 | { 1422 | "name": "PHP-FIG", 1423 | "homepage": "http://www.php-fig.org/" 1424 | } 1425 | ], 1426 | "description": "Common interface for HTTP messages", 1427 | "homepage": "https://github.com/php-fig/http-message", 1428 | "keywords": [ 1429 | "http", 1430 | "http-message", 1431 | "psr", 1432 | "psr-7", 1433 | "request", 1434 | "response" 1435 | ], 1436 | "time": "2016-08-06T14:39:51+00:00" 1437 | }, 1438 | { 1439 | "name": "psr/log", 1440 | "version": "dev-master", 1441 | "source": { 1442 | "type": "git", 1443 | "url": "https://github.com/php-fig/log.git", 1444 | "reference": "3490ba5925e6dcbe6de950c5c6b8dce9f6e96eda" 1445 | }, 1446 | "dist": { 1447 | "type": "zip", 1448 | "url": "https://api.github.com/repos/php-fig/log/zipball/3490ba5925e6dcbe6de950c5c6b8dce9f6e96eda", 1449 | "reference": "3490ba5925e6dcbe6de950c5c6b8dce9f6e96eda", 1450 | "shasum": "" 1451 | }, 1452 | "require": { 1453 | "php": ">=5.3.0" 1454 | }, 1455 | "type": "library", 1456 | "extra": { 1457 | "branch-alias": { 1458 | "dev-master": "1.0.x-dev" 1459 | } 1460 | }, 1461 | "autoload": { 1462 | "psr-4": { 1463 | "Psr\\Log\\": "Psr/Log/" 1464 | } 1465 | }, 1466 | "notification-url": "https://packagist.org/downloads/", 1467 | "license": [ 1468 | "MIT" 1469 | ], 1470 | "authors": [ 1471 | { 1472 | "name": "PHP-FIG", 1473 | "homepage": "http://www.php-fig.org/" 1474 | } 1475 | ], 1476 | "description": "Common interface for logging libraries", 1477 | "homepage": "https://github.com/php-fig/log", 1478 | "keywords": [ 1479 | "log", 1480 | "psr", 1481 | "psr-3" 1482 | ], 1483 | "time": "2018-04-03T15:59:15+00:00" 1484 | }, 1485 | { 1486 | "name": "psy/psysh", 1487 | "version": "dev-develop", 1488 | "source": { 1489 | "type": "git", 1490 | "url": "https://github.com/bobthecow/psysh.git", 1491 | "reference": "a95a657bbf1a2e968a69c36f8dce72526bfcc003" 1492 | }, 1493 | "dist": { 1494 | "type": "zip", 1495 | "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a95a657bbf1a2e968a69c36f8dce72526bfcc003", 1496 | "reference": "a95a657bbf1a2e968a69c36f8dce72526bfcc003", 1497 | "shasum": "" 1498 | }, 1499 | "require": { 1500 | "dnoegel/php-xdg-base-dir": "0.1", 1501 | "jakub-onderka/php-console-highlighter": "0.3.*", 1502 | "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", 1503 | "php": ">=5.4.0", 1504 | "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0", 1505 | "symfony/var-dumper": "~2.7|~3.0|~4.0" 1506 | }, 1507 | "require-dev": { 1508 | "bamarni/composer-bin-plugin": "^1.2", 1509 | "hoa/console": "~2.15|~3.16", 1510 | "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" 1511 | }, 1512 | "suggest": { 1513 | "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", 1514 | "ext-pdo-sqlite": "The doc command requires SQLite to work.", 1515 | "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", 1516 | "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", 1517 | "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." 1518 | }, 1519 | "bin": [ 1520 | "bin/psysh" 1521 | ], 1522 | "type": "library", 1523 | "extra": { 1524 | "branch-alias": { 1525 | "dev-develop": "0.9.x-dev" 1526 | } 1527 | }, 1528 | "autoload": { 1529 | "files": [ 1530 | "src/functions.php" 1531 | ], 1532 | "psr-4": { 1533 | "Psy\\": "src/" 1534 | } 1535 | }, 1536 | "notification-url": "https://packagist.org/downloads/", 1537 | "license": [ 1538 | "MIT" 1539 | ], 1540 | "authors": [ 1541 | { 1542 | "name": "Justin Hileman", 1543 | "email": "justin@justinhileman.info", 1544 | "homepage": "http://justinhileman.com" 1545 | } 1546 | ], 1547 | "description": "An interactive shell for modern PHP.", 1548 | "homepage": "http://psysh.org", 1549 | "keywords": [ 1550 | "REPL", 1551 | "console", 1552 | "interactive", 1553 | "shell" 1554 | ], 1555 | "time": "2018-05-08T15:46:49+00:00" 1556 | }, 1557 | { 1558 | "name": "ralouphie/getallheaders", 1559 | "version": "2.0.5", 1560 | "source": { 1561 | "type": "git", 1562 | "url": "https://github.com/ralouphie/getallheaders.git", 1563 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" 1564 | }, 1565 | "dist": { 1566 | "type": "zip", 1567 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 1568 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 1569 | "shasum": "" 1570 | }, 1571 | "require": { 1572 | "php": ">=5.3" 1573 | }, 1574 | "require-dev": { 1575 | "phpunit/phpunit": "~3.7.0", 1576 | "satooshi/php-coveralls": ">=1.0" 1577 | }, 1578 | "type": "library", 1579 | "autoload": { 1580 | "files": [ 1581 | "src/getallheaders.php" 1582 | ] 1583 | }, 1584 | "notification-url": "https://packagist.org/downloads/", 1585 | "license": [ 1586 | "MIT" 1587 | ], 1588 | "authors": [ 1589 | { 1590 | "name": "Ralph Khattar", 1591 | "email": "ralph.khattar@gmail.com" 1592 | } 1593 | ], 1594 | "description": "A polyfill for getallheaders.", 1595 | "time": "2016-02-11T07:05:27+00:00" 1596 | }, 1597 | { 1598 | "name": "stecman/symfony-console-completion", 1599 | "version": "0.8.0", 1600 | "source": { 1601 | "type": "git", 1602 | "url": "https://github.com/stecman/symfony-console-completion.git", 1603 | "reference": "cd738867503477e91dbe84173dfabd431c883431" 1604 | }, 1605 | "dist": { 1606 | "type": "zip", 1607 | "url": "https://api.github.com/repos/stecman/symfony-console-completion/zipball/cd738867503477e91dbe84173dfabd431c883431", 1608 | "reference": "cd738867503477e91dbe84173dfabd431c883431", 1609 | "shasum": "" 1610 | }, 1611 | "require": { 1612 | "php": ">=5.3.2", 1613 | "symfony/console": "~2.3 || ~3.0 || ~4.0" 1614 | }, 1615 | "require-dev": { 1616 | "phpunit/phpunit": "~4.8.36 || ~5.7 || ~6.4" 1617 | }, 1618 | "type": "library", 1619 | "extra": { 1620 | "branch-alias": { 1621 | "dev-master": "0.6.x-dev" 1622 | } 1623 | }, 1624 | "autoload": { 1625 | "psr-4": { 1626 | "Stecman\\Component\\Symfony\\Console\\BashCompletion\\": "src/" 1627 | } 1628 | }, 1629 | "notification-url": "https://packagist.org/downloads/", 1630 | "license": [ 1631 | "MIT" 1632 | ], 1633 | "authors": [ 1634 | { 1635 | "name": "Stephen Holdaway", 1636 | "email": "stephen@stecman.co.nz" 1637 | } 1638 | ], 1639 | "description": "Automatic BASH completion for Symfony Console Component based applications.", 1640 | "time": "2018-02-10T04:28:01+00:00" 1641 | }, 1642 | { 1643 | "name": "symfony/config", 1644 | "version": "3.4.x-dev", 1645 | "source": { 1646 | "type": "git", 1647 | "url": "https://github.com/symfony/config.git", 1648 | "reference": "cdfb1cddb71bcd7bfbc97660edb4f7ca1c3ac663" 1649 | }, 1650 | "dist": { 1651 | "type": "zip", 1652 | "url": "https://api.github.com/repos/symfony/config/zipball/cdfb1cddb71bcd7bfbc97660edb4f7ca1c3ac663", 1653 | "reference": "cdfb1cddb71bcd7bfbc97660edb4f7ca1c3ac663", 1654 | "shasum": "" 1655 | }, 1656 | "require": { 1657 | "php": "^5.5.9|>=7.0.8", 1658 | "symfony/filesystem": "~2.8|~3.0|~4.0", 1659 | "symfony/polyfill-ctype": "~1.8" 1660 | }, 1661 | "conflict": { 1662 | "symfony/dependency-injection": "<3.3", 1663 | "symfony/finder": "<3.3" 1664 | }, 1665 | "require-dev": { 1666 | "symfony/dependency-injection": "~3.3|~4.0", 1667 | "symfony/event-dispatcher": "~3.3|~4.0", 1668 | "symfony/finder": "~3.3|~4.0", 1669 | "symfony/yaml": "~3.0|~4.0" 1670 | }, 1671 | "suggest": { 1672 | "symfony/yaml": "To use the yaml reference dumper" 1673 | }, 1674 | "type": "library", 1675 | "extra": { 1676 | "branch-alias": { 1677 | "dev-master": "3.4-dev" 1678 | } 1679 | }, 1680 | "autoload": { 1681 | "psr-4": { 1682 | "Symfony\\Component\\Config\\": "" 1683 | }, 1684 | "exclude-from-classmap": [ 1685 | "/Tests/" 1686 | ] 1687 | }, 1688 | "notification-url": "https://packagist.org/downloads/", 1689 | "license": [ 1690 | "MIT" 1691 | ], 1692 | "authors": [ 1693 | { 1694 | "name": "Fabien Potencier", 1695 | "email": "fabien@symfony.com" 1696 | }, 1697 | { 1698 | "name": "Symfony Community", 1699 | "homepage": "https://symfony.com/contributors" 1700 | } 1701 | ], 1702 | "description": "Symfony Config Component", 1703 | "homepage": "https://symfony.com", 1704 | "time": "2018-05-01T22:53:27+00:00" 1705 | }, 1706 | { 1707 | "name": "symfony/console", 1708 | "version": "3.4.x-dev", 1709 | "source": { 1710 | "type": "git", 1711 | "url": "https://github.com/symfony/console.git", 1712 | "reference": "5b1fdfa8eb93464bcc36c34da39cedffef822cdf" 1713 | }, 1714 | "dist": { 1715 | "type": "zip", 1716 | "url": "https://api.github.com/repos/symfony/console/zipball/5b1fdfa8eb93464bcc36c34da39cedffef822cdf", 1717 | "reference": "5b1fdfa8eb93464bcc36c34da39cedffef822cdf", 1718 | "shasum": "" 1719 | }, 1720 | "require": { 1721 | "php": "^5.5.9|>=7.0.8", 1722 | "symfony/debug": "~2.8|~3.0|~4.0", 1723 | "symfony/polyfill-mbstring": "~1.0" 1724 | }, 1725 | "conflict": { 1726 | "symfony/dependency-injection": "<3.4", 1727 | "symfony/process": "<3.3" 1728 | }, 1729 | "require-dev": { 1730 | "psr/log": "~1.0", 1731 | "symfony/config": "~3.3|~4.0", 1732 | "symfony/dependency-injection": "~3.4|~4.0", 1733 | "symfony/event-dispatcher": "~2.8|~3.0|~4.0", 1734 | "symfony/lock": "~3.4|~4.0", 1735 | "symfony/process": "~3.3|~4.0" 1736 | }, 1737 | "suggest": { 1738 | "psr/log-implementation": "For using the console logger", 1739 | "symfony/event-dispatcher": "", 1740 | "symfony/lock": "", 1741 | "symfony/process": "" 1742 | }, 1743 | "type": "library", 1744 | "extra": { 1745 | "branch-alias": { 1746 | "dev-master": "3.4-dev" 1747 | } 1748 | }, 1749 | "autoload": { 1750 | "psr-4": { 1751 | "Symfony\\Component\\Console\\": "" 1752 | }, 1753 | "exclude-from-classmap": [ 1754 | "/Tests/" 1755 | ] 1756 | }, 1757 | "notification-url": "https://packagist.org/downloads/", 1758 | "license": [ 1759 | "MIT" 1760 | ], 1761 | "authors": [ 1762 | { 1763 | "name": "Fabien Potencier", 1764 | "email": "fabien@symfony.com" 1765 | }, 1766 | { 1767 | "name": "Symfony Community", 1768 | "homepage": "https://symfony.com/contributors" 1769 | } 1770 | ], 1771 | "description": "Symfony Console Component", 1772 | "homepage": "https://symfony.com", 1773 | "time": "2018-04-30T01:22:56+00:00" 1774 | }, 1775 | { 1776 | "name": "symfony/css-selector", 1777 | "version": "3.4.x-dev", 1778 | "source": { 1779 | "type": "git", 1780 | "url": "https://github.com/symfony/css-selector.git", 1781 | "reference": "519a80d7c1d95c6cc0b67f686d15fe27c6910de0" 1782 | }, 1783 | "dist": { 1784 | "type": "zip", 1785 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/519a80d7c1d95c6cc0b67f686d15fe27c6910de0", 1786 | "reference": "519a80d7c1d95c6cc0b67f686d15fe27c6910de0", 1787 | "shasum": "" 1788 | }, 1789 | "require": { 1790 | "php": "^5.5.9|>=7.0.8" 1791 | }, 1792 | "type": "library", 1793 | "extra": { 1794 | "branch-alias": { 1795 | "dev-master": "3.4-dev" 1796 | } 1797 | }, 1798 | "autoload": { 1799 | "psr-4": { 1800 | "Symfony\\Component\\CssSelector\\": "" 1801 | }, 1802 | "exclude-from-classmap": [ 1803 | "/Tests/" 1804 | ] 1805 | }, 1806 | "notification-url": "https://packagist.org/downloads/", 1807 | "license": [ 1808 | "MIT" 1809 | ], 1810 | "authors": [ 1811 | { 1812 | "name": "Jean-François Simon", 1813 | "email": "jeanfrancois.simon@sensiolabs.com" 1814 | }, 1815 | { 1816 | "name": "Fabien Potencier", 1817 | "email": "fabien@symfony.com" 1818 | }, 1819 | { 1820 | "name": "Symfony Community", 1821 | "homepage": "https://symfony.com/contributors" 1822 | } 1823 | ], 1824 | "description": "Symfony CssSelector Component", 1825 | "homepage": "https://symfony.com", 1826 | "time": "2018-03-19T22:32:39+00:00" 1827 | }, 1828 | { 1829 | "name": "symfony/debug", 1830 | "version": "3.4.x-dev", 1831 | "source": { 1832 | "type": "git", 1833 | "url": "https://github.com/symfony/debug.git", 1834 | "reference": "1b95888cfd996484527cb41e8952d9a5eaf7454f" 1835 | }, 1836 | "dist": { 1837 | "type": "zip", 1838 | "url": "https://api.github.com/repos/symfony/debug/zipball/1b95888cfd996484527cb41e8952d9a5eaf7454f", 1839 | "reference": "1b95888cfd996484527cb41e8952d9a5eaf7454f", 1840 | "shasum": "" 1841 | }, 1842 | "require": { 1843 | "php": "^5.5.9|>=7.0.8", 1844 | "psr/log": "~1.0" 1845 | }, 1846 | "conflict": { 1847 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 1848 | }, 1849 | "require-dev": { 1850 | "symfony/http-kernel": "~2.8|~3.0|~4.0" 1851 | }, 1852 | "type": "library", 1853 | "extra": { 1854 | "branch-alias": { 1855 | "dev-master": "3.4-dev" 1856 | } 1857 | }, 1858 | "autoload": { 1859 | "psr-4": { 1860 | "Symfony\\Component\\Debug\\": "" 1861 | }, 1862 | "exclude-from-classmap": [ 1863 | "/Tests/" 1864 | ] 1865 | }, 1866 | "notification-url": "https://packagist.org/downloads/", 1867 | "license": [ 1868 | "MIT" 1869 | ], 1870 | "authors": [ 1871 | { 1872 | "name": "Fabien Potencier", 1873 | "email": "fabien@symfony.com" 1874 | }, 1875 | { 1876 | "name": "Symfony Community", 1877 | "homepage": "https://symfony.com/contributors" 1878 | } 1879 | ], 1880 | "description": "Symfony Debug Component", 1881 | "homepage": "https://symfony.com", 1882 | "time": "2018-04-30T16:53:52+00:00" 1883 | }, 1884 | { 1885 | "name": "symfony/dependency-injection", 1886 | "version": "3.4.x-dev", 1887 | "source": { 1888 | "type": "git", 1889 | "url": "https://github.com/symfony/dependency-injection.git", 1890 | "reference": "54ff9d78b56429f9a1ac12e60bfb6d169c0468e3" 1891 | }, 1892 | "dist": { 1893 | "type": "zip", 1894 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/54ff9d78b56429f9a1ac12e60bfb6d169c0468e3", 1895 | "reference": "54ff9d78b56429f9a1ac12e60bfb6d169c0468e3", 1896 | "shasum": "" 1897 | }, 1898 | "require": { 1899 | "php": "^5.5.9|>=7.0.8", 1900 | "psr/container": "^1.0" 1901 | }, 1902 | "conflict": { 1903 | "symfony/config": "<3.3.7", 1904 | "symfony/finder": "<3.3", 1905 | "symfony/proxy-manager-bridge": "<3.4", 1906 | "symfony/yaml": "<3.4" 1907 | }, 1908 | "provide": { 1909 | "psr/container-implementation": "1.0" 1910 | }, 1911 | "require-dev": { 1912 | "symfony/config": "~3.3|~4.0", 1913 | "symfony/expression-language": "~2.8|~3.0|~4.0", 1914 | "symfony/yaml": "~3.4|~4.0" 1915 | }, 1916 | "suggest": { 1917 | "symfony/config": "", 1918 | "symfony/expression-language": "For using expressions in service container configuration", 1919 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", 1920 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", 1921 | "symfony/yaml": "" 1922 | }, 1923 | "type": "library", 1924 | "extra": { 1925 | "branch-alias": { 1926 | "dev-master": "3.4-dev" 1927 | } 1928 | }, 1929 | "autoload": { 1930 | "psr-4": { 1931 | "Symfony\\Component\\DependencyInjection\\": "" 1932 | }, 1933 | "exclude-from-classmap": [ 1934 | "/Tests/" 1935 | ] 1936 | }, 1937 | "notification-url": "https://packagist.org/downloads/", 1938 | "license": [ 1939 | "MIT" 1940 | ], 1941 | "authors": [ 1942 | { 1943 | "name": "Fabien Potencier", 1944 | "email": "fabien@symfony.com" 1945 | }, 1946 | { 1947 | "name": "Symfony Community", 1948 | "homepage": "https://symfony.com/contributors" 1949 | } 1950 | ], 1951 | "description": "Symfony DependencyInjection Component", 1952 | "homepage": "https://symfony.com", 1953 | "time": "2018-04-29T14:04:08+00:00" 1954 | }, 1955 | { 1956 | "name": "symfony/dom-crawler", 1957 | "version": "3.4.x-dev", 1958 | "source": { 1959 | "type": "git", 1960 | "url": "https://github.com/symfony/dom-crawler.git", 1961 | "reference": "201b210fafcdd193c1e45b2994bf7133fb6263e8" 1962 | }, 1963 | "dist": { 1964 | "type": "zip", 1965 | "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/201b210fafcdd193c1e45b2994bf7133fb6263e8", 1966 | "reference": "201b210fafcdd193c1e45b2994bf7133fb6263e8", 1967 | "shasum": "" 1968 | }, 1969 | "require": { 1970 | "php": "^5.5.9|>=7.0.8", 1971 | "symfony/polyfill-ctype": "~1.8", 1972 | "symfony/polyfill-mbstring": "~1.0" 1973 | }, 1974 | "require-dev": { 1975 | "symfony/css-selector": "~2.8|~3.0|~4.0" 1976 | }, 1977 | "suggest": { 1978 | "symfony/css-selector": "" 1979 | }, 1980 | "type": "library", 1981 | "extra": { 1982 | "branch-alias": { 1983 | "dev-master": "3.4-dev" 1984 | } 1985 | }, 1986 | "autoload": { 1987 | "psr-4": { 1988 | "Symfony\\Component\\DomCrawler\\": "" 1989 | }, 1990 | "exclude-from-classmap": [ 1991 | "/Tests/" 1992 | ] 1993 | }, 1994 | "notification-url": "https://packagist.org/downloads/", 1995 | "license": [ 1996 | "MIT" 1997 | ], 1998 | "authors": [ 1999 | { 2000 | "name": "Fabien Potencier", 2001 | "email": "fabien@symfony.com" 2002 | }, 2003 | { 2004 | "name": "Symfony Community", 2005 | "homepage": "https://symfony.com/contributors" 2006 | } 2007 | ], 2008 | "description": "Symfony DomCrawler Component", 2009 | "homepage": "https://symfony.com", 2010 | "time": "2018-05-01T22:53:27+00:00" 2011 | }, 2012 | { 2013 | "name": "symfony/event-dispatcher", 2014 | "version": "3.4.x-dev", 2015 | "source": { 2016 | "type": "git", 2017 | "url": "https://github.com/symfony/event-dispatcher.git", 2018 | "reference": "fdd5abcebd1061ec647089c6c41a07ed60af09f8" 2019 | }, 2020 | "dist": { 2021 | "type": "zip", 2022 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fdd5abcebd1061ec647089c6c41a07ed60af09f8", 2023 | "reference": "fdd5abcebd1061ec647089c6c41a07ed60af09f8", 2024 | "shasum": "" 2025 | }, 2026 | "require": { 2027 | "php": "^5.5.9|>=7.0.8" 2028 | }, 2029 | "conflict": { 2030 | "symfony/dependency-injection": "<3.3" 2031 | }, 2032 | "require-dev": { 2033 | "psr/log": "~1.0", 2034 | "symfony/config": "~2.8|~3.0|~4.0", 2035 | "symfony/dependency-injection": "~3.3|~4.0", 2036 | "symfony/expression-language": "~2.8|~3.0|~4.0", 2037 | "symfony/stopwatch": "~2.8|~3.0|~4.0" 2038 | }, 2039 | "suggest": { 2040 | "symfony/dependency-injection": "", 2041 | "symfony/http-kernel": "" 2042 | }, 2043 | "type": "library", 2044 | "extra": { 2045 | "branch-alias": { 2046 | "dev-master": "3.4-dev" 2047 | } 2048 | }, 2049 | "autoload": { 2050 | "psr-4": { 2051 | "Symfony\\Component\\EventDispatcher\\": "" 2052 | }, 2053 | "exclude-from-classmap": [ 2054 | "/Tests/" 2055 | ] 2056 | }, 2057 | "notification-url": "https://packagist.org/downloads/", 2058 | "license": [ 2059 | "MIT" 2060 | ], 2061 | "authors": [ 2062 | { 2063 | "name": "Fabien Potencier", 2064 | "email": "fabien@symfony.com" 2065 | }, 2066 | { 2067 | "name": "Symfony Community", 2068 | "homepage": "https://symfony.com/contributors" 2069 | } 2070 | ], 2071 | "description": "Symfony EventDispatcher Component", 2072 | "homepage": "https://symfony.com", 2073 | "time": "2018-04-06T07:35:25+00:00" 2074 | }, 2075 | { 2076 | "name": "symfony/filesystem", 2077 | "version": "3.4.x-dev", 2078 | "source": { 2079 | "type": "git", 2080 | "url": "https://github.com/symfony/filesystem.git", 2081 | "reference": "d961178b56f0fdacd7d2d1dc13202b7cb36b4a51" 2082 | }, 2083 | "dist": { 2084 | "type": "zip", 2085 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/d961178b56f0fdacd7d2d1dc13202b7cb36b4a51", 2086 | "reference": "d961178b56f0fdacd7d2d1dc13202b7cb36b4a51", 2087 | "shasum": "" 2088 | }, 2089 | "require": { 2090 | "php": "^5.5.9|>=7.0.8", 2091 | "symfony/polyfill-ctype": "~1.8" 2092 | }, 2093 | "type": "library", 2094 | "extra": { 2095 | "branch-alias": { 2096 | "dev-master": "3.4-dev" 2097 | } 2098 | }, 2099 | "autoload": { 2100 | "psr-4": { 2101 | "Symfony\\Component\\Filesystem\\": "" 2102 | }, 2103 | "exclude-from-classmap": [ 2104 | "/Tests/" 2105 | ] 2106 | }, 2107 | "notification-url": "https://packagist.org/downloads/", 2108 | "license": [ 2109 | "MIT" 2110 | ], 2111 | "authors": [ 2112 | { 2113 | "name": "Fabien Potencier", 2114 | "email": "fabien@symfony.com" 2115 | }, 2116 | { 2117 | "name": "Symfony Community", 2118 | "homepage": "https://symfony.com/contributors" 2119 | } 2120 | ], 2121 | "description": "Symfony Filesystem Component", 2122 | "homepage": "https://symfony.com", 2123 | "time": "2018-05-01T22:53:27+00:00" 2124 | }, 2125 | { 2126 | "name": "symfony/finder", 2127 | "version": "3.4.x-dev", 2128 | "source": { 2129 | "type": "git", 2130 | "url": "https://github.com/symfony/finder.git", 2131 | "reference": "bd14efe8b1fabc4de82bf50dce62f05f9a102433" 2132 | }, 2133 | "dist": { 2134 | "type": "zip", 2135 | "url": "https://api.github.com/repos/symfony/finder/zipball/bd14efe8b1fabc4de82bf50dce62f05f9a102433", 2136 | "reference": "bd14efe8b1fabc4de82bf50dce62f05f9a102433", 2137 | "shasum": "" 2138 | }, 2139 | "require": { 2140 | "php": "^5.5.9|>=7.0.8" 2141 | }, 2142 | "type": "library", 2143 | "extra": { 2144 | "branch-alias": { 2145 | "dev-master": "3.4-dev" 2146 | } 2147 | }, 2148 | "autoload": { 2149 | "psr-4": { 2150 | "Symfony\\Component\\Finder\\": "" 2151 | }, 2152 | "exclude-from-classmap": [ 2153 | "/Tests/" 2154 | ] 2155 | }, 2156 | "notification-url": "https://packagist.org/downloads/", 2157 | "license": [ 2158 | "MIT" 2159 | ], 2160 | "authors": [ 2161 | { 2162 | "name": "Fabien Potencier", 2163 | "email": "fabien@symfony.com" 2164 | }, 2165 | { 2166 | "name": "Symfony Community", 2167 | "homepage": "https://symfony.com/contributors" 2168 | } 2169 | ], 2170 | "description": "Symfony Finder Component", 2171 | "homepage": "https://symfony.com", 2172 | "time": "2018-04-04T05:07:11+00:00" 2173 | }, 2174 | { 2175 | "name": "symfony/http-foundation", 2176 | "version": "3.4.x-dev", 2177 | "source": { 2178 | "type": "git", 2179 | "url": "https://github.com/symfony/http-foundation.git", 2180 | "reference": "0d8a033a553570771d5811a887eff2db3959adaf" 2181 | }, 2182 | "dist": { 2183 | "type": "zip", 2184 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0d8a033a553570771d5811a887eff2db3959adaf", 2185 | "reference": "0d8a033a553570771d5811a887eff2db3959adaf", 2186 | "shasum": "" 2187 | }, 2188 | "require": { 2189 | "php": "^5.5.9|>=7.0.8", 2190 | "symfony/polyfill-mbstring": "~1.1", 2191 | "symfony/polyfill-php70": "~1.6" 2192 | }, 2193 | "require-dev": { 2194 | "symfony/expression-language": "~2.8|~3.0|~4.0" 2195 | }, 2196 | "type": "library", 2197 | "extra": { 2198 | "branch-alias": { 2199 | "dev-master": "3.4-dev" 2200 | } 2201 | }, 2202 | "autoload": { 2203 | "psr-4": { 2204 | "Symfony\\Component\\HttpFoundation\\": "" 2205 | }, 2206 | "exclude-from-classmap": [ 2207 | "/Tests/" 2208 | ] 2209 | }, 2210 | "notification-url": "https://packagist.org/downloads/", 2211 | "license": [ 2212 | "MIT" 2213 | ], 2214 | "authors": [ 2215 | { 2216 | "name": "Fabien Potencier", 2217 | "email": "fabien@symfony.com" 2218 | }, 2219 | { 2220 | "name": "Symfony Community", 2221 | "homepage": "https://symfony.com/contributors" 2222 | } 2223 | ], 2224 | "description": "Symfony HttpFoundation Component", 2225 | "homepage": "https://symfony.com", 2226 | "time": "2018-05-11T15:52:51+00:00" 2227 | }, 2228 | { 2229 | "name": "symfony/polyfill-ctype", 2230 | "version": "dev-master", 2231 | "source": { 2232 | "type": "git", 2233 | "url": "https://github.com/symfony/polyfill-ctype.git", 2234 | "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" 2235 | }, 2236 | "dist": { 2237 | "type": "zip", 2238 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", 2239 | "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", 2240 | "shasum": "" 2241 | }, 2242 | "require": { 2243 | "php": ">=5.3.3" 2244 | }, 2245 | "type": "library", 2246 | "extra": { 2247 | "branch-alias": { 2248 | "dev-master": "1.8-dev" 2249 | } 2250 | }, 2251 | "autoload": { 2252 | "psr-4": { 2253 | "Symfony\\Polyfill\\Ctype\\": "" 2254 | }, 2255 | "files": [ 2256 | "bootstrap.php" 2257 | ] 2258 | }, 2259 | "notification-url": "https://packagist.org/downloads/", 2260 | "license": [ 2261 | "MIT" 2262 | ], 2263 | "authors": [ 2264 | { 2265 | "name": "Symfony Community", 2266 | "homepage": "https://symfony.com/contributors" 2267 | }, 2268 | { 2269 | "name": "Gert de Pagter", 2270 | "email": "BackEndTea@gmail.com" 2271 | } 2272 | ], 2273 | "description": "Symfony polyfill for ctype functions", 2274 | "homepage": "https://symfony.com", 2275 | "keywords": [ 2276 | "compatibility", 2277 | "ctype", 2278 | "polyfill", 2279 | "portable" 2280 | ], 2281 | "time": "2018-04-30T19:57:29+00:00" 2282 | }, 2283 | { 2284 | "name": "symfony/polyfill-mbstring", 2285 | "version": "dev-master", 2286 | "source": { 2287 | "type": "git", 2288 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2289 | "reference": "3296adf6a6454a050679cde90f95350ad604b171" 2290 | }, 2291 | "dist": { 2292 | "type": "zip", 2293 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", 2294 | "reference": "3296adf6a6454a050679cde90f95350ad604b171", 2295 | "shasum": "" 2296 | }, 2297 | "require": { 2298 | "php": ">=5.3.3" 2299 | }, 2300 | "suggest": { 2301 | "ext-mbstring": "For best performance" 2302 | }, 2303 | "type": "library", 2304 | "extra": { 2305 | "branch-alias": { 2306 | "dev-master": "1.8-dev" 2307 | } 2308 | }, 2309 | "autoload": { 2310 | "psr-4": { 2311 | "Symfony\\Polyfill\\Mbstring\\": "" 2312 | }, 2313 | "files": [ 2314 | "bootstrap.php" 2315 | ] 2316 | }, 2317 | "notification-url": "https://packagist.org/downloads/", 2318 | "license": [ 2319 | "MIT" 2320 | ], 2321 | "authors": [ 2322 | { 2323 | "name": "Nicolas Grekas", 2324 | "email": "p@tchwork.com" 2325 | }, 2326 | { 2327 | "name": "Symfony Community", 2328 | "homepage": "https://symfony.com/contributors" 2329 | } 2330 | ], 2331 | "description": "Symfony polyfill for the Mbstring extension", 2332 | "homepage": "https://symfony.com", 2333 | "keywords": [ 2334 | "compatibility", 2335 | "mbstring", 2336 | "polyfill", 2337 | "portable", 2338 | "shim" 2339 | ], 2340 | "time": "2018-04-26T10:06:28+00:00" 2341 | }, 2342 | { 2343 | "name": "symfony/polyfill-php70", 2344 | "version": "dev-master", 2345 | "source": { 2346 | "type": "git", 2347 | "url": "https://github.com/symfony/polyfill-php70.git", 2348 | "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6" 2349 | }, 2350 | "dist": { 2351 | "type": "zip", 2352 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6", 2353 | "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6", 2354 | "shasum": "" 2355 | }, 2356 | "require": { 2357 | "paragonie/random_compat": "~1.0|~2.0", 2358 | "php": ">=5.3.3" 2359 | }, 2360 | "type": "library", 2361 | "extra": { 2362 | "branch-alias": { 2363 | "dev-master": "1.8-dev" 2364 | } 2365 | }, 2366 | "autoload": { 2367 | "psr-4": { 2368 | "Symfony\\Polyfill\\Php70\\": "" 2369 | }, 2370 | "files": [ 2371 | "bootstrap.php" 2372 | ], 2373 | "classmap": [ 2374 | "Resources/stubs" 2375 | ] 2376 | }, 2377 | "notification-url": "https://packagist.org/downloads/", 2378 | "license": [ 2379 | "MIT" 2380 | ], 2381 | "authors": [ 2382 | { 2383 | "name": "Nicolas Grekas", 2384 | "email": "p@tchwork.com" 2385 | }, 2386 | { 2387 | "name": "Symfony Community", 2388 | "homepage": "https://symfony.com/contributors" 2389 | } 2390 | ], 2391 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", 2392 | "homepage": "https://symfony.com", 2393 | "keywords": [ 2394 | "compatibility", 2395 | "polyfill", 2396 | "portable", 2397 | "shim" 2398 | ], 2399 | "time": "2018-04-26T10:06:28+00:00" 2400 | }, 2401 | { 2402 | "name": "symfony/polyfill-php72", 2403 | "version": "dev-master", 2404 | "source": { 2405 | "type": "git", 2406 | "url": "https://github.com/symfony/polyfill-php72.git", 2407 | "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46" 2408 | }, 2409 | "dist": { 2410 | "type": "zip", 2411 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46", 2412 | "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46", 2413 | "shasum": "" 2414 | }, 2415 | "require": { 2416 | "php": ">=5.3.3" 2417 | }, 2418 | "type": "library", 2419 | "extra": { 2420 | "branch-alias": { 2421 | "dev-master": "1.8-dev" 2422 | } 2423 | }, 2424 | "autoload": { 2425 | "psr-4": { 2426 | "Symfony\\Polyfill\\Php72\\": "" 2427 | }, 2428 | "files": [ 2429 | "bootstrap.php" 2430 | ] 2431 | }, 2432 | "notification-url": "https://packagist.org/downloads/", 2433 | "license": [ 2434 | "MIT" 2435 | ], 2436 | "authors": [ 2437 | { 2438 | "name": "Nicolas Grekas", 2439 | "email": "p@tchwork.com" 2440 | }, 2441 | { 2442 | "name": "Symfony Community", 2443 | "homepage": "https://symfony.com/contributors" 2444 | } 2445 | ], 2446 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 2447 | "homepage": "https://symfony.com", 2448 | "keywords": [ 2449 | "compatibility", 2450 | "polyfill", 2451 | "portable", 2452 | "shim" 2453 | ], 2454 | "time": "2018-04-26T10:06:28+00:00" 2455 | }, 2456 | { 2457 | "name": "symfony/process", 2458 | "version": "3.4.x-dev", 2459 | "source": { 2460 | "type": "git", 2461 | "url": "https://github.com/symfony/process.git", 2462 | "reference": "4b7d64e852886319e93ddfdecff0d744ab87658b" 2463 | }, 2464 | "dist": { 2465 | "type": "zip", 2466 | "url": "https://api.github.com/repos/symfony/process/zipball/4b7d64e852886319e93ddfdecff0d744ab87658b", 2467 | "reference": "4b7d64e852886319e93ddfdecff0d744ab87658b", 2468 | "shasum": "" 2469 | }, 2470 | "require": { 2471 | "php": "^5.5.9|>=7.0.8" 2472 | }, 2473 | "type": "library", 2474 | "extra": { 2475 | "branch-alias": { 2476 | "dev-master": "3.4-dev" 2477 | } 2478 | }, 2479 | "autoload": { 2480 | "psr-4": { 2481 | "Symfony\\Component\\Process\\": "" 2482 | }, 2483 | "exclude-from-classmap": [ 2484 | "/Tests/" 2485 | ] 2486 | }, 2487 | "notification-url": "https://packagist.org/downloads/", 2488 | "license": [ 2489 | "MIT" 2490 | ], 2491 | "authors": [ 2492 | { 2493 | "name": "Fabien Potencier", 2494 | "email": "fabien@symfony.com" 2495 | }, 2496 | { 2497 | "name": "Symfony Community", 2498 | "homepage": "https://symfony.com/contributors" 2499 | } 2500 | ], 2501 | "description": "Symfony Process Component", 2502 | "homepage": "https://symfony.com", 2503 | "time": "2018-04-03T05:22:50+00:00" 2504 | }, 2505 | { 2506 | "name": "symfony/translation", 2507 | "version": "3.4.x-dev", 2508 | "source": { 2509 | "type": "git", 2510 | "url": "https://github.com/symfony/translation.git", 2511 | "reference": "98414bcb7031632c04bbc9049bde325c49afb536" 2512 | }, 2513 | "dist": { 2514 | "type": "zip", 2515 | "url": "https://api.github.com/repos/symfony/translation/zipball/98414bcb7031632c04bbc9049bde325c49afb536", 2516 | "reference": "98414bcb7031632c04bbc9049bde325c49afb536", 2517 | "shasum": "" 2518 | }, 2519 | "require": { 2520 | "php": "^5.5.9|>=7.0.8", 2521 | "symfony/polyfill-mbstring": "~1.0" 2522 | }, 2523 | "conflict": { 2524 | "symfony/config": "<2.8", 2525 | "symfony/dependency-injection": "<3.4", 2526 | "symfony/yaml": "<3.4" 2527 | }, 2528 | "require-dev": { 2529 | "psr/log": "~1.0", 2530 | "symfony/config": "~2.8|~3.0|~4.0", 2531 | "symfony/dependency-injection": "~3.4|~4.0", 2532 | "symfony/finder": "~2.8|~3.0|~4.0", 2533 | "symfony/intl": "^2.8.18|^3.2.5|~4.0", 2534 | "symfony/yaml": "~3.4|~4.0" 2535 | }, 2536 | "suggest": { 2537 | "psr/log-implementation": "To use logging capability in translator", 2538 | "symfony/config": "", 2539 | "symfony/yaml": "" 2540 | }, 2541 | "type": "library", 2542 | "extra": { 2543 | "branch-alias": { 2544 | "dev-master": "3.4-dev" 2545 | } 2546 | }, 2547 | "autoload": { 2548 | "psr-4": { 2549 | "Symfony\\Component\\Translation\\": "" 2550 | }, 2551 | "exclude-from-classmap": [ 2552 | "/Tests/" 2553 | ] 2554 | }, 2555 | "notification-url": "https://packagist.org/downloads/", 2556 | "license": [ 2557 | "MIT" 2558 | ], 2559 | "authors": [ 2560 | { 2561 | "name": "Fabien Potencier", 2562 | "email": "fabien@symfony.com" 2563 | }, 2564 | { 2565 | "name": "Symfony Community", 2566 | "homepage": "https://symfony.com/contributors" 2567 | } 2568 | ], 2569 | "description": "Symfony Translation Component", 2570 | "homepage": "https://symfony.com", 2571 | "time": "2018-05-03T23:18:14+00:00" 2572 | }, 2573 | { 2574 | "name": "symfony/var-dumper", 2575 | "version": "dev-master", 2576 | "source": { 2577 | "type": "git", 2578 | "url": "https://github.com/symfony/var-dumper.git", 2579 | "reference": "09e2ad60edf3c89d83146bc53bfa49fe592df87b" 2580 | }, 2581 | "dist": { 2582 | "type": "zip", 2583 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/09e2ad60edf3c89d83146bc53bfa49fe592df87b", 2584 | "reference": "09e2ad60edf3c89d83146bc53bfa49fe592df87b", 2585 | "shasum": "" 2586 | }, 2587 | "require": { 2588 | "php": "^7.1.3", 2589 | "symfony/polyfill-mbstring": "~1.0", 2590 | "symfony/polyfill-php72": "~1.5" 2591 | }, 2592 | "conflict": { 2593 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 2594 | "symfony/console": "<3.4" 2595 | }, 2596 | "require-dev": { 2597 | "ext-iconv": "*", 2598 | "symfony/process": "~3.4|~4.0", 2599 | "twig/twig": "~1.34|~2.4" 2600 | }, 2601 | "suggest": { 2602 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 2603 | "ext-intl": "To show region name in time zone dump", 2604 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 2605 | }, 2606 | "bin": [ 2607 | "Resources/bin/var-dump-server" 2608 | ], 2609 | "type": "library", 2610 | "extra": { 2611 | "branch-alias": { 2612 | "dev-master": "4.2-dev" 2613 | } 2614 | }, 2615 | "autoload": { 2616 | "files": [ 2617 | "Resources/functions/dump.php" 2618 | ], 2619 | "psr-4": { 2620 | "Symfony\\Component\\VarDumper\\": "" 2621 | }, 2622 | "exclude-from-classmap": [ 2623 | "/Tests/" 2624 | ] 2625 | }, 2626 | "notification-url": "https://packagist.org/downloads/", 2627 | "license": [ 2628 | "MIT" 2629 | ], 2630 | "authors": [ 2631 | { 2632 | "name": "Nicolas Grekas", 2633 | "email": "p@tchwork.com" 2634 | }, 2635 | { 2636 | "name": "Symfony Community", 2637 | "homepage": "https://symfony.com/contributors" 2638 | } 2639 | ], 2640 | "description": "Symfony mechanism for exploring and dumping PHP variables", 2641 | "homepage": "https://symfony.com", 2642 | "keywords": [ 2643 | "debug", 2644 | "dump" 2645 | ], 2646 | "time": "2018-05-07T14:51:25+00:00" 2647 | }, 2648 | { 2649 | "name": "symfony/yaml", 2650 | "version": "3.4.x-dev", 2651 | "source": { 2652 | "type": "git", 2653 | "url": "https://github.com/symfony/yaml.git", 2654 | "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0" 2655 | }, 2656 | "dist": { 2657 | "type": "zip", 2658 | "url": "https://api.github.com/repos/symfony/yaml/zipball/c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", 2659 | "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", 2660 | "shasum": "" 2661 | }, 2662 | "require": { 2663 | "php": "^5.5.9|>=7.0.8", 2664 | "symfony/polyfill-ctype": "~1.8" 2665 | }, 2666 | "conflict": { 2667 | "symfony/console": "<3.4" 2668 | }, 2669 | "require-dev": { 2670 | "symfony/console": "~3.4|~4.0" 2671 | }, 2672 | "suggest": { 2673 | "symfony/console": "For validating YAML files using the lint command" 2674 | }, 2675 | "type": "library", 2676 | "extra": { 2677 | "branch-alias": { 2678 | "dev-master": "3.4-dev" 2679 | } 2680 | }, 2681 | "autoload": { 2682 | "psr-4": { 2683 | "Symfony\\Component\\Yaml\\": "" 2684 | }, 2685 | "exclude-from-classmap": [ 2686 | "/Tests/" 2687 | ] 2688 | }, 2689 | "notification-url": "https://packagist.org/downloads/", 2690 | "license": [ 2691 | "MIT" 2692 | ], 2693 | "authors": [ 2694 | { 2695 | "name": "Fabien Potencier", 2696 | "email": "fabien@symfony.com" 2697 | }, 2698 | { 2699 | "name": "Symfony Community", 2700 | "homepage": "https://symfony.com/contributors" 2701 | } 2702 | ], 2703 | "description": "Symfony Yaml Component", 2704 | "homepage": "https://symfony.com", 2705 | "time": "2018-05-03T23:18:14+00:00" 2706 | }, 2707 | { 2708 | "name": "twig/twig", 2709 | "version": "1.x-dev", 2710 | "source": { 2711 | "type": "git", 2712 | "url": "https://github.com/twigphp/Twig.git", 2713 | "reference": "ed02b30a17a4d5e29b7a965c7c5fdc85f9be7bc0" 2714 | }, 2715 | "dist": { 2716 | "type": "zip", 2717 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/ed02b30a17a4d5e29b7a965c7c5fdc85f9be7bc0", 2718 | "reference": "ed02b30a17a4d5e29b7a965c7c5fdc85f9be7bc0", 2719 | "shasum": "" 2720 | }, 2721 | "require": { 2722 | "php": ">=5.3.3", 2723 | "symfony/polyfill-ctype": "^1.8" 2724 | }, 2725 | "require-dev": { 2726 | "psr/container": "^1.0", 2727 | "symfony/debug": "^2.7", 2728 | "symfony/phpunit-bridge": "^3.3" 2729 | }, 2730 | "type": "library", 2731 | "extra": { 2732 | "branch-alias": { 2733 | "dev-master": "1.35-dev" 2734 | } 2735 | }, 2736 | "autoload": { 2737 | "psr-0": { 2738 | "Twig_": "lib/" 2739 | }, 2740 | "psr-4": { 2741 | "Twig\\": "src/" 2742 | } 2743 | }, 2744 | "notification-url": "https://packagist.org/downloads/", 2745 | "license": [ 2746 | "BSD-3-Clause" 2747 | ], 2748 | "authors": [ 2749 | { 2750 | "name": "Fabien Potencier", 2751 | "email": "fabien@symfony.com", 2752 | "homepage": "http://fabien.potencier.org", 2753 | "role": "Lead Developer" 2754 | }, 2755 | { 2756 | "name": "Armin Ronacher", 2757 | "email": "armin.ronacher@active-4.com", 2758 | "role": "Project Founder" 2759 | }, 2760 | { 2761 | "name": "Twig Team", 2762 | "homepage": "https://twig.symfony.com/contributors", 2763 | "role": "Contributors" 2764 | } 2765 | ], 2766 | "description": "Twig, the flexible, fast, and secure template language for PHP", 2767 | "homepage": "https://twig.symfony.com", 2768 | "keywords": [ 2769 | "templating" 2770 | ], 2771 | "time": "2018-05-02T15:04:18+00:00" 2772 | }, 2773 | { 2774 | "name": "webflo/drupal-finder", 2775 | "version": "1.1.0", 2776 | "source": { 2777 | "type": "git", 2778 | "url": "https://github.com/webflo/drupal-finder.git", 2779 | "reference": "8a7886c575d6eaa67a425dceccc84e735c0b9637" 2780 | }, 2781 | "dist": { 2782 | "type": "zip", 2783 | "url": "https://api.github.com/repos/webflo/drupal-finder/zipball/8a7886c575d6eaa67a425dceccc84e735c0b9637", 2784 | "reference": "8a7886c575d6eaa67a425dceccc84e735c0b9637", 2785 | "shasum": "" 2786 | }, 2787 | "require-dev": { 2788 | "mikey179/vfsstream": "^1.6", 2789 | "phpunit/phpunit": "^4.8" 2790 | }, 2791 | "type": "library", 2792 | "autoload": { 2793 | "classmap": [ 2794 | "src/DrupalFinder.php" 2795 | ] 2796 | }, 2797 | "notification-url": "https://packagist.org/downloads/", 2798 | "license": [ 2799 | "GPL-2.0+" 2800 | ], 2801 | "authors": [ 2802 | { 2803 | "name": "Florian Weber", 2804 | "email": "florian@webflo.org" 2805 | } 2806 | ], 2807 | "description": "Helper class to locate a Drupal installation from a given path.", 2808 | "time": "2017-10-24T08:12:11+00:00" 2809 | }, 2810 | { 2811 | "name": "webmozart/assert", 2812 | "version": "dev-master", 2813 | "source": { 2814 | "type": "git", 2815 | "url": "https://github.com/webmozart/assert.git", 2816 | "reference": "23bf61bc8a7cc229d7ce8689b1bf818a9e192cac" 2817 | }, 2818 | "dist": { 2819 | "type": "zip", 2820 | "url": "https://api.github.com/repos/webmozart/assert/zipball/23bf61bc8a7cc229d7ce8689b1bf818a9e192cac", 2821 | "reference": "23bf61bc8a7cc229d7ce8689b1bf818a9e192cac", 2822 | "shasum": "" 2823 | }, 2824 | "require": { 2825 | "php": "^5.3.3 || ^7.0" 2826 | }, 2827 | "require-dev": { 2828 | "phpunit/phpunit": "^4.6", 2829 | "sebastian/version": "^1.0.1" 2830 | }, 2831 | "type": "library", 2832 | "extra": { 2833 | "branch-alias": { 2834 | "dev-master": "1.3-dev" 2835 | } 2836 | }, 2837 | "autoload": { 2838 | "psr-4": { 2839 | "Webmozart\\Assert\\": "src/" 2840 | } 2841 | }, 2842 | "notification-url": "https://packagist.org/downloads/", 2843 | "license": [ 2844 | "MIT" 2845 | ], 2846 | "authors": [ 2847 | { 2848 | "name": "Bernhard Schussek", 2849 | "email": "bschussek@gmail.com" 2850 | } 2851 | ], 2852 | "description": "Assertions to validate method input/output with nice error messages.", 2853 | "keywords": [ 2854 | "assert", 2855 | "check", 2856 | "validate" 2857 | ], 2858 | "time": "2018-04-19T15:46:26+00:00" 2859 | }, 2860 | { 2861 | "name": "webmozart/path-util", 2862 | "version": "dev-master", 2863 | "source": { 2864 | "type": "git", 2865 | "url": "https://github.com/webmozart/path-util.git", 2866 | "reference": "95a8f7ad150c2a3773ff3c3d04f557a24c99cfd2" 2867 | }, 2868 | "dist": { 2869 | "type": "zip", 2870 | "url": "https://api.github.com/repos/webmozart/path-util/zipball/95a8f7ad150c2a3773ff3c3d04f557a24c99cfd2", 2871 | "reference": "95a8f7ad150c2a3773ff3c3d04f557a24c99cfd2", 2872 | "shasum": "" 2873 | }, 2874 | "require": { 2875 | "php": "^5.3.3|^7.0", 2876 | "webmozart/assert": "~1.0" 2877 | }, 2878 | "require-dev": { 2879 | "phpunit/phpunit": "^4.6", 2880 | "sebastian/version": "^1.0.1" 2881 | }, 2882 | "type": "library", 2883 | "extra": { 2884 | "branch-alias": { 2885 | "dev-master": "2.3-dev" 2886 | } 2887 | }, 2888 | "autoload": { 2889 | "psr-4": { 2890 | "Webmozart\\PathUtil\\": "src/" 2891 | } 2892 | }, 2893 | "notification-url": "https://packagist.org/downloads/", 2894 | "license": [ 2895 | "MIT" 2896 | ], 2897 | "authors": [ 2898 | { 2899 | "name": "Bernhard Schussek", 2900 | "email": "bschussek@gmail.com" 2901 | } 2902 | ], 2903 | "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", 2904 | "time": "2016-08-15T15:31:42+00:00" 2905 | } 2906 | ], 2907 | "aliases": [], 2908 | "minimum-stability": "dev", 2909 | "stability-flags": { 2910 | "drupal/drupal": 20, 2911 | "drupal/console": 20 2912 | }, 2913 | "prefer-stable": false, 2914 | "prefer-lowest": false, 2915 | "platform": [], 2916 | "platform-dev": [] 2917 | } 2918 | -------------------------------------------------------------------------------- /05-Versions/README.md: -------------------------------------------------------------------------------- 1 | # Working with Package Versions 2 | 3 | https://getcomposer.org/doc/articles/versions.md 4 | 5 | When working with Composer, you won't generally specify exact versions. 6 | Instead, you'll use version constraints, like wildcards. This is important 7 | when dealing with updates to packages, and the part of Composer that causes 8 | the most confusion. 9 | 10 | **The most important thing to note is that Composer does a lot of work to 11 | figure out what package to retrieve. That doesn't always result in the newest version.** 12 | 13 | #### Exact version 14 | 15 | ```$xslt 16 | "drupal/drupal": "8.5.1" 17 | ``` 18 | 19 | This is an exact version. If you specify a dependency this way, Composer will 20 | retrieve this exact version, and never update it. It will always use `8.5.1`. 21 | 22 | #### Wildcard 23 | 24 | ```$xslt 25 | "drupal/drupal": "8.5.*" 26 | ``` 27 | 28 | This will retrieve any version of 8.5 that meets Composer's requirements. 29 | `8.5.0`, `8.5.1`, `8.5.2`, etc, but not `8.6.x`. 30 | 31 | #### Range 32 | 33 | ```$xslt 34 | "drupal/drupal": ">=8.5 <8.6" 35 | ``` 36 | 37 | This is equivalent to the wildcard above. `8.5.0` and up, but not `8.6.x`. 38 | 39 | #### Tilde 40 | 41 | ```$xslt 42 | "drupal/drupal": "~8.5.0" 43 | ``` 44 | 45 | The tilde character will tell Composer to only increment the last digit when 46 | retrieving the package or updating. If `8.5.0` is the only one that works, that 47 | is what you get. If `8.5.9` is available and satisfies dependencies, you'll get 48 | that one. But, never `8.6.x`. 49 | 50 | ```$xslt 51 | "drupal/drupal": "~8.5" 52 | ``` 53 | 54 | Leaving off the third digit reduces the number of significant digits, so 55 | Composer can increment the 5. It can retrieve any version of `8.5.x`, `8.6.x`, 56 | `8.7.x`, etc, but not `9.x`. 57 | 58 | #### Caret 59 | 60 | ```$xslt 61 | "drupal/drupal": "^8.5.0" 62 | ``` 63 | 64 | The caret is less restrictive than the tilde. It can increment the 0 and 65 | the 5, but not the 8. So, `8.5.0`, `8.5.9`, `8.6.2`, `8.9.5`, etc, but not `9.x`. 66 | 67 | #### Branches 68 | 69 | ```$xslt 70 | "drupal/drupal": "8.6.x-dev" 71 | ``` 72 | 73 | These versions ultimately trace back to software releases in version control 74 | systems. Most of the public projects are coming from Git repos on github.com. You 75 | may want to retrieve a specific branch, like the current development branch. This 76 | is why our Drupal example in the previous steps has `-dev` attached. This, 77 | as written, will retrieve Drupal's 8.6 development branch. 78 | 79 | https://packagist.org/packages/drupal/drupal#8.6.x-dev 80 | 81 | ## Using version constraints 82 | 83 | Let's update the requirement sections of the `composer.json` file to now use 84 | version constrains. Remember, editing the file is no different than using the 85 | `require` command. 86 | 87 | ```$xslt 88 | "require": { 89 | "drupal/drupal": "~8.5.3" 90 | }, 91 | "require-dev": { 92 | "drupal/console": "^1.0.0" 93 | } 94 | ``` 95 | 96 | This `composer.json` file is in a new directory, with no vendor directory. 97 | We are treating this like a new project, with a prebuilt json file. So, after 98 | changing the json file, run `composer install`. (Just use the `composer.json` 99 | file included in this directory of the tutorial.) 100 | 101 | ```$xslt 102 | $ composer install 103 | 1/11: http://packagist.org/p/provider-archived$afa373e95aa9fa7678612f8c7a961c6373160760005c1f8f41450f2860d933f9.json 104 | 2/11: http://packagist.org/p/provider-2013$e8a58721d48f09fca4bf257fac28558dc991cef7b48c19788e27bff3a99281d4.json 105 | ... 106 | Finished: success: 11, skipped: 0, failure: 0, total: 11 107 | Loading composer repositories with package information 108 | Updating dependencies (including require-dev) 109 | 1/50: https://codeload.github.com/dflydev/dflydev-placeholder-resolver/legacy.zip/c498d0cae91b1bb36cc7d60906dab8e62bb7c356 110 | 2/50: https://codeload.github.com/alchemy-fr/Zippy/legacy.zip/5ffdc93de0af2770d396bf433d8b2667c77277ea 111 | ... 112 | 50/50: https://codeload.github.com/drupal/drupal/legacy.zip/be1f0d7d06c9bc744f9b54f2aad25297ba78eb2d 113 | Finished: success: 50, skipped: 0, failure: 0, total: 50 114 | Package operations: 50 installs, 0 updates, 0 removals 115 | - Installing wikimedia/composer-merge-plugin (v1.4.1): Loading from cache 116 | - Installing composer/installers (v1.5.0): Loading from cache 117 | ... 118 | Writing lock file 119 | Generating autoload files 120 | Loading composer repositories with package information 121 | Updating dependencies (including require-dev) 122 | Nothing to install or update 123 | Generating autoload files 124 | ``` 125 | 126 | What was the result? If we look at `composer.lock`, we see the following: 127 | 128 | ```$xslt 129 | "name": "drupal/drupal", 130 | "version": "8.5.x-dev", 131 | ... 132 | "name": "drupal/console", 133 | "version": "1.8.0", 134 | ``` 135 | 136 | Composer retrieved the latest of Drupal `8.5.x`, which is the dev release, 137 | since we still have `"minimum-stability": "dev"` in our file. But, it did not 138 | go up to `8.6`. For Console, it retrieved `1.8.0`, which is the most current 139 | 1.x release as of this writing. It blew past `1.0.0`, and `1.0.1`, and 140 | `1.1.0` and `1.2.5`, etc. 141 | 142 | This is why the lock file is so important. We need to know the exact result, because 143 | we are often dealing with version ranges. -------------------------------------------------------------------------------- /05-Versions/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "require": { 13 | "drupal/drupal": "~8.5.3" 14 | }, 15 | "require-dev": { 16 | "drupal/console": "^1.0.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /06-Stability/README.md: -------------------------------------------------------------------------------- 1 | # Defining Stability 2 | 3 | https://getcomposer.org/doc/04-schema.md#minimum-stability 4 | 5 | In the previous examples/steps of this tutorial we've been getting dev versions 6 | of packages. This is because of the minimum stability question that was presented 7 | during `composer init`. It added the following to the `composer.json` file: 8 | 9 | ```$xslt 10 | "minimum-stability": "dev" 11 | ``` 12 | 13 | This permits Composer to retrieve development releases. Most of the time you 14 | probably don't want to do that. If you leave the original question blank 15 | Composer won't add anything to the json file and will default to only 16 | retrieving `stable` versions. We can also set this by changing the value in 17 | the json file. 18 | 19 | ```$xslt 20 | "minimum-stability": "stable" 21 | ``` 22 | 23 | The full list of options is: `dev`, `alpha`, `beta`, `RC`, and `stable`. 24 | 25 | ### But wait there's more... 26 | 27 | Perhaps you sometimes want to use dev releases, but most of the time you 28 | want stable releases. There is a setting for that. 29 | 30 | ```$xslt 31 | "prefer-stable": true 32 | ``` 33 | 34 | If you leave the minimum stability set to `dev`, that permits Composer to 35 | retrieve dev versions if it must, but `prefer-stable` tells it to avoid it 36 | if it can. As you can imagine, this can have unpredictable results. 37 | 38 | After adding `prefer-stable` to the `composer.json` file and running `composer install` in this 39 | new directory, lets see the result in the lock file. 40 | 41 | ```$xslt 42 | "name": "drupal/drupal", 43 | "version": "8.5.3", 44 | ... 45 | "name": "drupal/console", 46 | "version": "1.8.0", 47 | ``` 48 | 49 | Drupal Console stayed the same as in the previous step, but now the development 50 | version of Drupal did not get retrieved. `~8.5.3` resulted in `8.5.3` since that 51 | is the latest stable release of 8.5, as of this writing. 52 | 53 | **You aren't limited to just these options. There are other fancy ways you can 54 | specify retrieving dev releases, like adding it to the `required` section, but 55 | this covers most use-cases. Check the Composer documentation linked at the top 56 | for more details.** -------------------------------------------------------------------------------- /06-Stability/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "drupal/drupal": "~8.5.3" 15 | }, 16 | "require-dev": { 17 | "drupal/console": "^1.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /07-Repositories/README.md: -------------------------------------------------------------------------------- 1 | # Adding Repositories 2 | 3 | https://getcomposer.org/doc/04-schema.md#repositories 4 | 5 | The packages we've been requiring so far have all come from packagist.org. If 6 | you look through the Drupal account, you will see Drupal 8, Console, and a few 7 | other things. What you won't see are all the modules and themes you can download 8 | from drupal.org. That would be too much to add to Packagist, especially when all 9 | those individual projects are maintained by different people. 10 | 11 | If you try to require a Drupal module using Composer, you'll see it won't work. 12 | 13 | Try by attempting to require the Devel module, which is a Drupal module that 14 | provides handy development features, like Console does. 15 | 16 | ```$xslt 17 | $ composer require drupal/devel --dev 18 | 19 | [InvalidArgumentException] 20 | Could not find a matching version of package drupal/devel. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (dev). 21 | ``` 22 | 23 | This is because Devel is not listed on packagist.org. 24 | 25 | To solve this problem, Composer lets you add alternate repositories where packages 26 | can be retrieved. Github, Bitbucket, etc. 27 | 28 | For Drupal, specifically, drupal.org provides a "façade" to its Git infrastructure. 29 | That's a fancy way of saying an interface to drupal.org that Composer can treat like 30 | packagist.org. We can add this to our json file with a new `repositories` section. 31 | 32 | ```$xslt 33 | "repositories": [ 34 | { 35 | "type": "composer", 36 | "url": "https://packages.drupal.org/8" 37 | } 38 | ] 39 | ``` 40 | 41 | _This façade was specifically setup for working with Drupal 8, because that is the first 42 | version of Drupal to start using Composer, hence the `/8` in the url. There is now a `/7` 43 | url for Drupal 7 based modules. Drupal modules also have a different version scheme than 44 | Composer expects, so there is some translation going on._ 45 | 46 | Now, when using the `require` command let's see what happens. 47 | 48 | ```$xslt 49 | composer require drupal/devel --dev 50 | ... 51 | Using version ^1.2 for drupal/devel 52 | ./composer.json has been updated 53 | ... 54 | Writing lock file 55 | Generating autoload files 56 | 1/1: http://packagist.org/p/provider-latest$734553e1793e72c786c45ee909374c902541b4adc497992d1243a2d7c7e53704.json 57 | Finished: success: 1, skipped: 0, failure: 0, total: 1 58 | Loading composer repositories with package information 59 | Updating dependencies (including require-dev) 60 | Nothing to install or update 61 | Generating autoload files 62 | ``` 63 | 64 | And, Devel has been added to the `composer.json` file. 65 | 66 | ```$xslt 67 | "require-dev": { 68 | "drupal/console": "^1.0.0", 69 | "drupal/devel": "^1.2" 70 | }, 71 | ``` 72 | 73 | Two things to note here. One, Devel's version number is only two digits. That is 74 | because Drupal modules use a different versioning scheme. Its real version is somthing 75 | like 8.x-1.2. That's why it didn't add `1.2.0` or something similar. Two, Composer 76 | automatically added the caret (^). That is default behavior. If you don't want it 77 | to do that, specify your version and constraint when running the `require` command. 78 | 79 | **Also, if you are playing along at home, you will see that Composer will build a vendor 80 | directory, and put Drupal, Symfony, Console, and all that other stuff in it, but it will 81 | stick Devel in a modules directory. Ignore all that. This is all kinds of broken until 82 | we can tell Composer how to properly setup a Drupal project.** -------------------------------------------------------------------------------- /07-Repositories/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "drupal/drupal": "~8.5.3" 15 | }, 16 | "require-dev": { 17 | "drupal/console": "^1.0.0" 18 | }, 19 | "repositories": [ 20 | { 21 | "type": "composer", 22 | "url": "https://packages.drupal.org/8" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /08-Conflict/README.md: -------------------------------------------------------------------------------- 1 | # Managing Conflicts 2 | 3 | https://getcomposer.org/doc/04-schema.md#conflict 4 | 5 | You may find yourself running into a conflict or two. In general, Composer will manage versions based 6 | on what you provide in the `composer.json` file and what your dependencies provide in their `composer.json` files. 7 | That is why specifying ranges is better than exact versions; especially, when more than one of your dependencies 8 | depends on the same package. 9 | 10 | Sometimes, however, you need to ensure Composer does not retrieve a specific version of a dependency. Composer 11 | provides a field for this called `conflict`. 12 | 13 | ```$xslt 14 | { 15 | "name": "david-hernandez/init", 16 | "description": "Using the init command to create a new project.", 17 | "type": "project", 18 | "authors": [ 19 | { 20 | "name": "David Hernandez", 21 | "email": "david@example.com" 22 | } 23 | ], 24 | "minimum-stability": "dev", 25 | "prefer-stable": true, 26 | "require": { 27 | "drupal/drupal": "~8.5.3" 28 | }, 29 | "require-dev": { 30 | "drupal/console": "^1.0.0" 31 | }, 32 | "conflict": { 33 | "drupal/drupal": "*" 34 | }, 35 | "repositories": [ 36 | { 37 | "type": "composer", 38 | "url": "https://packages.drupal.org/8" 39 | } 40 | ] 41 | } 42 | 43 | ``` 44 | 45 | Add a `conflict` section to the `composer.json` file we've been using in the previous steps and run 46 | `composer install`. You should get the following error. 47 | 48 | ``` 49 | Loading composer repositories with package information 50 | Updating dependencies (including require-dev) 51 | Your requirements could not be resolved to an installable set of packages. 52 | 53 | Problem 1 54 | - drupal/drupal 8.5.3 conflicts with david-hernandez/init[No version set (parsed as 1.0.0)]. 55 | - drupal/drupal 8.5.x-dev conflicts with david-hernandez/init[No version set (parsed as 1.0.0)]. 56 | - Installation request for david-hernandez/init No version set (parsed as 1.0.0) -> satisfiable by david-hernandez/init[No version set (parsed as 1.0.0)]. 57 | - Installation request for drupal/drupal ~8.5.3 -> satisfiable by drupal/drupal[8.5.3, 8.5.x-dev]. 58 | ``` 59 | 60 | Composer was not able to setup the project at all, because it respected the conflict we provided. The 61 | require section tells Composer to retrieve the latest version of Drupal 8.5, but our conflict, which used 62 | a wildcard (*), blocks the use of any version of Drupal. 63 | 64 | Change the Drupal version required, like this: 65 | 66 | ```$xslt 67 | "require": { 68 | "drupal/drupal": "~8.5.0" 69 | }, 70 | ``` 71 | 72 | and change the conflict to this: 73 | 74 | ```$xslt 75 | "conflict": { 76 | "drupal/drupal": "8.5.3" 77 | }, 78 | ``` 79 | 80 | This requirement can be satisfied by any version of 8.5 (8.5.0 and up,) and the conflict tells Composer 81 | 8.5.3 is unacceptable. After the change try `composer install` again. 82 | 83 | ```$xslt 84 | $ composer install 85 | Loading composer repositories with package information 86 | Updating dependencies (including require-dev) 87 | ... 88 | Writing lock file 89 | Generating autoload files 90 | Loading composer repositories with package information 91 | Updating dependencies (including require-dev) 92 | Nothing to install or update 93 | Generating autoload files 94 | ``` 95 | 96 | Checking the `composer.lock` file we see Composer retrieved 8.5.2. 97 | 98 | ```$xslt 99 | "name": "drupal/drupal", 100 | "version": "8.5.2", 101 | ``` 102 | 103 | -------------------------------------------------------------------------------- /08-Conflict/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "drupal/drupal": "~8.5.0" 15 | }, 16 | "require-dev": { 17 | "drupal/console": "^1.0.0" 18 | }, 19 | "conflict": { 20 | "drupal/drupal": "8.5.3" 21 | }, 22 | "repositories": [ 23 | { 24 | "type": "composer", 25 | "url": "https://packages.drupal.org/8" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /09-Scripts/README.md: -------------------------------------------------------------------------------- 1 | # Utilizing Scripts 2 | 3 | https://getcomposer.org/doc/articles/scripts.md 4 | 5 | Composer has the ability to run scripts, and has a collection of triggering events to run those scripts. 6 | Check the documentation for a full list of these events. 7 | 8 | To get Composer to build our Drupal 8 project, we'll take advantage of this functionality. 9 | 10 | Luckily, for Drupal 8, there exists a public scaffolding package that can handle all of the setup tasks 11 | for us. 12 | 13 | https://github.com/drupal-composer/drupal-scaffold 14 | 15 | To use it, require the `drupal-composer/drupal-scaffold` package. 16 | 17 | ```$xslt 18 | "require": { 19 | ... 20 | "drupal-composer/drupal-scaffold": "^2.4" 21 | }, 22 | ``` 23 | 24 | Then, add a `scripts` section to the `composer.json` file. 25 | 26 | ```$xslt 27 | "scripts": { 28 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold" 29 | } 30 | ``` 31 | 32 | The Drupal scaffold project defines a plugin which adds its own event to Composer's list of events. 33 | 34 | If you read the help for Drupal scaffold, you'll see that it does not want you to use the 35 | `drupal/drupal` package. It is instead designed to work with `drupal/core`. This package is slightly 36 | different. It contains just the `core` directory of Drupal. For those that don't know anything about 37 | Drupal, this is a directory inside the root Drupal project directory. Other things, like `index.php` and 38 | the other files and directories outside of the `core` directory will get setup by the scaffolder. 39 | 40 | The json file now looks like this. 41 | 42 | ```$xslt 43 | { 44 | "name": "david-hernandez/init", 45 | "description": "Using the init command to create a new project.", 46 | "type": "project", 47 | "authors": [ 48 | { 49 | "name": "David Hernandez", 50 | "email": "david@example.com" 51 | } 52 | ], 53 | "minimum-stability": "dev", 54 | "prefer-stable": true, 55 | "require": { 56 | "drupal/core": "~8.5.0", 57 | "drupal-composer/drupal-scaffold": "^2.4" 58 | }, 59 | "require-dev": { 60 | "drupal/console": "^1.0.0" 61 | }, 62 | "conflict": { 63 | "drupal/drupal": "*" 64 | }, 65 | "repositories": [ 66 | { 67 | "type": "composer", 68 | "url": "https://packages.drupal.org/8" 69 | } 70 | ], 71 | "scripts": { 72 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold" 73 | } 74 | } 75 | 76 | ``` 77 | 78 | The conflict from the previous step has been changed to a wildcard (*) since we don't want to ever use 79 | the `drupal/drupal` package now. We only want to use `drupal/core`, so this will prevent Composer from 80 | even trying to retrieve it. 81 | 82 | With this new setup, if you run `composer install` you'll see Composer will no longer put Drupal in the 83 | vendor directory. Instead, the scaffolder tries to set it up in the root of the project directory. But, 84 | it's still a bit messy. The scaffolder is treating the project root as the document root of our website. 85 | This can work, but we ultimately want something different. We want to define an actual document root, and 86 | contain our files inside it. To do that, we need to add some extras. -------------------------------------------------------------------------------- /09-Scripts/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "drupal/core": "~8.5.0", 15 | "drupal-composer/drupal-scaffold": "^2.4" 16 | }, 17 | "require-dev": { 18 | "drupal/console": "^1.0.0" 19 | }, 20 | "conflict": { 21 | "drupal/drupal": "*" 22 | }, 23 | "repositories": [ 24 | { 25 | "type": "composer", 26 | "url": "https://packages.drupal.org/8" 27 | } 28 | ], 29 | "scripts": { 30 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /10-Extra/README.md: -------------------------------------------------------------------------------- 1 | # Extras 2 | 3 | https://getcomposer.org/doc/04-schema.md#extra 4 | 5 | Composer supports adding an `extra` section for supplying arbitrary information scripts might need. We'll 6 | use this to supply information that the Drupal scaffolder will use. 7 | 8 | When we first setup a project, one of the questions asked us for a `type`. The answer we gave was `project`, since 9 | that is what most projects use. Drupal has a list of its own types, which comes in handy when using Composer. 10 | If you look at the `composer.json` in the `core` directory or any of the module directories from the 11 | previous steps, you'll see their types declared. 12 | 13 | Drupal 8 declares itself as `drupal-core`, modules declare themselves as `drupal-module`, themes as `drupal-theme`, 14 | and so forth. Using this information, we can tell the scaffolder where to put these files when retrieving 15 | core, modules, theme, and everything else. This goes for the original setup and when later requiring new dependencies. 16 | 17 | ```$xslt 18 | "extra": { 19 | "installer-paths": { 20 | "docroot/core": ["type:drupal-core"], 21 | "docroot/libraries/{$name}": ["type:drupal-library"], 22 | "docroot/modules/contrib/{$name}": ["type:drupal-module"], 23 | "docroot/profiles/contrib/{$name}": ["type:drupal-profile"], 24 | "docroot/themes/contrib/{$name}": ["type:drupal-theme"], 25 | "drush/contrib/{$name}": ["type:drupal-drush"] 26 | } 27 | } 28 | ``` 29 | 30 | As you can see, the scaffolder will now put the Drupal-related things in a `docroot` directory. (You can define 31 | any path here you want.) Drush, is a command-line tool, so we want to leave it outside the document root (which will 32 | be publicly accessible.) The vendor directory, which defaults to the root of the project directory, will also be outside of the 33 | document root. But we don't define the vendor directory here, because Composer takes care of that itself. 34 | 35 | Now, when running `composer install` we get a much more structured project. 36 | 37 | ```$xslt 38 | $ ls -l 39 | -rw-r--r-- 1 davidhernandez staff 1222 May 13 20:18 composer.json 40 | -rw-r--r-- 1 davidhernandez staff 156593 May 13 20:20 composer.lock 41 | drwxr-xr-x 16 davidhernandez staff 544 May 13 20:20 docroot 42 | drwxr-xr-x 29 davidhernandez staff 986 May 13 20:20 vendor 43 | ``` 44 | Drupal 8 (core) is nicely built inside the docroot. 45 | 46 | ```$xslt 47 | $ ls -l docroot/ 48 | -rw-r--r-- 1 davidhernandez staff 1025 May 13 20:20 .csslintrc 49 | -rw-r--r-- 1 davidhernandez staff 357 May 13 20:20 .editorconfig 50 | -rw-r--r-- 1 davidhernandez staff 151 May 13 20:20 .eslintignore 51 | -rw-r--r-- 1 davidhernandez staff 41 May 13 20:20 .eslintrc.json 52 | -rw-r--r-- 1 davidhernandez staff 3858 May 13 20:20 .gitattributes 53 | -rw-r--r-- 1 davidhernandez staff 2306 May 13 20:20 .ht.router.php 54 | -rw-r--r-- 1 davidhernandez staff 7866 May 13 20:20 .htaccess 55 | -rw-rw-rw- 1 davidhernandez staff 385 May 13 20:20 autoload.php 56 | drwxr-xr-x 40 davidhernandez staff 1360 May 13 20:20 core 57 | -rw-r--r-- 1 davidhernandez staff 549 May 13 20:20 index.php 58 | -rw-r--r-- 1 davidhernandez staff 1596 May 13 20:20 robots.txt 59 | drwxr-xr-x 6 davidhernandez staff 204 May 13 20:20 sites 60 | -rw-r--r-- 1 davidhernandez staff 848 May 13 20:20 update.php 61 | -rw-r--r-- 1 davidhernandez staff 4555 May 13 20:20 web.config 62 | ``` 63 | 64 | And, when we require a new Drupal module as a dependency, Composer will put it in the right place. 65 | Thanks to the scaffolder and our `extra` info. 66 | 67 | ```$xslt 68 | $ composer require drupal/devel 69 | 70 | Using version ^1.2 for drupal/devel 71 | ./composer.json has been updated 72 | Loading composer repositories with package information 73 | Updating dependencies (including require-dev) 74 | 1/1: https://ftp.drupal.org/files/projects/devel-8.x-1.2.zip 75 | Finished: success: 1, skipped: 0, failure: 0, total: 1 76 | Package operations: 1 install, 0 updates, 0 removals 77 | - Installing drupal/devel (1.2.0): Loading from cache 78 | Writing lock file 79 | Generating autoload files 80 | 81 | 82 | $ ls -l docroot/modules/contrib/ 83 | 84 | drwxr-xr-x 26 davidhernandez staff 884B May 13 20:35 devel 85 | ``` 86 | 87 | **For Drupal folks, note that this DOES NOT install the module. It only downloads it and places it 88 | in the right directory. You still need to install the module in one of the usual Drupal ways, like 89 | through the web interface.** -------------------------------------------------------------------------------- /10-Extra/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "drupal/core": "~8.5.0", 15 | "drupal-composer/drupal-scaffold": "^2.4" 16 | }, 17 | "require-dev": { 18 | "drupal/console": "^1.0.0" 19 | }, 20 | "conflict": { 21 | "drupal/drupal": "*" 22 | }, 23 | "repositories": [ 24 | { 25 | "type": "composer", 26 | "url": "https://packages.drupal.org/8" 27 | } 28 | ], 29 | "scripts": { 30 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold" 31 | }, 32 | "extra": { 33 | "installer-paths": { 34 | "docroot/core": ["type:drupal-core"], 35 | "docroot/libraries/{$name}": ["type:drupal-library"], 36 | "docroot/modules/contrib/{$name}": ["type:drupal-module"], 37 | "docroot/profiles/contrib/{$name}": ["type:drupal-profile"], 38 | "docroot/themes/contrib/{$name}": ["type:drupal-theme"], 39 | "drush/contrib/{$name}": ["type:drupal-drush"] 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /11-Update/README.md: -------------------------------------------------------------------------------- 1 | # Updating Dependencies 2 | 3 | https://getcomposer.org/doc/03-cli.md#update 4 | 5 | If you followed the previous steps in this tutorial, you will have a `composer.json` file capable of 6 | building a fully-functional Drupal 8 website. But how will you handle future updates? 7 | 8 | Composer comes with an update command. 9 | 10 | ``` 11 | composer update 12 | ``` 13 | 14 | Let's start with the `composer.json` file from the previous step, and remove the tilde from the requirement 15 | for `drupal/core`. 16 | 17 | ``` 18 | "require": { 19 | "drupal/core": "8.5.0" 20 | } 21 | ``` 22 | 23 | When running `composer install` this will setup the project with Drupal 8.5.0. Verify this in the lock file. 24 | 25 | ``` 26 | "name": "drupal/core", 27 | "version": "8.5.0", 28 | ``` 29 | 30 | Return to the `composer.json` file and put the tilde back. 31 | 32 | ``` 33 | "require": { 34 | "drupal/core": "~8.5.0" 35 | } 36 | ``` 37 | 38 | Using the update command we can get Composer to retreive the newer version. 39 | 40 | ``` 41 | $ composer update 42 | ... 43 | Loading composer repositories with package information 44 | Updating dependencies (including require-dev) 45 | 1/1: https://codeload.github.com/drupal/core/legacy.zip/b012f0ae51504880e920f2c6efdbdf03b6fe2129 46 | Finished: success: 1, skipped: 0, failure: 0, total: 1 47 | Package operations: 0 installs, 1 update, 0 removals 48 | - Updating drupal/core (8.5.0 => 8.5.3): Loading from cache 49 | Writing lock file 50 | Generating autoload files 51 | 52 | ``` 53 | 54 | Verfiy in the lock file. (At the time of this writing, 8.5.3 was the latest version of Drupal 8.5.) 55 | 56 | ``` 57 | "name": "drupal/core", 58 | "version": "8.5.3", 59 | ``` 60 | 61 | ### Specifiying what to update 62 | 63 | You don't have to update everything with one command. You can pick and chose packages using the 64 | same syntax as the `require` command. 65 | 66 | One package: 67 | 68 | ``` 69 | composer update drupal/core 70 | ``` 71 | 72 | Multiple packages: 73 | 74 | ``` 75 | composer update drupal/core drupal/devel 76 | ``` 77 | 78 | **It is highly recommended you read through the documentation for the update command (linked above.) 79 | There are lots of options, and updating is a big part of the difficulty people have using Composer. Just 80 | remember that Composer is constantly trying to make sense of not just the packages you ask for, but also all 81 | the various dependencies those packages have.** -------------------------------------------------------------------------------- /11-Update/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "david-hernandez/init", 3 | "description": "Using the init command to create a new project.", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "David Hernandez", 8 | "email": "david@example.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "drupal/core": "~8.5.0", 15 | "drupal-composer/drupal-scaffold": "^2.4" 16 | }, 17 | "require-dev": { 18 | "drupal/console": "^1.0.0" 19 | }, 20 | "conflict": { 21 | "drupal/drupal": "*" 22 | }, 23 | "repositories": [ 24 | { 25 | "type": "composer", 26 | "url": "https://packages.drupal.org/8" 27 | } 28 | ], 29 | "scripts": { 30 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold" 31 | }, 32 | "extra": { 33 | "installer-paths": { 34 | "docroot/core": ["type:drupal-core"], 35 | "docroot/libraries/{$name}": ["type:drupal-library"], 36 | "docroot/modules/contrib/{$name}": ["type:drupal-module"], 37 | "docroot/profiles/contrib/{$name}": ["type:drupal-profile"], 38 | "docroot/themes/contrib/{$name}": ["type:drupal-theme"], 39 | "drush/contrib/{$name}": ["type:drupal-drush"] 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /12-Create-project/README.md: -------------------------------------------------------------------------------- 1 | # Using the `create-project` Command 2 | 3 | https://getcomposer.org/doc/03-cli.md#create-project 4 | 5 | Composer has a command for copying another project. Essentially, using it as a template. It will retrieve the project 6 | and run install using its `composer.json` file. 7 | 8 | ``` 9 | composer create-project 10 | ``` 11 | 12 | The main caveat with `create-project` is it has to be used with an empty directory. Either run it inside 13 | an empty directory or supply a new directory name. Composer will create the new project directory. 14 | 15 | ### Drupal Composer 16 | 17 | https://github.com/drupal-composer/drupal-project 18 | 19 | Drupal Composer has a recommended project for starting Drupal 8 projects that are managed with Composer. 20 | Much of the information in the previous steps of this tutorial is based on the setup of the Drupal Composer project. 21 | 22 | If you run the following in an empty directory it will clone the Drupal Composer project, run the install, and fully setup a 23 | Drupal 8 project (using a directory called `web`, instead of `docroot`.) 24 | 25 | ``` 26 | composer create-project drupal-composer/drupal-project:8.x-dev . --stability dev --no-interaction 27 | ``` 28 | 29 | Let's break down the command. 30 | 31 | ``` 32 | composer create-project 33 | ``` 34 | 35 | The create project command. 36 | 37 | ``` 38 | drupal-composer/drupal-project 39 | ``` 40 | 41 | The vendor and project name. 42 | 43 | ``` 44 | :8.x-dev 45 | ``` 46 | 47 | Retrieve the 8.x-dev version of Drupal Composer project. This is not the Drupal version. If you look at the 48 | `composer.json` file that comes with the project, you will see the version of Drupal it requires. 49 | 50 | ``` 51 | . 52 | ``` 53 | 54 | Following the command, provide the directory name where the project is created. By adding a period, this specifies the 55 | current directory. Remember, the directory must be empty. If you want to put it in a new directory, replace the period 56 | with the directory name. 57 | 58 | ``` 59 | --stability dev 60 | ``` 61 | 62 | Many of the same options used with `init` can be used with `create-project`. This option sets the stability level 63 | to `dev`. 64 | 65 | ``` 66 | --no-interaction 67 | ``` 68 | 69 | `no-interaction` will prevent prompts that ask the user questions. All defaults will be used. 70 | 71 | ### Can't I just copy the `composer.json` file instead? 72 | 73 | No. There is a major difference between duplicating a projects `composer.json` file and duplicating the whole 74 | project. The project may contain additional files, like scripts. If you look at the Drupal Composer project, you will 75 | see it has its own script that performs additional setup tasks, as well as custom drush commands. You could, however, 76 | git clone the project directly from Github. -------------------------------------------------------------------------------- /13-Patches/README.md: -------------------------------------------------------------------------------- 1 | # Applying Patches with Composer 2 | 3 | https://github.com/cweagans/composer-patches 4 | 5 | It is an often occurrence when dealing software that you need to apply a patch to a package you require. 6 | 7 | Composer doesn't provide much functionality for this out of the box, but there is a commonly used tool 8 | for this, created by Cameron Eagans (linked above.) It lets you specify patch files for each dependency, 9 | including urls to download the patch files. The patch files do not need to be included with your code base. 10 | 11 | Using the `create-project` command from step 12 we'll create a new Drupal 8 based project and see how to apply a patch. 12 | 13 | ```$xslt 14 | composer create-project drupal-composer/drupal-project:8.x-dev . --stability dev --no-interaction 15 | 16 | ``` 17 | 18 | **Note that the `composer.json` file in this directory is the result of the above command. It will look different than the 19 | files used in other steps in this tutorial. But, the steps below you can apply to your own `composer.json` file. We just 20 | need a starting point.** 21 | 22 | For this example, we will add the Color Field module as a dependency. (https://www.drupal.org/project/color_field) 23 | 24 | ``` 25 | composer require drupal/color_field:2.0-rc2 26 | ``` 27 | 28 | I am specifying the exact version (2.0-rc2,) because I know the patch supplied below applies to this specific version 29 | of the module. 30 | 31 | A particular bug with this module was reported and worked on here - https://www.drupal.org/node/2882634. Our task will 32 | be to instruct Composer to retrieve and apply one of the patches proposed in that Drupal.org issue. 33 | 34 | ### Patching the module. 35 | 36 | First, we'll need to require the Composer Patches package. (You could also just make this a dev dependency.) 37 | 38 | ```$xslt 39 | composer require cweagans/composer-patches 40 | ``` 41 | 42 | The `composer.json` file should now list both new requirements. 43 | 44 | ```$xslt 45 | "require": { 46 | "composer/installers": "^1.2", 47 | => "cweagans/composer-patches": "^1.6", 48 | "drupal-composer/drupal-scaffold": "^2.2", 49 | => "drupal/color_field": "2.0-rc2", 50 | ... 51 | }, 52 | ``` 53 | 54 | To supply a patch file, add a new section to the `composer.json` file. Patches will go within the `extra` section, because 55 | this is extra information being supplied to the scripts Composer will run. We don't need to define the scripts. They are part 56 | of Composer Patches. 57 | 58 | ``` 59 | "extra": { 60 | ... 61 | "patches": { 62 | "drupal/color_field": { 63 | "Color palette values get duplicated": "https://www.drupal.org/files/issues/color-spectrum-widget-duplicate-2882634-4.patch" 64 | } 65 | } 66 | } 67 | ``` 68 | 69 | Let's break this down a little bit. 70 | 71 | ```$xslt 72 | "drupal/color_field": { 73 | 74 | ``` 75 | Inside the `patches` array, add an array for each dependency you want to patch. Then, line by line, specify your patch 76 | files for that dependency. You can have more than one patch for each dependency. 77 | 78 | ```$xslt 79 | "Color palette values get duplicated": 80 | ``` 81 | 82 | Add a text label for the patch. Make it something easy to identify so someone else looking at this file knows why the 83 | patch is there. 84 | 85 | ```$xslt 86 | https://www.drupal.org/files/issues/color-spectrum-widget-duplicate-2882634-4.patch 87 | ``` 88 | Add the url to the patch file. You can supply a local file system path to a file, so if you are supplying your own patch file, 89 | provide the path to it here. 90 | 91 | ### Applying your patches. 92 | 93 | When you run `composer update`, or when someone runs `composer install` to setup your project, you should see Composer apply the patch. 94 | 95 | ```$xslt 96 | Gathering patches for root package. 97 | Gathering patches for dependencies. This might take a minute. 98 | - Installing drupal/color_field (2.0.0-rc2): Loading from cache 99 | - Applying patches for drupal/color_field 100 | https://www.drupal.org/files/issues/color-spectrum-widget-duplicate-2882634-4.patch (Color palette values get duplicated) 101 | ``` 102 | -------------------------------------------------------------------------------- /13-Patches/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal-composer/drupal-project", 3 | "description": "Project template for Drupal 8 projects with composer", 4 | "type": "project", 5 | "license": "GPL-2.0-or-later", 6 | "authors": [ 7 | { 8 | "name": "", 9 | "role": "" 10 | } 11 | ], 12 | "repositories": [ 13 | { 14 | "type": "composer", 15 | "url": "https://packages.drupal.org/8" 16 | } 17 | ], 18 | "require": { 19 | "composer/installers": "^1.2", 20 | "cweagans/composer-patches": "^1.6", 21 | "drupal-composer/drupal-scaffold": "^2.2", 22 | "drupal/color_field": "2.0-rc2", 23 | "drupal/console": "^1.0.2", 24 | "drupal/core": "~8.5.3", 25 | "drush/drush": "^9.0.0", 26 | "vlucas/phpdotenv": "^2.4", 27 | "webflo/drupal-finder": "^1.0.0", 28 | "webmozart/path-util": "^2.3" 29 | }, 30 | "require-dev": { 31 | "webflo/drupal-core-require-dev": "~8.5.3" 32 | }, 33 | "conflict": { 34 | "drupal/drupal": "*" 35 | }, 36 | "minimum-stability": "dev", 37 | "prefer-stable": true, 38 | "config": { 39 | "sort-packages": true 40 | }, 41 | "autoload": { 42 | "classmap": [ 43 | "scripts/composer/ScriptHandler.php" 44 | ], 45 | "files": ["load.environment.php"] 46 | }, 47 | "scripts": { 48 | "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold", 49 | "pre-install-cmd": [ 50 | "DrupalProject\\composer\\ScriptHandler::checkComposerVersion" 51 | ], 52 | "pre-update-cmd": [ 53 | "DrupalProject\\composer\\ScriptHandler::checkComposerVersion" 54 | ], 55 | "post-install-cmd": [ 56 | "DrupalProject\\composer\\ScriptHandler::createRequiredFiles" 57 | ], 58 | "post-update-cmd": [ 59 | "DrupalProject\\composer\\ScriptHandler::createRequiredFiles" 60 | ] 61 | }, 62 | "extra": { 63 | "installer-paths": { 64 | "web/core": ["type:drupal-core"], 65 | "web/libraries/{$name}": ["type:drupal-library"], 66 | "web/modules/contrib/{$name}": ["type:drupal-module"], 67 | "web/profiles/contrib/{$name}": ["type:drupal-profile"], 68 | "web/themes/contrib/{$name}": ["type:drupal-theme"], 69 | "drush/contrib/{$name}": ["type:drupal-drush"] 70 | }, 71 | "patches": { 72 | "drupal/color_field": { 73 | "Color palette values get duplicated": "https://www.drupal.org/files/issues/color-spectrum-widget-duplicate-2882634-4.patch" 74 | } 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Composer Tutorial 2 | A walk through of various Composer tasks. 3 | 4 | [Composer](//getcomposer.org/) is a dependency manager for PHP. It downloads 5 | public PHP packages (projects, libraries, etc) from Packagist.org. 6 | 7 | Each step in this tutorial goes over basic Composer usage. The 8 | `composer.json` files in each directory should be usable, and each directory 9 | will have a README file explaining the concepts and commands for that step. 10 | 11 | If you find any mistakes, please open an issue or create a pull request. Don't 12 | assume I know what I'm doing.™ 13 | 14 | ## Background 15 | The steps in this tutorial are based on building a [Drupal 8](//drupal.org) project with 16 | Composer, since that was the original motivation for the tutorial. However, 17 | most of what is explained is specific to Composer, not Drupal, so the 18 | information should still be relevant to any PHP project. And since the Drupal 8 19 | use-case is more complex than simple "Hello, World!" functionality, it shows 20 | some of Composer's possibilities. 21 | 22 | ## Before Starting 23 | You need to have Composer installed. This will vary based on operating system. 24 | See the Composer docs for instructions. 25 | 26 | https://getcomposer.org/doc/00-intro.md 27 | 28 | It is important to note that the PHP version you use can matter. Composer uses 29 | whichever version your command line uses. Run `php -v` to see which version 30 | you have. And, be consistent with your project. If your application and web 31 | server will use PHP 7, upgrade your command line to use 7, as well. 32 | 33 | ## Using the `composer` Command 34 | 35 | In this tutorial, all commands begin with the `composer` command. If this does 36 | not work for you, you many have to manually setup an alias or move Composer's 37 | `.phar` file. Composer's installation instructions, linked above, walk you 38 | through that process. 39 | 40 | ## Terminology 41 | 42 | There are two terms that cause some confusion and sometimes are used 43 | interchangeably - **package** and **project**. In this guide, **package** 44 | refers to anything Composer downloads. A PHP library, project, etc. **Project** 45 | refers to the project you are building. --------------------------------------------------------------------------------