teambition / gulp-ssh

SSH and SFTP tasks for gulp
184 stars 38 forks source link

回调执行问题 #14

Closed mice33 closed 9 years ago

mice33 commented 9 years ago

CODE:

gulp.task('test', function() {

   gulp.src('lst/*.lst')
        .pipe(foreach(function(stream, file){
        var fileName = path.basename(file.path),
            fileContent = String(file.contents).split(':');

        if (fileContent[0] === 'file') {
            var ssh = new GulpSSH({
                ignoreErrors: false,
                sshConfig: {
                    host: ZipServerCfg.UAT.WEB.host,
                    port: 22,
                    username: ZipServerCfg.UAT.WEB.user,
                    password: ZipServerCfg.UAT.WEB.pass
                }
            });
            return stream.pipe(ssh.sftp('write', ZipServerCfg.UAT.WEB.lstUploadFiles+fileName)).on('finish', function(){
                    log(color.green(fileName) + ' Uploaded');
                    ssh.shell(['cd update', 'sh pack_ver.sh '+fileName, 'exit'], {filePath: fileName+'.log'}).on('end', function(){
                            log(color.green(fileName) + ' Finished Packing');
                            ssh.sftp('read', ZipServerCfg.UAT.WEB.tarDownFiles+(fileName.substring(0, fileName.length-4)+'.tar.gz')).pipe(gulp.dest('tar'));
                        }).pipe(gulp.dest('logs'));
            });
            //return stream;
        }
    }));
});

想达到的效果:

循环所有 LST 文件 - 上传 LST 文件 - 执行打包 - 下载打包文件

现在问题:

image 会一直卡在这里..不知道怎么去描述这个问题出在哪里了..

zensh commented 9 years ago

ssh.sftp('read' 执行成功了吗? 异步流很凌乱,gulp 肯定不知道何时结束

mice33 commented 9 years ago

每一部都执行成功了, 我用的.on('end'不知道是否正确 , 但是现在卡在 好像是ssh没有关闭样的, 不会执行到以下反馈

[11:31:14] Finished 'test' after 3.05 s
[11:31:14] gulp-ssh :: End
[11:31:14] gulp-ssh :: Close
zensh commented 9 years ago

stream 和 回调嵌套太复杂了,应该重新整理一下逻辑。

目前 GulpSSH 没有提供自动关闭 ssh 连接的功能,而是由 gulp 任务完成后关闭进程时自动触发 ssh 关闭连接的。

这里,你的 gulp task 写得有问题,gulp 不知道任务什么时候结束,ssh 连接自然也不会关闭,直到超时。

mice33 commented 9 years ago

对, 我觉得就是这个问题.. 但是我现在这个逻辑应该按什么方式来写呢.

zensh commented 9 years ago

首先,必须 return stream,即:

return gulp.src('lst/*.lst')...

其次,建议分解成多个子任务。 最后,你必须先弄明白 stream 的组合。 总之,你得深入研究一下 stream。