2023-10-03 11:14:36 +08:00
|
|
|
# sftp-sync-deploy
|
|
|
|
|
|
|
|
Sync local files to remote using SFTP.
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
### Javscript
|
|
|
|
|
|
|
|
```js
|
|
|
|
const { deploy } = require('sftp-sync-deploy');
|
|
|
|
|
|
|
|
let config = {
|
|
|
|
host: 'example.com', // Required.
|
|
|
|
port: 22, // Optional, Default to 22.
|
|
|
|
username: 'user', // Required.
|
|
|
|
password: 'password', // Optional.
|
|
|
|
privateKey: '/path/to/key.pem', // Optional.
|
|
|
|
passphrase: 'passphrase', // Optional.
|
|
|
|
agent: '/path/to/agent.sock', // Optional, path to the ssh-agent socket.
|
|
|
|
localDir: 'dist', // Required, Absolute or relative to cwd.
|
|
|
|
remoteDir: '/path/to/dest' // Required, Absolute path only.
|
|
|
|
};
|
|
|
|
|
|
|
|
let options = {
|
|
|
|
dryRun: false, // Enable dry-run mode. Default to false
|
|
|
|
exclude: [ // exclude patterns (glob)
|
|
|
|
'node_modules',
|
|
|
|
'src/**/*.spec.ts'
|
|
|
|
],
|
|
|
|
excludeMode: 'remove', // Behavior for excluded files ('remove' or 'ignore'), Default to 'remove'.
|
|
|
|
forceUpload: false, // Force uploading all files, Default to false(upload only newer files).
|
|
|
|
concurrency: 100 // Max number of SFTP tasks processed concurrently. Default to 100.
|
|
|
|
};
|
|
|
|
|
|
|
|
deploy(config, options).then(() => {
|
|
|
|
console.log('success!');
|
|
|
|
}).catch(err => {
|
|
|
|
console.error('error! ', err);
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
### TypeScript
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { deploy, SftpSyncConfig, SftpSyncOptions } from 'sftp-sync-deploy';
|
|
|
|
|
|
|
|
let config: SftpSyncConfig = {...};
|
|
|
|
let options: SftpSyncOptions = {...};
|
|
|
|
|
|
|
|
deploy(config, options);
|
|
|
|
```
|
|
|
|
|
|
|
|
## Dry run mode
|
|
|
|
|
|
|
|
```js
|
|
|
|
deploy(config, {dryRun: true});
|
|
|
|
```
|
|
|
|
|
|
|
|
Outputs the tasks to be done for each file in following format. Any changes of the files will not be performed.
|
|
|
|
|
|
|
|
```
|
|
|
|
[ (local file status) | (remote file status) ] (file path)
|
|
|
|
-> (task)
|
|
|
|
```
|
|
|
|
|
|
|
|
### Output example
|
|
|
|
|
|
|
|
```
|
|
|
|
# Local is a file (upload the file)
|
|
|
|
[ F | F ] index.html
|
|
|
|
-> upload
|
|
|
|
|
|
|
|
# Local is a directory (sync recursively)
|
|
|
|
[ D | D ] lib
|
|
|
|
-> sync
|
|
|
|
|
|
|
|
# Remote exists and local doesn't (remove the remote file or directory)
|
|
|
|
[ | F ] index.html.bak
|
|
|
|
-> remove remote
|
|
|
|
|
|
|
|
# Excluded (do nothing)
|
|
|
|
[ X | ] node_modules
|
|
|
|
-> ignore
|
|
|
|
|
|
|
|
# Excluded and remote exists (operation depends on excludeMode option)
|
|
|
|
[ X | D ] .bin
|
|
|
|
-> remove remote # if excludeMode is 'remove'
|
|
|
|
-> ignore # if excludeMode is 'ignore'
|
|
|
|
|
|
|
|
# Local and remote have the same name but different types (remove remote then upload local)
|
|
|
|
[ F | D ] test
|
|
|
|
-> remove remote and upload
|
|
|
|
|
|
|
|
# Permission error on a remote server (ignored)
|
|
|
|
[ F | ! ] secret.txt
|
|
|
|
-> denied
|
|
|
|
```
|