UNPKG

gulp-rsync

Version:

Rsync tasks for deploying gulp file structures

380 lines (258 loc) 11.3 kB
## gulp-rsync Use the file transferring and syncing capabilities of `rsync` within your Gulp task. `gulp-rsync` calls `rsync` and offers you a subset of options for an easy setup. ### Prerequisites `rsync` needs to be installed on your machine and must be sitting in your PATH. ### Installation ``` npm install gulp-rsync --save-dev ``` ### Usage ```js var gulp = require('gulp'); var rsync = require('gulp-rsync'); gulp.task('deploy', function() { return gulp.src('build/**') .pipe(rsync({ root: 'build/', hostname: 'example.com', destination: 'path/to/site/' })); }); ``` A common parameter set for `rsync` is ``` rsync -avz ... ``` This can be achieved by: ```js var gulp = require('gulp'); var rsync = require('gulp-rsync'); gulp.task('deploy', function() { gulp.src('build/**') .pipe(rsync({ root: 'build/', hostname: 'example.com', destination: 'path/to/site/', archive: true, silent: false, compress: true })); }); ``` **Note** that `rsync` does not synchronize your `build/`-directory if you give it a trailing `/`. ### rsync OPTIONS `rsync-gulp` implements the following options of `rsync`. See the [official documentation](https://rsync.samba.org/documentation.html) for more information. ``` -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X) -c, --checksum skip based on checksum, not mod-time & size -d, --dirs transfer directories without recursing -e, --rsh=COMMAND specify the remote shell to use -n, --dry-run perform a trial run with no changes made -r, --recursive recurse into directories -R, --relative use relative path names -t, --times preserve modification times -u, --update skip files that are newer on the receiver -v, --verbose increase verbosity -z, --compress compress file data during the transfer --chmod affect file and/or directory permissions --delete delete extraneous files from destination dirs --exclude=PATTERN exclude files matching PATTERN --include=PATTERN don't exclude files matching PATTERN --port=PORT specify double-colon alternate port number --progress show progress during transfer ``` ### Windows users When you are syncing from Windows to Unix you might encounter permission errors or issues resulting from these. A reason can be that `rsync` tries to preserve NTFS file attributes in UNIX. This behaviour can be remedied by: ```js chmod: "ugo=rwX" ``` So, if you are running `rsync` on Windows put this option in place. ### API #### `rsync(options)` ##### `options` ###### `destination` Type: `string`, **Required** The destination path. Use `hostname` when using a remote path. ###### `root` Type: `string`, Default: `process.cwd()` Specifying a root path changes the path names that are transferred to the destination. The paths piped into `rsync` must be within the root path (or the plugin will yell at you). ```js gulp.src('build/js/**']).pipe(rsync({destination: '/tmp'})); ``` This will create the directory `build` in `/tmp` as well as the directory `js` in `/tmp/build`. ```js gulp.src('build/js/**']).pipe(rsync({root: 'build', destination: '/tmp'})); ``` This will create the directory `js` in `/tmp`. ###### `hostname` Type: `string` The hostname of the destination. `rsync` will connect to this hostname using SSH along with configuration in `~/.ssh/config` or SSH keys stored in a keychain. When this is omitted, `rsync` will transfer the content to a local path. ###### `username` Type: `string` Used to specify a user for the remote host. ###### `shell` Type: `string`, Compares to: `rsync -e` Typically, `rsync` is configured to use `ssh` by default, but you may prefer to use `rsh` on a local network. ###### `port` Type: `integer` Used to specify an SSH port for the remote host. Note: This will override the shell option and force the use `ssh` in `rsync -e ssh --port=PORT`. ###### `archive` Type: `boolean`, Default: `false`, Compares to: `rsync -a` If set to `true`, `rsync` will turn on the archive mode which equals `-rlptgoD`: ``` -r, --recursive recurse into directories -l, --links copy symlinks as symlinks -p, --perms preserve permissions -t, --times preserve modification times -g, --group preserve group -o, --owner preserve owner (super-user only) -D same as --devices --specials --devices preserve device files (super-user only) --specials preserve special files ``` ###### `dryrun` Type: `boolean`, Default: `false`, Compares to: `rsync -n` If set to `true`, `rsync` will do everything it does without actually syncing. ###### `incremental` Type: `boolean`, Default: `false`, Compares to: `rsync -c` If set to `true`, `rsync` will make incremental updates only. rsync will use the checksum of every file to determine whether a file needs to be updated. This will add a delay to the transfer, but will minimize the amount of files transferred each time. ###### `progress` Type: `boolean`, Default: `false`, Compares to: `rsync --progress` If set to `true`, the transfer progress for each file will be displayed in the console. This looks like: ``` [20:49:53] gulp-rsync: Starting rsync to example.com:/var/www/example.com/html/... [20:49:53] gulp-rsync: favicon.ico [20:49:53] gulp-rsync: 1150 100% 439.45kB/s 0:00:00 (xfer#1, to-check=12/13) [20:49:53] gulp-rsync: index.html [20:49:53] gulp-rsync: 2712 100% 101.86kB/s 0:00:00 (xfer#2, to-check=11/13) [20:49:53] gulp-rsync: css/style.1afca52f.css [20:49:53] gulp-rsync: 1445 100% 54.27kB/s 0:00:00 (xfer#3, to-check=9/13) [20:49:53] gulp-rsync: images/photo1.82515393.jpg [20:49:53] gulp-rsync: 31878 100% 1.09MB/s 0:00:00 (xfer#7, to-check=3/13) [20:49:53] gulp-rsync: images/photo2.2a41e1e3.jpg [20:49:53] gulp-rsync: 76988 100% 2.53MB/s 0:00:00 (xfer#9, to-check=1/13) [20:49:53] gulp-rsync: [20:49:53] gulp-rsync: sent 2401 bytes received 2820 bytes 10442.00 bytes/sec [20:49:53] gulp-rsync: total size is 114173 speedup is 57.01 [20:49:53] gulp-rsync: Completed rsync. ``` ###### `relative` Type: `boolean`, Default: `true`, Compares to: `rsync -R` By default, `gulp-rsync` will transfer all paths relative to the `root` specified. If you want to transfer assets from multiple paths to a single destination, you can set `relative` to `false`. ```js gulp.src(['build/js/**/*.js', 'build/css/**/*.css', 'build/images/**']) .pipe(rsync({ hostname: 'example.cdn', destination: '/path/to/all/assets', relative: false })); ``` This will transfer all assets (*.js, *.css, and images) into a single directory. ###### `emptyDirectories` Type: `boolean`, Default: `false`, Compares to: `rsync -d` If set to `true`, `rsync` will create empty directories. ###### `times` Type: `boolean`, Default: `false`, Compares to: `rsync -t` Preserves times of the transferred files. ###### `compress` Type: `boolean`, Default: `false`, Compares to: `rsync -z` Compresses file data during transfer. ###### `recursive` Type: `boolean`, Default: `false` If set to `true`, `rsync` will transfer all files and subdirectories recursively. This is not necessary when using glob(s) with `gulp.src()`. However, it can be combined with non-globbed paths to transfer all files: ``` gulp.src(['build/js', 'build/css', 'build/images']) .pipe(rsync({ root: 'build/', destination: 'tmp/', recursive: true })); ``` This is the same as: ``` gulp.src(['build/js/**', 'build/css/**', 'build/images/**']) .pipe(rsync({ root: 'build', destination: '/tmp' })); ``` The difference is that the actual `rsync` command used in the first example is much shorter. ###### clean Type: `boolean`, Default: `false`, Compares to: `rsync --delete` This must be used with `archive` or `recursive` set to `true`. If set to `true`, this instructs `rsync` to delete all files and directories that are not in the source paths. **Be careful with this option as it could lead to data loss.** ###### `chmod` Type: `string`, Compares to: `rsync --chmod=STRING` Enables files or directories matching the pattern(s) provided to be excluded from the transfer. This is probably most useful when `recursive` is set to `true` since it is typically better to make these exclusions in `gulp.src()`. ###### `chown` Type: `string`, Compares to: `rsync --chown=STRING` Forces all remote files to be owned by the USER:GROUP provided in the string. If GROUP is empty, the trailing colon may be omitted, but if USER is empty, a leading colon must be supplied. If you're running macOS please check your rsync version with `rsync --version`. The default system version, older than 3.1.0, doesn't support this option. You can fix this by installing a recent version from Brew (`brew install homebrew/dupes/rsync`) or MacPorts (`sudo port install rsync`). ###### `exclude` Type: `string|Array<string>`, Compares to: `rsync --exclude=PATTERN` Enables files or directories matching the pattern(s) provided to be excluded from the transfer. This is probably most useful when `recursive` is set to `true` since it is typically better to make these exclusions in `gulp.src()`. ###### `include` Type: `string|Array<string>`, `rsync --include=PATTERN` Used with `exclude`. This adds exceptions for the exclusions. For example: ``` gulp.src('build') .pipe(rsync({ root: 'build', destination: '/tmp', recursive: true, exclude: ['*.css', '*.js'], include: ['*.min.css', '*.min.js'] })); ``` This will transfer only minified CSS and JS files. ###### `update` Type: `boolean`, Default: `false`, Compares to: `rsync -u` Skip files that are newer on the receiving end. ###### `silent` Type: `boolean`, Default: `false`, Compares to: `rsync --no-v` Turns off logging. ###### `links` Type: `boolean`, Default: `false` Enables creation of symbolic links on the receiving end. ###### `command` Type: `boolean`, Default: `false` This is not a `rsync`-option. If set to `true`, `gulp-rsync` shows you the generated `rsync` command in your shell. #### License > The MIT License (MIT) > > Copyright © 2015 Jerry Su, http://jerrysu.me > > Permission is hereby granted, free of charge, to any person obtaining a copy of > this software and associated documentation files (the “Software”), to deal in > the Software without restriction, including without limitation the rights to > use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of > the Software, and to permit persons to whom the Software is furnished to do so, > subject to the following conditions: > > The above copyright notice and this permission notice shall be included in all > copies or substantial portions of the Software. > > THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS > FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR > COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER > IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN > CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.