рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ PhpStorm рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдкрд▓реЛрдб рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ (рдЖрдк рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ IDE рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЖрдк рдЗрд╕реЗ рдЦрд┐рдВрдЪрд╛рд╡ рдХреЗ рд╕рд╛рде "рд╕рдорд╕реНрдпрд╛" рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╖рдп
рдЬреАрд╡рд┐рдд рд╣реИ : PhpStorm рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдЙрдард╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рдлреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ: рд╣реЗрдЯреНрдЬрд╝рдирд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рджрд╛рддрд╛), рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрд╛рдврд╝ рдЖ рдЬрд╛рдПрдЧреАред
рдХрдЯ рдХреЗ рддрд╣рдд, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдШреБрдЯрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдкрд▓реЛрдб рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рдЬреАрд╡рд┐рдд-рдЬреАрд╡рд┐рдд рдХрдиреЗрдХреНрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ред
рдкрд╛рда рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдФрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ: рд╢реБрд░реБрдЖрддреА, рдЧрд╛рдЗрдб рдФрд░ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдирдУрдбреАрдЬреЗрдПрд╕ (рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реИрд╕реЗ рднреА) рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рдФрд░ рдЕрдиреБрднрд╡реА рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬрд┐рддрдирд╛ рдХрд╣реВрдВрдЧрд╛ рдЙрддрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреБрдж NodeJS рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ - рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╣рдореЗрд╢рд╛ рд╣рд╛рде рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╕рдВрдж рд╕реНрдкрд╖реНрдЯ рдереАред рдХрдиреЗрдХреНрд╢рди рдореИрдВ SFTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:
- рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ
- рдХрд┐рд╕реА рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ
рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЖрджрд░реНрд╢реЛрдВ рдХреЛ рддреВрд▓ рди рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдкрд░ рдмрд╣реБрдд рд╕рдордп рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдореБрдЭреЗ 2 рд╕рд░рд▓ рдореЙрдбреНрдпреВрд▓ рдХреА рдУрд░ рд▓реЗ рдЧрдИ:
рдореИрдВ рдпрд╣ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ NodeJS рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЧрд╛рдЗрдб рдПрдХ рд╣реА рд╣рдм рдкрд░ рднрд░реЗ рд╣реБрдП рд╣реИрдВ
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ ред
Js ред рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рд░рд▓ рд▓рдЧрддреА рд╣реИрдВ:
var fs = require('fs'); var Connection = require('ssh2'); var hokidar = require('chokidar'); var c = new Connection();
рддреЛ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рд╕рд░реНрд╡рдкреНрд░рдердо рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдирд╛ рд╣реИ:
c.connect({ host: 'habrahabr.ru', port: 1500, username: 'habr', password: 'habrapassword' });
рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣,
ssh2 рдореЗрдВ рдИрд╡реЗрдВрдЯ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ:
c.on('connect', function() { console.log('Connection :: connect'); }); c.on('error', function(err) { console.log('Connection :: error :: ' + err); }); c.on('end', function() { console.log('Connection :: end'); }); c.on('close', function(had_error) { console.log('Connection :: close'); });
рдФрд░ рд╣рд╛рдВ, рд╣рдо рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ:
c.on('ready', function() { .... })
рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ -
sftp : рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд░рд▓ рдкреНрд░рдмрдВрдзрдХ:
c.sftp(function(err,sftp){ if(!err){ console.log('sftp start'); }else{ console.log('sftp err',err); } });
рдЬрдм рдХрдиреЗрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдирд┐рдЧрд░рд╛рдиреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ:
var watcher = chokidar.watch(local_path, {ignored:
рд╡реЙрдЪрд░ рдореЗрдВ рдЗрд╡реЗрдВрдЯ
рдРрдб ,
рдЪреЗрдВрдЬ ,
рдЕрдирд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ , рдЬреЛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрдЪреА рд╣реИ рдЬреЛ
ssh2 рдореЙрдбреНрдпреВрд▓
рдХреЛ sftp рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдирдХрд▓
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ :
watcher .on('add', function(path,meta) { console.log('upload added',path.replace(local_path,deploy_path)); sftp.fastPut(path,path.replace(local_path,deploy_path),{},function(err){ if(err){ console.log('sftp upload err',err); } }); }) .on('change', function(path) { console.log('upload changed',path.replace(local_path,deploy_path)); sftp.fastPut(path,path.replace(local_path,deploy_path),{},function(err){ if(err){ console.log('sftp change err',err); } }); }) .on('unlink', function(path) { console.log('remove file',path.replace(local_path,deploy_path)); sftp.unlink(path.replace(local_path,deploy_path),function(err){ if(err){ console.log('sftp remove err',err); } }); }) .on('error', function(error) {console.error('Error happened', error);})
рд╣реЛ рдЧрдпрд╛! рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ! рд▓реЛрдб рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдкреАрдпреВ рдХреЛ рд▓рдЧрднрдЧ рд╕реНрдХрд╛рдЗрдк (рдореИрдХрдмреБрдХ рдПрдпрд░ рдорд┐рдб 2012) рдХреА рддрд░рд╣ рдЦрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рдореБрд╕реНрдХрд░рд╛рддреА рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╣рд▓реНрдХреЗ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИред
рдЦреИрд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ
рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
var local_path; var deploy_path; process.argv.forEach(function (val, index, array) { var item_arr = val.split('='); if(item_arr.length > 1){ switch(item_arr[0]){ case 'local_path': local_path = item_arr[1]; break; case 'deploy_path': deploy_path = item_arr[1]; break; } } });
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд░рд▓ рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ NodeJS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХрд┐рд╕реА рд╕рд╛рдЭрд╛ рджреЗрд╡ рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ
рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд▓рдЧреНрди рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рдЧрднрдЧ рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдереА, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдмрдХрд╡рд╛рд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рд╕рдЦреНрддреА рд╕реЗ рдиреНрдпрд╛рдп рди рдХрд░реЗрдВред рдкреЛрд╕реНрдЯ рдХрд╛ рдЕрд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рд╣реИред рдХрдИ рдШрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдпрд╛ рд╣реИрдХ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдлрд╡рд╛рд╣ рдЙрдбрд╝рд╛рдИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдирдП PhpStorm рдХреА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рд╣реА рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЬрдм рдореИрдВрдиреЗ IDE рдореЗрдВ рдХрдВрд╕реЛрд▓ рд╕рдкреЛрд░реНрдЯ рджреЗрдЦрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!