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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

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

Node.js

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

gulp

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

Q&A

解決済

2回答

3405閲覧

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

minehan

総合スコア170

JSON

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

Node.js

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

gulp

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

0グッド

1クリップ

投稿2016/11/06 07:03

編集2016/11/06 07:08

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

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

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

javascript

1/************************************************ 2 * モジュールの読み込みや設定 3 ************************************************/ 4 5var gulp = require('gulp'); 6var sftp = require('gulp-sftp'); 7var fs = require('fs'); 8 9var sftpconfig = JSON.parse(fs.readFileSync('sftpconfig.json', 'utf8')); 10 11/************************************************ 12 * タスク一覧 13 ************************************************/ 14 15gulp.task('upload', function () { 16 gulp.watch("該当ディレクトリ/**", function(){ 17 gulp.src([ 18 '該当ディレクトリ/img/*.png', 19 '該当ディレクトリ/css/*.css, 20 '該当ディレクトリ/js/*.js 21 ]) 22 .pipe($.sftp(sftpconfig)) 23 }); 24}); 25

json

1{ 2 "host" : "000.000.000.000", 3 "port" : 00, 4 "user" : "hogehoge", 5 "keyLocation": "~/.ssh/id_rsa", 6 "password" : "hogehoge", 7 "remotePath": "/usr/share/nginx/html/該当サイト/該当ディレクトリ/" 8}

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

javascript

1/************************************************ 2 * モジュールの読み込みや設定 3 ************************************************/ 4var gulp = require('gulp'); 5var $ = require('gulp-load-plugins')(); 6var fs = require('fs'); 7 8var sftpconfig = JSON.parse(fs.readFileSync('sftpconfig.json', 'utf8')); //サーバー情報を外部ファイルから読み込み 9 10/************************************************ 11 * タスク一覧 12 ************************************************/ 13//自動アップロードしたい分だけ書く 14gulp.task('uploadImg', function () { 15 gulp.watch("webroot/img/**", function(){ 16 var server = sftpconfig.server[0]; 17 var path = sftpconfig.path[0]; 18 Object.assign(server, path); 19 gulp.src([ 20 'webroot/img/*.png', 21 'webroot/img/*.jpg', 22 'webroot/img/*.gif' 23 ]) 24 .pipe($.plumber()) 25 .pipe($.sftp(server)) 26 }); 27}); 28 29gulp.task('uploadController', function () { 30 gulp.watch("src/Controller/**", function(){ 31 var server = sftpconfig.server[0]; 32 var path = sftpconfig.path[1]; 33 Object.assign(server, path); 34 gulp.src([ 35 'src/Controller/*.php' 36 ]) 37 .pipe($.plumber()) 38 .pipe($.sftp(server)) 39 }); 40}); 41 42//最後に一括にまとめる 43gulp.task('upload',['uploadImg','uploadController'], function() { 44});

json

1{ 2 "server":[ 3 {"host": "秘密です","port": 秘密です,"user": "piyopiyo","keyLocation": "~/.ssh/id_rsa","password": "秘密です"} 4 ], 5 "path":[ 6 {"remotePath": "/usr/share/nginx/html/hogehoge/webroot/img/"}, 7 {"remotePath": "/usr/share/nginx/html/hogehoge/src/Controller/"} 8 ] 9}

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

投稿2016/11/09 20:23

minehan

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

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

具体的には

javascript

1gulp.task('upload', function () { 2 gulp.watch("target/**/*", function(){ 3 gulp.src([ 4 'target/img/**/*.png', 5 'target/css/**/*.css', 6 'target/js/**/*.js' 7 ], {base: 'target'}) 8 .pipe(sftp(sftpconfig)) 9 }); 10});

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

変更天としては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/08 16:50

ezaki

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minehan

2016/11/09 20:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問