A simple migration system for Meteor supporting up/downwards migrations and command line usage.
Meteor Migrations can be installed through Meteor's package manager. Type:
$ meteor add percolate:migrations
To write a simple migration, somewhere in the server section of your project define:
Migrations.add({
version: 1,
up: function() {//code to migrate up to version 1}
});
To run this migration from within your app call:
Migrations.migrateTo('latest');
A more complete set of migrations might look like:
Migrations.add({
version: 1,
name: 'Adds pants to some people in the db.',
up: function() {//code to migrate up to version 1}
down: function() {//code to migrate down to version 0}
});
Migrations.add({
version: 2,
name: 'Adds a hat to all people in the db who are wearing pants.',
up: function() {//code to migrate up to version 2}
down: function() {//code to migrate down to version 1}
});
As in 'Basics', you can migrate to the latest by running:
Migrations.migrateTo('latest');
By specifying a version, you can migrate directly to that version (if possible). The migrations system will automatically determine which direction to migrate in.
In the above example, you could migrate directly to version 2 by running:
Migrations.migrateTo(2);
If you wanted to undo all of your migrations, you could migrate back down to version 0 by running:
Migrations.migrateTo(0);
Sometimes (usually when somethings gone awry), you may need to re-run a migration. You can do this with the rerun subcommand, like:
Migrations.migrateTo('3,rerun');
NOTE: You cannot create your own migration at version 0. This version is reserved by migrations for a 'vanilla' system, that is, one without any migrations applied.
To see what version the database is at, call:
Migrations.getVersion();
You can configure Migrations with the config
method. Defaults are:
Migrations.config({
// Log job run details to console
log: true,
// Use a custom logger function (defaults to Meteor's logging package)
logger: null
});
Migrations uses Meteor's logging
package by default. If you want to use your
own logger (for sending to other consumers or similar) you can do so by
configuring the logger
option.
Migrations expects a function as logger
, and will pass arguments to it for
you to take action on.
var MyLogger = function(opts) {
console.log('Level', opts.level);
console.log('Message', opts.message);
console.log('Tag', opts.tag);
}
Migrations.config({
logger: MyLogger
});
Migrations.add({ name: 'Test Job', ... });
Migrations.start();
The opts
object passed to MyLogger
above includes level
, message
, and tag
.
level
will be one ofinfo
,warn
,error
,debug
.message
is something likeFinished migrating.
.tag
will always be"Migrations"
(handy for filtering).
*** DEPRECATED ***
This info is for pre 0.9 users as post 0.9 the migrate.sh
script is no longer included in the package folder.
You can also run migrations from the command line using the included shell script. This will
- Launch your Meteor app
- Call
Migrations.migrateTo(version)
- Exit your app
For instance, from your project's root, run:
$ ./packages/percolatestudio-migrations/migrate.sh latest
You can also specify additional arguments to be passed into meteor, like:
$ ./packages/percolatestudio-migrations/migrate.sh latest --settings ./setting.json
Not migrating, control is locked
Migrations set a lock when they are migrating, to prevent multiple instances of your clustered app from running migrations simultaneously. If your migrations throw an exception, you will need to manually remove the lock (and ensure your db is still consistent) before re-running the migration. Update the migrations collection like this:
$ meteor mongo
db.migrations.update({_id:"control"}, {$set:{"locked":false}});
exit
-
Write some code.
-
Write some tests.
-
From this package's local directory, start the test runner:
$ meteor test-packages ./
-
Open http://localhost:3000/ in your browser to see the test results.
MIT. (c) Percolate Studio, maintained by Zoltan Olah (@zol).
Meteor Migrations was developed as part of the Verso project.