2016-04-01 13 views
0

私はgulp-awspublishを使用してS3バケットにデプロイされる単純なシングルページアプリケーションを持っています。 (gulp-prompt経由)を使用して、デプロイするバケットをデベロッパーに問い合わせます。1つのファイルを複数のs3バケットにgulp-awspublishで書き込む

アプリが複数のS3バケットに展開されることがあります。現在のところ、1つのバケットしか選択できないため、開発者は各バケットの順番にgulp deployにする必要があります。これは鈍く、エラーが発生しやすい。

複数のバケットを選択してそれぞれに同じコンテンツを展開できます。 inquirer.js/gulp-promptで複数のバケットを選択するのは簡単ですが、単一のストリームから任意の複数のS3送り先を生成するのは簡単ではありません。

私たちのdeployタスクは、generator-webappのS3 recipeに基づいています。このレシピでは、gulp-renameは、特定のバケットに書き込むパスを書き換えることを提案しています。

gulp.task('deploy', ['build'],() => { 
    // get AWS creds 
    if (typeof(config.awsCreds) !== 'object') { 
    return console.error('No config.awsCreds settings found. See README'); 
    } 

    var dirname; 
    const publisher = $.awspublish.create({ 
    key: config.awsCreds.key, 
    secret: config.awsCreds.secret, 
    bucket: config.awsCreds.bucket 
    }); 

    return gulp.src('dist/**/*.*') 
    .pipe($.prompt.prompt({ 
     type: 'list', 
     name: 'dirname', 
     message: 'Using the ‘' + config.awsCreds.bucket + '’ bucket. Which hostname would you like to deploy to?', 
     choices: config.awsCreds.dirnames, 
     default: config.awsCreds.dirnames.indexOf(config.awsCreds.dirname) 
    }, function (res) { 
     dirname = res.dirname; 
    })) 
    .pipe($.rename(function(path) { 
     path.dirname = dirname + '/dist/' + path.dirname; 
    })) 
    .pipe(publisher.publish()) 
    .pipe(publisher.cache()) 
    .pipe($.awspublish.reporter()); 
}); 

それがうまくいけば明らかだが、config.awsCredsは次のようになります。:現在、私たちの仕事は、このようになります

awsCreds: { 
    dirname: 'default-bucket', 
    dirnames: ['default-bucket', 'other-bucket', 'another-bucket'] 
} 

ガルプ・名前変更は、正しいバケツを使用する先のパスを書き換えます。

gulp-promptオプションで「リスト」ではなく「チェックボックス」を使用して複数のバケットを選択できますが、複数のバケットにどのように配信するかはわかりません。

一言で言えば、$.promptが文字列ではなく文字列の配列を返す場合、単一のバケットではなく複数の送り先(バケット)にソースを書き込むにはどうすればよいですか?

gulp.dest()は使用されておらず、gulp.awspublish()のみが選択されています。選択できるバケットの数はわかりません。

答えて

1

はS3を使ったことがないが、私はあなたの質問を理解していれば、チェックボックスdefault-bucketother-bucketが選択されている場合、正しくファイルjs/foo.jsdefault-bucket/dist/js/foo.jsother-bucket/dist/js/foo.jsに名前を変更すべきか?私はあなたが投稿コードから変更を行っコメント

// additionally required modules 
var path = require('path'); 
var through = require('through2').obj; 

gulp.task('deploy', ['build'],() => { 
    if (typeof(config.awsCreds) !== 'object') { 
    return console.error('No config.awsCreds settings found. See README'); 
    } 

    var dirnames = []; // array for selected buckets 
    const publisher = $.awspublish.create({ 
    key: config.awsCreds.key, 
    secret: config.awsCreds.secret, 
    bucket: config.awsCreds.bucket 
    }); 

    return gulp.src('dist/**/*.*') 
    .pipe($.prompt.prompt({ 
     type: 'checkbox', // use checkbox instead of list 
     name: 'dirnames', // use different result name 
     message: 'Using the ‘' + config.awsCreds.bucket + 
       '’ bucket. Which hostname would you like to deploy to?', 
     choices: config.awsCreds.dirnames, 
     default: config.awsCreds.dirnames.indexOf(config.awsCreds.dirname) 
    }, function (res) { 
     dirnames = res.dirnames; // store array of selected buckets 
    })) 
    // use through2 instead of gulp-rename 
    .pipe(through(function(file, enc, done) { 
     dirnames.forEach((dirname) => { 
     var f = file.clone(); 
     f.path = path.join(f.base, dirname, 'dist', 
          path.relative(f.base, f.path)); 
     this.push(f); 
     }); 
     done(); 
    })) 
    .pipe(publisher.cache()) 
    .pipe($.awspublish.reporter()); 
}); 

お知らせ:

次にこれはトリックを行う必要があります。

ストリームを通過する各ファイルを複製するには、through2を使用します。各ファイルは、バケットチェックボックスが選択された回数だけ複製され、各クローンの名前が変更されて別のバケットになります。

+0

優秀、ありがとう、スヴェン。私は何か似てみましたが、明らかに構文が間違っています。 – mattcooney

+0

(私が誤ってサンプルコードから除外した 'publisher.publish()'行を追加したのは初めてでした)。 – mattcooney

関連する問題