PHPackages                             makinacorpus/drupal-usync - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. makinacorpus/drupal-usync

ActiveDrupal-module

makinacorpus/drupal-usync
=========================

Drupal features-like configuration file driven synchronization module

1.0.20(8y ago)29561[4 issues](https://github.com/makinacorpus/drupal-usync/issues)GPL-2PHP

Since May 19Pushed 8y ago17 watchersCompare

[ Source](https://github.com/makinacorpus/drupal-usync)[ Packagist](https://packagist.org/packages/makinacorpus/drupal-usync)[ Docs](http://github.com/makinacorpus/drupal-usync)[ RSS](/packages/makinacorpus-drupal-usync/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (3)Dependencies (1)Versions (22)Used By (0)

µSync
=====

[](#µsync)

Minimal yet powerfull config file based features-like toolkit for Drupal 7.

How does it work
----------------

[](#how-does-it-work)

It works by building a fully featured AST composed of typed nodes representing your configuration file, then browsing the tree and executing code over it.

Getting started
---------------

[](#getting-started)

### Create a sample module

[](#create-a-sample-module)

Let's assume you are working on a custom blog module:

```
sites/all/modules/myblog/
    myblog.module
    myblog.info
    myblog.yml

```

Contents of the myblog.info file:

```
name = My blog feature
description = Very simple blog feature for my site.
core = 7.x
usync[] = myblog.yml

```

Contents of the myblog.yml file:

```
field:
  blog_image:
    label: Post photo
    type: image

entity:
  blog_post:
    blog:
      name: Blog post
      field:
        blog_image: true
        body: true

view:
  node:
    blog_post:

      default:
        post_image:
          type: image
          settings:
            image_style: thumbnail
        body: true

      teaser:
        blog_image:
          type: image
          settings:
            image_style: thumbnail
        body:
          type: text_summary_or_trimmed
          settings:
            trim_length: 200

```

### List available data sources on site

[](#list-available-data-sources-on-site)

```
> drush usync-list

Module  Source
myblog  myblog.yml

```

### List available data in tree

[](#list-available-data-in-tree)

There is three alternative syntaxes for this use case.

Show a tree of everything declared by the myblog module:

```
> drush usync-tree --source=myblog:

```

Show a tree of the myblog.yml file declared by the myblog module:

```
> drush usync-tree --source=myblog:myblog.yml

```

Show a tree of the myblog.yml file accessing it directly:

```
> drush usync-tree --source=sites/all/modules/myblog/myblog.yml

```

Note that the --source parameter will be the same for all drush commands of this module, which means you can work directly on files without those needing to be defined by a specific module.

Output for the sample file should be:

```
 + field.blog_image
 + field.body
 + entity.node.post.field.blog_image
 + entity.node.post.field.body
 + entity.node.post
 + view.node.blog_post.default
 + view.node.post.teaser

```

### Listing matching elements in tree

[](#listing-matching-elements-in-tree)

Let's use the same source as upper, our 'myblog' module.

```
> drush usync-tree --source=myblog: \
    --match=entity.node.%

 + entity.node.post

```

Matching rules are the following:

- Words will match node names strictly
- *%* wildcard will match any name

### Injecting configuration into Drupal

[](#injecting-configuration-into-drupal)

Now that you are experienced users of the --source and --match parameters you can proceed to Drupal injection. Just replace the usync-tree command by usync-run using the same parameters and it will work.

For example, inject everything which is in the file:

```
> drush usync-tree --source=myblog:

```

Once everything is injected, you can proceed to partial updates, for example revert all the view modes:

```
> drush usync-tree --source=myblog:
    --match=view.node.blog_post.%

```

FAQ
---

[](#faq)

### But why?

[](#but-why)

Why not. Features is slow to revert, features need to be configured via the UI, and features are not easy to modify manually, features may bring weird conflicts, and features don't know what to do when there is an error and get broken. You can't define things easily, you can make objects inherit from each other one, and features uses CTools, supports Views, and push forward very bad practices. Drupal Way is unperformant, unperforming, and I needed something to write things faster and make things run faster.

### But why Yaml?

[](#but-why-yaml)

Why not, and you can use plain old PHP arrays instead if you don't like it. It will work like a charm.

### Why should I use it?

[](#why-should-i-use-it)

I'm not your mamma, if you like to click, use features. Choice is yours. Oh and it's an experimental, unfinshed product, so I would be you, I wouldn't use it.

###  Health Score

30

—

LowBetter than 65% of packages

Maintenance0

Infrequent updates — may be unmaintained

Popularity18

Limited adoption so far

Community18

Small or concentrated contributor base

Maturity72

Established project with proven stability

 Bus Factor1

Top contributor holds 79% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~37 days

Recently: every ~44 days

Total

20

Last Release

2938d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/69252826f3a70a19fc5dcefb7ef9d26d465bb300245641abb4dd89d0ec391a66?d=identicon)[pounard](/maintainers/pounard)

![](https://www.gravatar.com/avatar/d21b98752b406528da88850922b1061f39bf72eb2126b413d5c12e275811a40b?d=identicon)[Makina Corpus](/maintainers/Makina%20Corpus)

---

Top Contributors

[![pounard](https://avatars.githubusercontent.com/u/341855?v=4)](https://github.com/pounard "pounard (109 commits)")[![SebCorbin](https://avatars.githubusercontent.com/u/645207?v=4)](https://github.com/SebCorbin "SebCorbin (23 commits)")[![Lonnytunes](https://avatars.githubusercontent.com/u/6373159?v=4)](https://github.com/Lonnytunes "Lonnytunes (5 commits)")[![regilero](https://avatars.githubusercontent.com/u/809883?v=4)](https://github.com/regilero "regilero (1 commits)")

---

Tags

drupalfeaturesyml

### Embed Badge

![Health badge](/badges/makinacorpus-drupal-usync/health.svg)

```
[![Health](https://phpackages.com/badges/makinacorpus-drupal-usync/health.svg)](https://phpackages.com/packages/makinacorpus-drupal-usync)
```

###  Alternatives

[getkirby/cms

The Kirby core

1.5k535.5k350](/packages/getkirby-cms)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

595.2M386](/packages/shopware-core)[neos/flow

Flow Application Framework

862.0M449](/packages/neos-flow)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
