A grunt task to keep directories in sync. It is very similar to grunt-contrib-copy but tries to copy only those files that has actually changed.
npm install grunt-sync --save
Within your grunt file:
grunt.initConfig({
sync: {
main: {
files: [{
cwd: 'src',
src: [
'**', /* Include everything */
'!**/*.txt' /* but exclude txt files */
],
dest: 'bin',
}],
pretend: true, // Don't do any IO. Before you run the task with `updateAndDelete` PLEASE MAKE SURE it doesn't remove too much.
verbose: true // Display log messages when copying files
}
}
});
grunt.loadNpmTasks('grunt-sync');
grunt.registerTask('default', 'sync');
sync: {
main: {
files: [
{src: ['path/**'], dest: 'dest/'}, // includes files in path and its subdirs
{cwd: 'path/', src: ['**/*.js', '**/*.css'], dest: 'dest/'}, // makes all src relative to cwd
],
verbose: true, // Default: false
pretend: true, // Don't do any disk operations - just write log. Default: false
failOnError: true, // Fail the task when copying is not possible. Default: false
ignoreInDest: "**/*.js", // Never remove js files from destination. Default: none
updateAndDelete: true, // Remove all files from dest that are not found in src. Default: false
compareUsing: "md5" // compares via md5 hash of file contents, instead of file modification time. Default: "mtime"
}
}
npm install grunt-sync --save
In the first phase the plugin compares modification times of files in src
and dest
. It only copies files with newer modification time. Second phase deletes files that exists in dest
but have not been found in src
.
Details:
- [1st phase] Read modification time of all files in
src
. - [1] Overwrite destination if modification time is newer or destination is directory not file.
- [2nd phase]* Get a list of the files in
dest
and calculate difference between destination and source. - [2]* Delete all files (and directories) that have been found in
dest
but are not foundsrc
excluding ignored files.
*second phase only occurs if updateAndDelete is set to true (whitch is set to false by default)
- 0.5.0 - Synchronous removal of directories (to avoid race conditions)
- 0.4.0 - Adding better patterns support for
ignoreInDest
- 0.3.0 - Comparison using md5 hash of file contents or modification time
- 0.2.4 -
failOnError
option - 0.2.3 - Fixed issue with files defined as array when using
updateAndDelete
. - 0.2.2 - Fixed issue with
updateAndDelete
when source patterns matches only files. - 0.2.1 - Fixed grunt Compact Format.
- 0.2.0 - Default configuration will not remove any files any more. You have to specify
updateAndDelete
option to remove any files from destination. - 0.1.2 - Deleting all files in destination on Windows solved.
- 0.1.1 - Fixed issue with trailing slash in destination.
- 0.1.0 - Files missing that are not in
src
are deleted fromdest
(unless you specifyupdateOnly
)
In version 0.2 you have to explicitly specify that you want the plugin to remove files from destination. See updateAndDelete
option and run with pretend:true
first to make sure that it doesn't remove any crucial files. You can tune what files should be left untouched with ignoreInDest
property.
If you have updateOnly:true
in your 0.1 config you can remove this option. For those who used updateOnly:false
you have to include updateAndDelete:true
in 0.2 config to keep the same behavior.
- Michael Mifsud (xzyfer)
- Erwan Jegouzo (erwanjegouzo)
- Janek Lasocki-Biczysko (janeklb)
- Research if it's possible to have better integration with
grunt-contrib-watch
- update only changed files instead of scanning everything. - Some tests for common problems
- Some tests to assure performance
- Rewrite
updateAndDelete
in more elegant way (maybe use patterns from source?)