2017-07-10 21:28:39 +00:00
<!DOCTYPE html>
< html class = "no-js" lang = "en-GB" >
< head >
< title > Updating Features and Adding Components Using Drush | Oliver Davies< / title >
< meta charset = "UTF-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
2017-07-21 17:44:18 +00:00
< meta property = "og:url" content = "https://www.oliverdavies.uk/blog/2014/10/21/updating-features-and-adding-components-using-drush/" >
2017-07-10 21:28:39 +00:00
< meta property = "og:title" content = "Updating Features and Adding Components Using Drush" / >
2017-07-12 06:22:51 +00:00
< meta property = "og:image" content = "https://www.oliverdavies.uk/assets/images/me-precedent.jpg" / >
2017-07-10 21:28:39 +00:00
< meta property = "og:image:height" content = "327" / >
< meta property = "og:image:type" content = "image/jpg" >
< meta property = "og:image:width" content = "327" / >
2017-07-12 06:22:51 +00:00
< link rel = "stylesheet" href = "https://www.oliverdavies.uk/assets/css/main.css" >
2017-07-14 22:11:03 +00:00
2017-07-10 21:28:39 +00:00
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=57" sizes = "57x57" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=114" sizes = "114x114" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=72" sizes = "72x72" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=144" sizes = "144x144" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=60" sizes = "60x60" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=120" sizes = "120x120" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=76" sizes = "76x76" >
< link rel = "apple-touch-icon" href = "/assets/images/me-precedent.jpg?s=152" sizes = "152x152" >
< link rel = "icon" href = "/assets/images/me-precedent.jpg?s=160" sizes = "160x160" >
< link rel = "icon" href = "/assets/images/me-precedent.jpg?s=96" sizes = "96x96" >
< link rel = "icon" href = "/assets/images/me-precedent.jpg?s=32" sizes = "32x32" >
< link rel = "icon" href = "/assets/images/me-precedent.jpg?s=16" sizes = "16x16" >
< / head >
< body class = "" >
< nav class = "navbar navbar-inverse navbar-fixed-top" >
< div class = "container" >
< div class = "navbar-header" >
< button type = "button" class = "navbar-toggle collapsed" data-toggle = "collapse" data-target = "#navbar" aria-expanded = "false" aria-controls = "navbar" >
< span class = "sr-only" > Toggle navigation< / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< / button >
2017-07-12 06:22:51 +00:00
< a class = "navbar-brand" href = "https://www.oliverdavies.uk/" > Oliver Davies< / a >
2017-07-10 21:28:39 +00:00
< / div >
< div id = "navbar" class = "collapse navbar-collapse" role = "navigation" >
< ul class = "nav navbar-nav" >
< li class = "" >
< a href = "/" > About< / a >
< / li >
< li class = "" >
< a href = "/experience" > Experience< / a >
< / li >
< li class = "" >
< a href = "/testimonials" > Testimonials< / a >
< / li >
< li class = "" >
< a href = "/talks" > Talks< / a >
< / li >
< li class = "active" >
< a href = "/blog" > Blog< / a >
< / li >
< li class = "" >
< a href = "/contact" > Contact< / a >
< / li >
< / ul >
< / div > < / div >
< / nav >
< div class = "container" >
< div class = "row" >
< main class = "col-md-9" >
< h1 > Updating Features and Adding Components Using Drush< / h1 >
2017-07-11 17:57:51 +00:00
< p class = "posted text-light" > 21st October 2014< / p >
2017-07-10 21:28:39 +00:00
< p > If you use the < a href = "http://drupal.org/project/features" > Features module< / a > to manage your Drupal configuration, it can be time consuming to update features through the UI, especially if you are working on a remote server and need to keep downloading and uploading files.< / p >
< p > If you re-create a feature through the UI, you'll be prompted to download a new archive of the feature in its entirety onto your local computer. You could either commit this into a local repository and then pull it remotely, or use a tool such as SCP to upload the archive onto the server and commit it from there. You can simplify this process by using < a href = "http://drush.org" > Drush< / a > .< / p >
< h2 id = "finding-components" > Finding Components< / h2 >
< p > To search for a component, use the < code > drush features-components< / code > command. This will display a list of all components on the site. As we're only interested in components that haven't been exported yet, add the < code > --not-exported< / code > option to filter the results.< / p >
< p > To filter further, you can also use the < code > grep< / code > command to filter the results. For example, < code > drush features-components --not-exported field_base | grep foo< / code > , would only return non-exported field bases containing the word "foo".< / p >
< p > The result is a source and a component, separated by a colon. For example, < code > field_base:field_foo< / code > .< / p >
< h2 id = "exporting-the-feature" > Exporting the Feature< / h2 >
< p > Once you have a list of the components that you need to add, you can export the feature. This is done using the < code > drush features-export< / code > command, along with the feature name and the component names.< / p >
< p > For example:< / p >
< pre > < code class = "language-bash" > $ drush features-export -y myfeature field_base:field_foo field_instance:user-field_foo
< / code > < / pre >
< p > In this example, the base for field_boo and it's instance on the user object is being added to the "myfeature" feature.< / p >
< p > If you are updating an existing feature, you'll get a message informing you that the module already exists and asking if you want to continue. This is fine, and is automatically accepted by including < code > -y< / code > within the command. If a feature with the specified name doesn't exist, it will be created.< / p >
< p > If you're creating a new feature, you can define where the feature will be created using the < code > --destination< / code > option.< / p >
< p > Once complete, you will see a confirmation message.< / p >
< blockquote >
< p > Created module: my feature in sites/default/modules/custom/features/myfeature< / p >
< / blockquote >
< h2 id = "the-result" > The Result< / h2 >
< p > Once finished, the feature is updated in it's original location, so there's no download of the feature and then needing to re-upload it. You can add and commit your changes into Git or continue with your standard workflow straight away.< / p >
< h2 id = "useful-links" > Useful Links< / h2 >
< ul >
< li > < a href = "http://www.drupal.org/project/features" > The Features project page on Drupal.org< / a > < / li >
< li > < a href = "http://www.drushcommands.com/drush-6x/features/features-components" > The "drush features-components" command< / a > < / li >
< li > < a href = "http://www.drushcommands.com/drush-6x/features/features-export" > The "drush features-export" command< / a > < / li >
< / ul >
< p class = "tags" >
Tags:
2017-07-12 06:22:51 +00:00
< a href = "https://www.oliverdavies.uk/blog/tags/drupal" > drupal< / a > , < a href = "https://www.oliverdavies.uk/blog/tags/drupal-planet" > drupal-planet< / a > , < a href = "https://www.oliverdavies.uk/blog/tags/drush" > drush< / a > , < a href = "https://www.oliverdavies.uk/blog/tags/features" > features< / a > < / p >
2017-07-10 21:28:39 +00:00
< div class = "post-pager is-flex" >
< div class = "is-half" >
2017-07-21 17:44:18 +00:00
< a href = "/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine/" >
2017-07-10 21:28:39 +00:00
« How to fix Vagrant Loading the Wrong Virtual Machine
< / a >
< / div >
< div class = "is-half text-right" >
2017-07-21 17:44:18 +00:00
< a href = "/blog/2014/11/18/include-css-fonts-using-sass-each-loop/" >
2017-07-10 21:28:39 +00:00
Include CSS Fonts by Using a SASS each Loop »
< / a >
< / div >
< / div >
< div class = "about-author" >
< h2 > About the Author< / h2 >
2017-07-12 06:24:51 +00:00
< img src = "//www.oliverdavies.uk/assets/images/me-precedent.jpg" alt = "Picture of Oliver" class = "img-circle" >
2017-07-10 21:28:39 +00:00
< p > Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at < a href = "https://microserve.io" > Microserve< / a > and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.< / p >
< / div >
< / main >
< div class = "col-md-3" >
< div class = "panel badges text-center" >
2017-07-21 17:44:18 +00:00
< a href = "https://assoc.drupal.org/membership" title = "I’ m a Drupal Association member." class = "is-block" >
2017-07-10 21:28:39 +00:00
< img
2017-07-21 17:44:18 +00:00
src="//www.oliverdavies.uk/assets/images/badges/da-individual-member.png"
2017-07-10 21:28:39 +00:00
alt="Drupal Association Individual Member"
2017-07-21 17:44:18 +00:00
width="200"
/>
2017-07-10 21:28:39 +00:00
< / a >
2017-07-21 17:44:18 +00:00
< div class = "is-flex align-items-center" >
2017-07-10 21:28:39 +00:00
< img
2017-07-21 17:44:18 +00:00
src="//www.oliverdavies.uk/assets/images/badges/acquia-d8-developer.png"
alt="Acquia Certified Developer - Drupal 8 Exam Badge"
class="is-2"
/>
2017-07-10 21:28:39 +00:00
2017-07-21 17:44:18 +00:00
< img
src="//www.oliverdavies.uk/assets/images/badges/acquia-d8-back-end.png"
alt="Acquia Certified Back End Specialist - Drupal 8 Exam Badge"
class="is-2"
2017-07-10 21:28:39 +00:00
/>
2017-07-21 17:44:18 +00:00
< / div >
2017-07-10 21:28:39 +00:00
2017-07-21 17:44:18 +00:00
< a href = "http://conference.phpnw.org.uk/phpnw17" class = "is-block" >
2017-07-12 06:24:51 +00:00
< img src = "//www.oliverdavies.uk/assets/images/badges/phpnw17.png" alt = "" >
2017-07-10 21:28:39 +00:00
< / a >
< / div >
< div class = "availability panel panel-default" >
< div class = "panel-heading" > Availability< / div >
< div class = "panel-body" >
< p >
< i class = "fa fa-thumbs-o-up text-warning" > < / i >
Currently have limited part-time capacity
< / p >
< p >
< i class = "fa fa-thumbs-o-down text-danger" > < / i >
Currently no spare full-time capacity.
< / p >
< / div >
< / div >
< div class = "latest-posts panel panel-default" >
< div class = "latest-posts__heading panel-heading" > Latest blog posts< / div >
< ul class = "list-group" >
< li class = "post list-group-item" >
2017-07-13 21:19:23 +00:00
< span class = "post__title" >
2017-07-21 17:44:18 +00:00
< a href = "/blog/2017/07/13/publishing-sculpin-sites-with-github-pages/" >
2017-07-13 21:19:23 +00:00
Publishing Sculpin Sites with GitHub Pages
< / a >
< / span > -
< span class = "post__date" > 13th July, 2017< / span >
< / li >
< li class = "post list-group-item" >
2017-07-10 21:28:39 +00:00
< span class = "post__title" >
2017-07-21 17:44:18 +00:00
< a href = "/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot/" >
2017-07-10 21:28:39 +00:00
Introducing the Drupal Meetups Twitterbot
< / a >
< / span > -
< span class = "post__date" > 9th June, 2017< / span >
< / li >
< li class = "post list-group-item" >
< span class = "post__title" >
2017-07-21 17:44:18 +00:00
< a href = "/blog/2017/05/20/turning-drupal-module-into-feature/" >
2017-07-10 21:28:39 +00:00
Turning Your Custom Drupal Module into a Feature
< / a >
< / span > -
< span class = "post__date" > 20th May, 2017< / span >
< / li >
< / ul >
< / div >
< / div >
< / div > < / div >
< footer class = "container" >
< p class = "copyright" >
© 2010-2017 Oliver Davies. Built with < a href = "https://sculpin.io" > Sculpin< / a > .
< / p >
< div class = "meetups" >
< h2 > Things that I organise< / h2 >
< ul >
< li class = "meetups--drupal-bristol" >
< a href = "http://www.drupalbristol.org.uk" title = "Drupal Bristol" >
2017-07-11 06:34:02 +00:00
< img
2017-07-12 06:24:51 +00:00
src="//www.oliverdavies.uk/assets/images/meetups/drupal-bristol.jpeg"
2017-07-11 06:34:02 +00:00
alt="Drupal Bristol logo"
>
2017-07-10 21:28:39 +00:00
< / a >
< / li >
< li class = "meetups--drupalcamp-bristol" >
< a href = "http://www.drupalcampbristol.co.uk" title = "DrupalCamp Bristol" >
2017-07-11 06:34:02 +00:00
< img
2017-07-12 06:24:51 +00:00
src="//www.oliverdavies.uk/assets/images/meetups/drupalcamp-bristol.png"
2017-07-11 06:34:02 +00:00
alt="DrupalCamp Bristol logo"
>
2017-07-10 21:28:39 +00:00
< / a >
< / li >
< li class = "meetups--phpsw" >
< a href = "http://phpsw.uk" title = "PHPSW" >
2017-07-11 06:34:02 +00:00
< img
2017-07-12 06:24:51 +00:00
src="//www.oliverdavies.uk/assets/images/meetups/phpsw.jpeg"
2017-07-11 06:34:02 +00:00
alt="PHPSW logo"
>
2017-07-10 21:28:39 +00:00
< / a >
< / li >
< / ul >
< / div >
< / footer >
2017-07-12 06:22:51 +00:00
< script src = "https://www.oliverdavies.uk/assets/js/site.js" > < / script >
2017-07-10 21:28:39 +00:00
< script > ( function ( i , s , o , g , r , a , m ) { i [ 'GoogleAnalyticsObject' ] = r ; i [ r ] = i [ r ] || function ( ) { ( i [ r ] . q = i [ r ] . q || [ ] ) . push ( arguments ) } , i [ r ] . l = 1 * new Date ( ) ; a = s . createElement ( o ) , m = s . getElementsByTagName ( o ) [ 0 ] ; a . async = 1 ; a . src = g ; m . parentNode . insertBefore ( a , m ) } ) ( window , document , 'script' , '//www.google-analytics.com/analytics.js' , 'ga' ) ; ga ( 'create' , 'UA-11967257-1' , 'auto' ) ; ga ( 'send' , 'pageview' ) ; < / script >
< / body >
< / html >