Customize distributions with sub-profiles


We've been starting many of our projects using Acquia's Lightning distribution. This gives a good, consistent starting point for and helps speed development through early adoption of features that are still-in-the-works for Drupal 8. Like other distributions, Lightning bundles Drupal Core with a set of contributed modules and pre-defined configuration.While Lightning is a great base to start from, sometimes you want to deviate from the path it provides. Say for example you want to use a Paragraphs based system for page components, your client has a fairly complex custom publishing workflow, and you also have different constraints for managing roles. Out-of-the-box, Acquia Lightning has a number of features you may find yourself in conflict with. Things like Lightning Layout provide a landing page content type that may not fit the needs for the site. Lightning Roles has a fairly hard-coded set of assumptions for role generation. And while it is a good solution for many sites, Lightning Workflow may not always be the right fit.You may find yourself tempted to uninstall these modules and delete the configuration they brought to the party, but things are not always that simple. Because of the inter-relationships and dependencies involved, simply uninstalling these modules may not be possible. Usually, all looks fine, then when it comes time for a deployment things fall apart quickly.This is where sub-profiles can save the day. By creating a sub-profile of Acquia Lightning you can tweak Lightning's out-of-the-box behavior and include or exclude modules to fit your needs. Sub-profiles inherit all of the code and configuration from the base profile they extend. This gives the developer the ability to take an install profile like Acquia Lightning and tweak it to fit her project's needs. Creating a sub-profile can be as easy as defining it via a *.info.yml file.In our example above, you may create a sub-profile like this:

name: 'example_profile'type: profiledescription: 'Lightning sub-profile'core: '8.x'type: profilebase profile: lightningthemes:  - mytheme  - seveninstall:  - paragraphs  - lightning_media  - lightning_media_audio  - lightning_media_videoexclude:  - lightning_roles  - lightning_page  - lightning_layout  - lightning_landing_page

This profile includes dependencies we're going to want, like Paragraphs - and excludes the things we want to manage ourselves. This helps ensure that when it comes time for deployment, you should get what you expect. You can create a sub-profile yourself by adding a directory and info.yml file in the "profiles" directory, or if you have Drupal Console and you're using Acquia Lightning, you can follow Acquia's instructions. This Drupal Console command in Lightning will walk you through a wizard to pick and choose modules you'd like to exclude.Once you've created your new sub-profile, you can update your existing site to use this profile. First, edit your settings.php and update the 'install_profile' settings.

$settings['install_profile'] = 'example_profile';

Then, use Drush to make the profile active.

drush cset core.extension module.example_profile 0

Once your profile is active and in-use, you can export your configuration and continue development.