- gulpの基本的な使い方
- gulpfile.jsの記述方法
- gulp.task(タスク名,function(){});
- gulp.src(globs[, options])
- gulp.pipe()
- gulp.dest(‘出力先フォルダ’)
- gulpの実行方法
- gulp default
- 同期実行時の注意
- gulp@4.0.2インストール
- gulp.taskが非推奨
- Did you forget to signal async completion?
- タスクの一覧
- npm i –productionを実行する
- gulp-s3-uploadモジュールでS3にアップロードする
- ReferenceError: primordials is not defined
- 関連
gulpの基本的な使い方
gulpの基本的な使い方です。gulpとは「タスクランナー」と呼ばれるモジュールです。
インストールしていない場合はこちらを参考にインストールしてください。(グローバルインストールするよりnpxコマンドでインストールするのが一般的なようです)
プロジェクト直下にgulpfile.jsをtouchコマンドか何かで作成します。(空ファイル)
gulpとgulp-mochaとchaiを使えばテストの自動化をすることができます。
さらにnycを使えばカバレッジレポートを出力することもできます。
gulpfile.jsの記述方法
gulpを使うには必須のファイルとなります。
gulp.task(タスク名,function(){});
gulpfile.jsは基本的には、gulp.taskが主な記述方法になります。function内にさらにタスクを書いていったりすることができます。
以下、使用するモジュールです。
let gulp = require('gulp'); let mocha = require('gulp-mocha'); let seq = require('run-sequence'); let exec = require('child_process').exec;
run-sequenceモジュールはタスクを同期実行してくれます。
child_processはgulpファイル内で、javaやコマンドを実行したい場合に使用するモジュールです。
例えば、まずDynamoDBを起動、起動後テスト実行、テスト完了後DynamoDBを終了する、と言った感じです。
以下、記述例です。タスク内では必ずreturnします。
let gulp = require('gulp'); let gulp-mocha = require('gulp-mocha'); let seq = require('run-sequence'); let exec = require('child_process'); gulp.task('unit', function() { seq( 'startup', 'test', 'shutdown' ); // startup,test,shutdownの順に同期実行してくれます }); gulp.task('startup',function() { exec('java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb -port 9999');// DynamoDB local起動 return; }); gulp.task('test' function() { return gulp.src(['./sample/**/*.*'], {read : false]) .pipe(gulp-mocha( reporter : 'mochawesome', reporterOptions : { reportDir : './sample/report/', autoOpen : true } )) }); gulp.task('shutdown' function() { exec('taskkill /im java.exe /f');// DynamoDB local起動に必要なjava.exeをtaskkillします return; }
DynamoDB localはJRE6以上が必要になります。なので、シャットダウンはjava.exeのプロセスを殺すことでシャットダウンと判断しています。
gulp.src(globs[, options])
srcの引数であるglobsにはglobもしくはglobの配列を指定します。optionsにはいくつかありますが、{read : false}と言うように記述します。readオプションはfalseに設定すると、ファイルを読み込まず、nullとしてfile.contentsを返します。
gulp.pipe()
pipeは一つ一つコマンドを繋げてくれます。gulp.src(…).pipe(…)というように記述します。
pipeの引数にはgulp-mochaのようにsrcで取得したファイル群に対してmochaを実行するという事が可能になります。
pipe().pipe()…というようにpipeメソッドはいくつでもつなげていくことが可能です。
gulp.dest(‘出力先フォルダ’)
stylusなどのSCSSをCSSにコンパイルする場合などにgulp.dest()を使うと便利です。
const gulp = require('gulp'); const stylus = require('gulp-stylus'); gulp.task('stylus', function() { return gulp.src('scss/*.stylus') .pipe(stylus()) .pipe(gulp.dest("css")); });
gulpの実行方法
gulpの実行方法は簡単です。
gulp タスク名
とタイプします。上記の場合ですと
gulp unit
とタイプすれば同期実行してくれます。
nycも使う場合は以下のようにタイプするとレポート出力もしてくれます。
nyc gulp unit
gulp default
同期実行時の注意
run-sequenceモジュールは同期する際に、各タスクのfunctionでreturnをするようにします。
これで確実に同期がとれるようです。
gulp4よりrun-sequenceではなく、gulp.seriesで同様の逐次処理が可能になりました。
gulp@4.0.2インストール
2020/01/06時点ではgulpは4.0.2が最新のようです。
npxでインストールします。詳細は「npxでローカルパッケージを実行できるんです! 」参照ください。
$ npm install -g npx $ npm install gulp --save-dev $ touch gulpfile.js $ npx gulp -v CLI version: 2.2.0 Local version: 4.0.2
実行方法はnpx gulp タスク名
となります。
gulp.taskが非推奨
gulp4ではgulp.taskが非推奨になっています。
gulp4からは以下のように記述します。
function deploy() { // 処理 } exports.deploy = deploy
Did you forget to signal async completion?
returnしていない場合、かつ、callbackを指定していない場合に発生するエラーです。returnを返さない処理の場合はコールバック関数で完了を知らせる必要があります。
function deploy(cb) { // cbがコールバック関数 // 処理 cb() // 終わりを知らせる }
タスクの一覧
タスクの一覧を見るには、npx gulp --tasks
コマンドで一覧を確認することができます。
npm i –productionを実行する
gulpでpackage.jsonを読み込んでnpm i --production
を実行することができます。--production
を指定することにより、devDependenciesのモジュールはインストールされません。
return gulp .src('./package.json') .pipe(gulp.dest('./modules')) // modulesフォルダ配下 .pipe( install({ // gulp-install production: true }) )
gulp-s3-uploadモジュールでS3にアップロードする
gulpでLambdaをS3にアップロードしたい時にgulp-s3-uploadモジュールを使用します。
以下はgulpfile.jsのタスクです。zipフォルダ配下の全てのzipファイルをS3の指定したバケットとオブジェクトキー配下にアップロードする例です。プロキシに注意しましょう。
const AWS = require('aws-sdk') function s3upload() { const config = { accessKeyId: AWS.config.credentials.accessKeyId, secretAccessKey: AWS.config.credentials.secretAccessKey, region: 'ap-northeast-1' } const s3 = require('gulp-s3-upload')(config) return gulp.src(['./zip/**.zip']).pipe( s3({ Bucket: `mybucket/zip`, ACL: 'public-read' }) ) } exports.s3upload = s3upload
ReferenceError: primordials is not defined
以下の環境で「ReferenceError: primordials is not defined」エラーが発生しました。
モジュール | バージョン |
---|---|
node | 20.5.0 |
gulp | 3.9.1 |
gulp-mocha | 6.0.0 |
gulpとgulp-mochaのバージョンを以下の通りに上げると解決しました。
モジュール | バージョン |
---|---|
node | 20.5.0 |
gulp | 4.0.2 |
gulp-mocha | 7.0.0 |
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント