I’m happy to announce that the second major version of Unicorn has been released. Unicorn is a free and open source tool to automatically synchronize item changes between Sitecore instances. If you’re new to Unicorn, the README describes what it is in more detail.
Unicorn, like many projects, evolved out of a proof of concept. Like most proof of concept projects, Unicorn suffered from a lack of flexibility because it did just enough to prove that it worked. Almost as soon as the first public version was released, work started on the refactoring that would become Unicorn 2. This second major revision of Unicorn is the result of more than 100 hours of work. Both code and UX have been refactored, decoupled, fixed, and improved. Many of the improvements are due to the input of the Sitecore community. Thank you to the folks who have sent issues, questions, and chatted about Unicorn since it was released. You all are awesome.
What’s new in Unicorn 2
- More reliable change detection. Instead of detecting changes using event handlers, a data provider is now used. This makes Unicorn immune to
EventDisabler
and thus missing changes to content. - Support for multiple configurations. A configuration is a set of dependencies, such as a predicate, serialization provider, and evaluator. These allow you to configure sets of content to serialize differently.
- A built-in control panel that walks you through common configuration issues and initial setup, and allows executing sync and reserialize operations once setup.
- Greatly improved logging. All operations are logged to the Sitecore logs, and the formatting has been streamlined to be terse and relevant.
- Consistency checking during a sync that finds common merge errors and flags them as errors.
- Better item comparison. All item fields are now compared when deciding whether to update an item, whereas v1 only evaluated the updated and revision fields.
- Field-level exclusion. You can now have certain fields be ignored when checking for updates or deserializing an item.
- Supports syncing media items (such as rendering thumbnails for page editor)
- Tons of bug fixes for unusual situations (for example, moving and copying items between included and not included paths)
- Compatible with Sitecore 6.5 and later. The original version was for Sitecore 7 only.
How do I get it and install it?
- Upgrading from 1.x? Read this
- You’ll need Sitecore 6.5.0 (121009) or later. Tested with Sitecore through 7.1 Update-1.
- Install Unicorn. This is as simple as adding the Unicorn NuGet package to your project.
- Configure what to serialize in the example configuration’s Predicate registration. There will be an
App_Config/Include/Serialization.config
file installed, which has a commented example of this syntax. - Run a build in Visual Studio to make sure the output files are up to date.
- Visit $yoursite/unicorn.aspx and it will walk you through initial serialization. This will take the preset you configured and serialize all of the included items in it to disk.
- NOTE: make sure to serialize an authoritative database with all items present. Other databases will be made to look just like this one when sync occurs.
- NOTE: if you’re using Git, you need to make sure that Git doesn’t fool with the line endings of your serialized files. Add
*.item -text
to a.gitattributes
file in the repo root. See this blog post for details.
- Commit your serialized items to source control.
If you want to install Unicorn from source, the procedure is quite easy. The README has directions for this.
Neat things you can do with Unicorn
Code Review and Branching
Recently I’ve started doing a lot more code review using GitHub pull requests. Unicorn makes Sitecore code review very easy - all you have to do is switch to the branch under review and sync Unicorn. Now your Sitecore has all the templates and renderings from that branch. When you’re done you checkout the original branch and sync again - and you’re back where you started. Very convenient.
Syncing test content between developers
If your site’s information architecture allows it, you can include a path under the site’s home item, such as ‘Samples’ to be synced using Unicorn. This content can be used by developers to create examples of content types under development to share for QA. The same technique can also be used to share rendering thumbnails in the media library.
Integrating with continuous integration
Unicorn is very simple to run using any CI server or script that can make HTTP requests. Once that is set up, your integration server - or even live - will never have outdated templates again. Example scripts for this can be found here
Integrate with deployment tools
Several people have integrated Unicorn with tools such as Sitecore Courier and Sitecore.Ship to create update packages to deploy to remote environments.
What’s new in the backend
The largest change in the backend is having it be a modular dependency-based system. Unlike v1 which had issues like the inability to use anything but the default preset, v2 allows you to reconfigure nearly all aspects of the system by changing the classes registered in the Serialization.config
file. Multiple configurations also allow for multiple configurations of the dependencies, so you can have more than one implementation of these extension points in any given project. This allows you to not only have different behavior per configuration but also to sync configurations separately if you wish to.
There is a rather long description of customization in the repository’s README file on GitHub if you’re interested.
Should I use this now?
That’s up to you. I am using it for my daily team development tasks, and consider it to be generally more stable than v1 because of the safety improvements (data provider, syncing all fields, consistency checking, better log messages).
Hope you enjoy it, and as always you can get ahold of me on Twitter or GitHub if you run across issues or have ideas.