• nodejs 监控代码变动实现ftp上传


     被动模式下

    //https://www.npmjs.com/package/watch
    //文件同步功能
    var watch = require('watch');
    var path = require("path");
    var fs = require('fs');
    var http = require('http');
    const ftp = require("basic-ftp");
    var files=[];
    var config={
        //remote_root:'/Users/apple/kefu/',
        // host:'192.168.1.159',
        // username:'apple',
        // password:'123',
        remote_root:'/',
        host:'127.0.0.1',
        username:'aaaa',
        password:'aaaa',
    };
    //需要忽略的文件或目录
    var ignore=[
    	__dirname+'\file',
    ];
    
    function readDirSync(path){ 
        var files=[];
        var pa = fs.readdirSync(path);  
        pa.forEach(function(ele,index){  
            var info = fs.statSync(path+"/"+ele);     
            if(info.isDirectory()){  
                files=files.concat(readDirSync(path+"/"+ele));  
            }else{  
                files.push(path+"/"+ele);
            }
        }) 
        return files;
    }  
    
    console.log('start watching');
    watch.createMonitor(__dirname,{ignoreDotFiles:true}, function (monitor) {
        monitor.on("created", function (f, stat) {
    		for(var i=0;i<ignore.length;i++){
    			if(f.indexOf(ignore[i])>=0) return;
    		}
            // Handle new files
            console.log("created:",f);
            var stats=fs.statSync(f);
            if(stats.isDirectory()){
                var folder_files=readDirSync(f);
                for(var i=0;i<folder_files.length;i++){
                    console.log("created:",folder_files[i]);
                    if(files.indexOf(folder_files[i])===-1) files.push(folder_files[i]);
                }
            }else if(stats.isFile()){
                if(files.indexOf(f)===-1) files.push(f);
            }
        })
        monitor.on("changed", function (f, curr, prev) {
    		for(var i=0;i<ignore.length;i++){
    			if(f.indexOf(ignore[i])>=0) return;
    		}
            // Handle file changes
            console.log("changed:",f);
            if(files.indexOf(f)===-1) files.push(f);
        })
        monitor.on("removed", function (f, stat) {
    		for(var i=0;i<ignore.length;i++){
    			if(f.indexOf(ignore[i])>=0) return;
    		}
            // Handle removed files
            console.log("removed:",f);
            
        })
        
      });
    async function upload(){
    
            
        console.log('start to upload');
    	//https://www.npmjs.com/package/basic-ftp
        const client = new ftp.Client();
        client.ftp.verbose = true;
        try {
            await client.connect(config.host, 21);
            // await client.useTLS();
            await client.login(config.username, config.password);
            await client.useDefaultSettings();
            //await client.upload(fs.createReadStream("README.md"), "README.md");
            
            //上传目录 避免中文
            //console.log(await client.list());
            
            //read file
            console.log('begin to upload');
            if(!files.length){
                console.log('no files to upload');
                return;
            }
            var contents=files;
            
            for(var i=0;i<contents.length;i++){
                var roots=contents[i].trim();
                if(!roots) continue;
                if(!fs.existsSync(roots)) continue;
                roots=roots.replace(/\/g,'/');
                //E:/wwwroot2/kefuv3/application/models/0/usersModel.class.php
                var local_file=roots;
                var local_path=path.dirname(local_file);
                var remote_path=local_path.replace(__dirname.replace(/\/g,'/'),'').substr(1);
                //Users/apple/kefu/application/models/0/usersModel.class.php
                var remote_file=local_file.replace(__dirname.replace(/\/g,'/'),'').substr(1);
                //dir
                await client.ensureDir(config.remote_root+remote_path);
                //change dir
                await client.cd(config.remote_root+remote_path);
                //upload
                await client.upload(fs.createReadStream(local_file), path.basename(local_file));
    
            }
            files=[];
            console.log('upload finished!');
    
        }
        catch(err) {
            console.log(err);
        }
        client.close();
        
        
    }
    var x=0;
    //http://nodejs.cn//api/process.html#process_signal_events
    process.stdin.resume();
    
    process.on('SIGINT', () => {
        // x++;
        // if(x==2){
            // console.log('byebye');
            // process.exit(0);
        // }
        upload();
      
    });
    

      主动模式下

    //https://www.npmjs.com/package/watch
    //https://blog.csdn.net/zgljl2012/article/details/50365492
    //文件同步功能
    var watch = require('watch');
    var path = require("path");
    var fs = require('fs');
    var p = require('child_process');
    var iconv = require("iconv-lite");
    var files=[];
    
    var config={
        //remote_root:'/Users/apple/kefu/',
        // host:'192.168.1.159',
        // username:'apple',
        // password:'123',
        remote_root:'/',
        host:'127.0.0.1',
        username:'',
        password:'',
    };
    
    //需要忽略的文件或目录
    var ignore=[
    	__dirname+'\file',
    	__dirname+'\cmd.txt',
    ];
    
    function readDirSync(path){ 
        var files=[];
        var pa = fs.readdirSync(path);  
        pa.forEach(function(ele,index){  
            var info = fs.statSync(path+"/"+ele);     
            if(info.isDirectory()){  
                files=files.concat(readDirSync(path+"/"+ele));  
            }else{  
                files.push(path+"/"+ele);
            }
        }) 
        return files;
    }  
    
    console.log('start watching');
    watch.createMonitor(__dirname,{ignoreDotFiles:true}, function (monitor) {
        monitor.on("created", function (f, stat) {
    		for(var i=0;i<ignore.length;i++){
    			if(f.indexOf(ignore[i])>=0) return;
    		}
            // Handle new files
            console.log("created:",f);
            var stats=fs.statSync(f);
            if(stats.isDirectory()){
                var folder_files=readDirSync(f);
                for(var i=0;i<folder_files.length;i++){
                    console.log("created:",folder_files[i]);
                    if(files.indexOf(folder_files[i])===-1) files.push(folder_files[i]);
                }
            }else if(stats.isFile()){
                if(files.indexOf(f)===-1) files.push(f);
            }
        })
        monitor.on("changed", function (f, curr, prev) {
    		for(var i=0;i<ignore.length;i++){
    			if(f.indexOf(ignore[i])>=0) return;
    		}
            // Handle file changes
            console.log("changed:",f);
            if(files.indexOf(f)===-1) files.push(f);
        })
        monitor.on("removed", function (f, stat) {
    		for(var i=0;i<ignore.length;i++){
    			if(f.indexOf(ignore[i])>=0) return;
    		}
            // Handle removed files
            console.log("removed:",f);
            
        })
        
      });
    function create_dir_cmd(remote_root,remote_path){
    	// a/b/c
    	if(!remote_path) return '';
    	var folder=remote_path.split('/');
    	var cmd='';
    	var base=remote_root;
    	for(let i=0;i<folder.length;i++){
    		if(!folder[i]) continue;
    		base+=folder[i]+'/';
    		cmd+="mkdir "+base+"
    ";
    	}
    	return cmd;
    }
    function upload(){
    		
    		console.log('begin to upload');
            if(!files.length){
                console.log('no files to upload');
                return;
            }
            
            var son='';
    
    
    		
    		var contents=files;
            for(var i=0;i<contents.length;i++){
                var roots=contents[i].trim();
                if(!roots) continue;
                if(!fs.existsSync(roots)) continue;
                roots=roots.replace(/\/g,'/');
                //E:/wwwroot2/kefuv3/application/models/0/usersModel.class.php
                var local_file=roots;
                var local_path=path.dirname(local_file);
                var remote_path=local_path.replace(__dirname.replace(/\/g,'/'),'').substr(1);
                //Users/apple/kefu/application/models/0/usersModel.class.php
                var remote_file=local_file.replace(__dirname.replace(/\/g,'/'),'').substr(1);
                //dir
                //await client.ensureDir(config.remote_root+remote_path);
                //change dir
                //await client.cd(config.remote_root+remote_path);
                //upload
                //await client.upload(fs.createReadStream(local_file), path.basename(local_file));
    			son+=create_dir_cmd(config.remote_root,remote_path);//mkdir
    			son+="cd "+config.remote_root+remote_path+"
    ";//change dir
    			son+="put ""+local_file+"" ""+path.basename(local_file)+""
    ";//upload
            }
    		
    		var str=`open ${config.host}
    ${config.username}
    ${config.password}
    binary
    prompt off
    pwd
    ${son}
    close
    quit
    		`;
    		
    		var flag=fs.writeFile('cmd.txt', str,(err) => {
    			if (err) throw err;
    			console.log('cmd.txt保存成功!');
    			
    			p.exec('ftp -s:cmd.txt', { encoding: 'binary' },function (error, stdout, stderr) {
    				if (error !== null) {
    				  console.log('exec error: ' + error);
    				}
    				console.log(iconv.decode(Buffer.from(stdout, 'binary'), 'cp936'));
    				
    				files=[];
    				console.log('upload finished!');
    			});
    			
    		});
    		
    		
            
    	
    	
    	
    
    }
        
    var x=0;
    //http://nodejs.cn//api/process.html#process_signal_events
    process.stdin.resume();
    
    process.on('SIGINT', () => {
        // x++;
        // if(x==2){
            // console.log('byebye');
            // process.exit(0);
        // }
        upload();
      
    });
    

      建议使用第二种,使用的是windows的ftp命令,兼容了主动模式

    watch.bat

    node watch.js
    pause
    

      使用时双击watch.bat

    需要上传时按ctrl+c

  • 相关阅读:
    centos 6.5 查看、开启,关闭 端口
    centos 安装 nginx
    centos 安装 svn
    centos 安装 maven
    (转)不停止Nginx服务的情况下平滑变更Nginx配置
    记录1---python+linux+vim之while循环语句使用
    记录1---linux系统之创建用户,用户登录,查看用户名,切换用户登录,退出登录
    记录——Fiddler5.0 中文版 绿色免费版 汉化破解版安装
    fiddler笔记1---fiddler的安装 和 证书安装 以及 证书导出失败问题解决
    fiddler笔记2--fiddler工具界面的功能使用与介绍
  • 原文地址:https://www.cnblogs.com/songzhenghe/p/9469493.html
Copyright © 2020-2023  润新知