質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.43%

  • Node.js

    2076questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • JSON

    1286questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • gulp

    296questions

    gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

gulpでsftp通信でファイルアップロードの自動化

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,493

minehan

score 146

いつもお世話になっております。
現在gulpの勉強中でタイトルのようなことを実現しようとしているのですが、途中で詰まっています。
どなたか聡明なエンジニア様お助けいただけたら幸いです。

前提・実現したいこと

gulpを使用して、watchで監視してファイルに変更があった際サーバー(sftp)に自動でアップロード

現在の状況

プラグインはgulp-sftpを使用しています。
該当ファイルの監視とアップロードの自動化はできているのですが、リモート先のパスが固定のため、ローカルパスと同期ができていません。ここ修正できれば完成する所存です。

/************************************************
 * モジュールの読み込みや設定
 ************************************************/

var gulp = require('gulp');
var sftp = require('gulp-sftp');
var fs = require('fs');

var sftpconfig = JSON.parse(fs.readFileSync('sftpconfig.json', 'utf8'));

/************************************************
 * タスク一覧
 ************************************************/

gulp.task('upload', function () {
  gulp.watch("該当ディレクトリ/**", function(){
  gulp.src([
    '該当ディレクトリ/img/*.png',
    '該当ディレクトリ/css/*.css,
    '該当ディレクトリ/js/*.js
  ])
    .pipe($.sftp(sftpconfig))
  });
});
{
    "host"      : "000.000.000.000",
    "port"      : 00,
    "user"      : "hogehoge",
    "keyLocation": "~/.ssh/id_rsa",
    "password"      : "hogehoge",
    "remotePath": "/usr/share/nginx/html/該当サイト/該当ディレクトリ/"
}

今回使用している部分だけソースを書き出しました。
サーバー情報はダミーです。

以上になります。お手数ですがよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

リモート先のパスが固定のため、ローカルパスと同期ができていません。

とは、
imgcssjs それぞれのディレクトリの内容物が全部
該当ディレクトリ 直下に入ってしまうので、ディレクトリの構造を維持したままアップロードしたい」
という事でよろしいでしょうか?

意図されている内容と異なるかもしれませんが、とりあえずそのように仮定して解答させていただきます。
(もし異なる場合は期待する動作について詳細の追記をお願いします。)

今回使用されている gulp-sftp についてですが、
こちらは渡されたディレクトリ構造を維持してアップロードを試みてくれるようです。

よって、gulp.src()でディレクトリ構造を含んだ状態で取り出して
pipe()に渡してあげればOK、と言う事になります。

具体的には

gulp.task('upload', function () {
  gulp.watch("target/**/*", function(){
  gulp.src([
    'target/img/**/*.png',
    'target/css/**/*.css',
    'target/js/**/*.js'
  ], {base: 'target'})
    .pipe(sftp(sftpconfig))
  });
});

このような形になるかと思います。

変更天としては2点、

  • 各ファイル指定の間に /**/ を追加しました

** はディレクトリを再帰的に辿る事を意味します。
これを入れることによって、target/img/ 等の直下だけでなく、
target/img/this/is/long/path/pic.pngのような深い階層まで構造を維持して取得できます。

  • gulp.src()のオプションに base: (該当ディレクトリ) の表記を追加しました

通常、gulp.src()で取得された構造は、ワイルドカード以下になります。
よって、先ほどの例で言うと 'target/img/**/*.png' という表記で取得するとディレクトリ構造は
this/is/long/path/pic.png となり、imgディレクトリは含まれない状態で取得されます。
よって、他のディレクトリの内容と混ざってしまうこととなります。

target/**/*.pngと書けばディレクトリごとに分けられますが、
そうすると今度は無駄なディレクトリまで拾ってしまう可能性があります。

幸い、gulp.src()にはオプションとして、起点となるディレクトリを指定できるので、
今回の場合は {base: 'target'}として、targetディレクトリ以下のディレクトリ構造を
取得するように指定しました。

以上、この2点の変更を行うことで、それぞれのディレクトリ構造を保ったままアップロードが可能となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/10 05:25

    コメントありがとうございました。
    投稿の後に自己解決しました。申し訳ないです。
    また返信遅くなってすいませんでした。

    キャンセル

0

下記にて力技ですが自己解決しました。

/************************************************
 * モジュールの読み込みや設定
 ************************************************/
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var fs = require('fs');

var sftpconfig = JSON.parse(fs.readFileSync('sftpconfig.json', 'utf8')); //サーバー情報を外部ファイルから読み込み

/************************************************
 * タスク一覧
 ************************************************/
//自動アップロードしたい分だけ書く
gulp.task('uploadImg', function () {
  gulp.watch("webroot/img/**", function(){
  var server = sftpconfig.server[0];
  var path = sftpconfig.path[0];
  Object.assign(server, path);
  gulp.src([
    'webroot/img/*.png',
    'webroot/img/*.jpg',
    'webroot/img/*.gif'
  ])
    .pipe($.plumber())
    .pipe($.sftp(server))
  });
});

gulp.task('uploadController', function () {
  gulp.watch("src/Controller/**", function(){
  var server = sftpconfig.server[0];
  var path = sftpconfig.path[1];
  Object.assign(server, path);
    gulp.src([
      'src/Controller/*.php'
    ])
      .pipe($.plumber())
      .pipe($.sftp(server))
  });
});

//最後に一括にまとめる
gulp.task('upload',['uploadImg','uploadController'], function() {
});
{
  "server":[
    {"host": "秘密です","port": 秘密です,"user": "piyopiyo","keyLocation": "~/.ssh/id_rsa","password": "秘密です"}
  ],
  "path":[
    {"remotePath": "/usr/share/nginx/html/hogehoge/webroot/img/"},
    {"remotePath": "/usr/share/nginx/html/hogehoge/src/Controller/"}
  ]
}


省略して書きましたが実際には膨大な数書いてます。
結局調べてよく分からなかったので一つ一つディレクトリーを指定しています。
またディレクトリの指定をwatchの内側で宣言しないと最後に一括でまとめた際に期待した動作になってくれなかったです。(AのデータがBのディレクトリに格納されてしまうような感じです。)
もっと綺麗な書き方があると思いますが、とりあえず目的は達成しましたのでこちらでこの質問は閉めさせてもらいます。
閲覧&クリップ&回答ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.43%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Node.js

    2076questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • JSON

    1286questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • gulp

    296questions

    gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。