SlideShare a Scribd company logo
1 of 38
Download to read offline
New Generation
Build System

「Fly」
JSオジサン#6 2日目

@deepblue_will
自己紹介
Goodpatch, Inc.
杉原碧志(あおし)
@deepblue_will
• Prottのフロントエンド担当
• Java(SWT) → 

Ruby(Ruby on Rails) →
JavaScript(AngularJS)
• 外部のイベントでLTするの
は初めてです
新しいビルドツール

「Fly」

の話をします
Flyの特徴は?

Gulpとの違いは?
ES6(2015)
で記述
ES6(2015)で記述
• Generators
• Promises
• (async/await)
export default function* () {

yield this.watch("src/**/*.js", ["build"])

}



export function* build () {

yield this.clear("dist")

yield this

.source("src/**/*.js")

.babel({ presets: ["es2015"], sourceMaps: true })

.concat("foobar.js")

.target("dist")

}
flyfile.js
コードに近い設定ファイル
コードに近い設定ファイル
• Gulpと同じく「設定よりもコード」という思
想
• Gulpと比べて、よりコードを書くように設定
ファイルを作れる
gulpfileとflyfile
var gulp = require('gulp');

var $ = require('gulp-load-plugins')();

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

gulp.src('src/styles/**/*.scss')

.pipe($.sass({

outputStyle: "expanded",

sourceMap: true

}))

.pipe($.postcss([

require('autoprefixer')({browsers: ['> 5%']}),

require('css-mqpacker')()

]))

.pipe(gulp.dest('dist'));

});

gulpfile.js
export function* sass() {

yield this

.source('src/styles/**/*.scss')

.sass({

outputStyle: 'expanded',

sourceMap: true

})

.postcss({

processors: [

require('autoprefixer')({browsers: ['> 5%']}), 

require('css-mqpacker')()

]

})

.target("dist");

}

flyfile.js
var gulp = require('gulp');

var $ = require('...')();

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

gulp.src('')

.pipe($.sass())

.pipe($.postcss())

.pipe(gulp.dest(''));

});

export function* sass() {

yield this

.source('')

.sass()

.postcss()

.target('');

}

関数名 = タスク名
var gulp = require('gulp');

var $ = require('...')();

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

gulp.src('')

.pipe($.sass())

.pipe($.postcss())

.pipe(gulp.dest(''));

});

export function* sass() {

yield this

.source('')

.sass()

.postcss()

.target('');

}

pipeなし
var gulp = require('gulp');

var $ = require('...')();

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

gulp.src('')

.pipe($.sass())

.pipe($.postcss())

.pipe(gulp.dest(''));

});

export function* sass() {

yield this

.source('')

.sass()

.postcss()

.target('');

}

requireの必要がない
その他
• clear, concatなど、便利なのが標準である
• gulp-concat, delいらない
• watch中にエラーでオチない
• gulp-plumberいらない 
• 並列処理と直列処理が選べる
• run-sequenceいらない
Fly良さそう
Flyでビルド環境構築

してみよう!
I can’t fly.. \(^o^)/
プラグインが少なすぎて

やりたいことできない問題
GulpとFlyのプラグインの数
• Fly: 50個ぐらい
• https://www.npmjs.com/browse/keyword/fly
• Gulp: 2000個以上!
• https://www.npmjs.com/browse/keyword/gulp
ならプラグイン
作ってみよう
Flyプラグインは簡単に作れる
'use strict';



var gutil = require('gulp-util');

var through = require('through2');

var assign = require('object-assign');

var path = require('path');

var applySourceMap = require('vinyl-sourcemaps-apply');



var PLUGIN_NAME = 'gulp-sass';



//////////////////////////////

// Main Gulp Sass function

//////////////////////////////

var gulpSass = function gulpSass(options, sync) {

return through.obj(function (file, enc, cb) {

var opts,

filePush,

errorM,

callback,

result;



if (file.isNull()) {

return cb(null, file);

}

if (file.isStream()) {

return cb(new gutil.PluginError(PLUGIN_NAME, 'Streaming not supported'));

}

if (path.basename(file.path).indexOf('_') === 0) {

return cb();

}

if (!file.contents.length) {

file.path = gutil.replaceExtension(file.path, '.css');

return cb(null, file);

}





opts = assign({}, options);

opts.data = file.contents.toString();



// Ensure `indentedSyntax` is true if a `.sass` file

if (path.extname(file.path) === '.sass') {

opts.indentedSyntax = true;

}



// Ensure file's parent directory in the include path

if (opts.includePaths) {

if (typeof opts.includePaths === 'string') {

opts.includePaths = [opts.includePaths];

}

}

else {

opts.includePaths = [];

}



opts.includePaths.unshift(path.dirname(file.path));



// Generate Source Maps if plugin source-map present

if (file.sourceMap) {

opts.sourceMap = file.path;

opts.omitSourceMapUrl = true;

opts.sourceMapContents = true;

}



//////////////////////////////

// Handles returning the file to the stream

//////////////////////////////

filePush = function filePush(sassObj) {

var sassMap,

sassMapFile,

sassFileSrc,

sassFileSrcPath,

sourceFileIndex,

filteredSources;



// Build Source Maps!

if (sassObj.map) {

// Transform map into JSON

sassMap = JSON.parse(sassObj.map.toString());

// Grab the stdout and transform it into stdin

sassMapFile = sassMap.file.replace('stdout', 'stdin');

// Grab the base file name that's being worked on

sassFileSrc = file.relative;

// Grab the path portion of the file that's being worked on

sassFileSrcPath = path.dirname(sassFileSrc);

if (sassFileSrcPath) {

//Prepend the path to all files in the sources array except the file that's being worked on

gulp-sass → 185行
const sass = require("node-sass").render;

const assign = require("object-assign");

module.exports = function (debug) {

this.filter("sass", (data, options) => {

return this.defer(sass)(assign({data: data.toString()}, assign({

outFile: options.sourceMap ? "." : "",

file: options.filename

}, options))).then((result) => assign({ext: ".css"}, result))

})

};

fly-sass→ 11行
ためしに簡単なものを
作ってみた
fly-markdown2html
• markdownをhtmlに変換
• 需要はまったくないと思う
• plugin作り方を把握するためにとりあえず簡単なものを作ってみたかった
だけです。
• https://github.com/deepblue-will/fly-
markdown2html
export default function () {

this.filter("markdown2html", (data, options) => {

return {

code: require("markdown-it")(options).render(data.toString()),

ext: ".html"

}

})

}

fly-markdown2html
flyのプラグイン作り
• yo fly
• プラグインを作るためのGeneratorがある
• https://github.com/bucaran/generator-fly
• Fly.prototype.filter (name, (data, option) => {})
• name: プラグイン名
• data: Buffer
• option: プラグインを呼ぶ時に指定したoption
• {code: 変換結果(String), ext: 拡張子}かPromiseを返却する
とこんな感じに簡単に
プラグインが作れちゃいます!
まとめ
まとめ①
• 設定ファイルが簡潔になる
• 関数名 = タスク名
• pipeいらない
• requireいらない
まとめ②
• プラグインが少ない
• でも簡単に作れる
• 作るなら今!
https://github.com/
deepblue-will/fly-template
(途中で挫折した)
Goodpatchでは
I can fly!なエンジニアを絶賛募集中です!
https://www.wantedly.com/companies/
goodpatch/projects
ご静聴ありがとう
ございました!

More Related Content

What's hot

Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Satoshi Kume
 
オンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてオンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてYASUKAZU NAGATOMI
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装Yohei Fushii
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門keroyonn
 
Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)Kimiyuki Yamauchi
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方Soudai Sone
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたKatsuhiro Miura
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例Koichi Shimozono
 
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 springGo言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 springTakuya Ueda
 
Offline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはすOffline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはすKiwamu Okabe
 
Cakephpstudy5 hacks jp
Cakephpstudy5 hacks jpCakephpstudy5 hacks jp
Cakephpstudy5 hacks jpHiroki Shimizu
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみるairtoxin Ishii
 

What's hot (20)

Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Mac_Terminal_ver1.0
Mac_Terminal_ver1.0
 
オンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用についてオンプレでPrivate Registry使ったDockerイメージの運用について
オンプレでPrivate Registry使ったDockerイメージの運用について
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
Rails
RailsRails
Rails
 
node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装
 
実用裏方 Perl 入門
実用裏方 Perl 入門実用裏方 Perl 入門
実用裏方 Perl 入門
 
Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)Lamp環境&Wordpress設定(debian)
Lamp環境&Wordpress設定(debian)
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
CHP survey
CHP surveyCHP survey
CHP survey
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみた
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
 
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 springGo言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 spring
 
Offline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはすOffline Hoogleで何処でもはすはす
Offline Hoogleで何処でもはすはす
 
Cakephpstudy5 hacks jp
Cakephpstudy5 hacks jpCakephpstudy5 hacks jp
Cakephpstudy5 hacks jp
 
Slub data structure
Slub data structureSlub data structure
Slub data structure
 
zsh とわたし
zsh とわたし zsh とわたし
zsh とわたし
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
 

Similar to New Generation Build System "Fly"

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみたYuki Takei
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験Toshio Ehara
 
SparqlEPCUが提供するlod開発プラットフォーム
SparqlEPCUが提供するlod開発プラットフォームSparqlEPCUが提供するlod開発プラットフォーム
SparqlEPCUが提供するlod開発プラットフォームChubu University
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
Rails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2editionRails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2editionSatomi Tsujita
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
Grunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanakaGrunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanakaHisateru Tanaka
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能についてshigeki_ohtsu
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス5mingame2
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話Hiroyuki Kusu
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application FrameworkLearningTech
 

Similar to New Generation Build System "Fly" (20)

Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
SparqlEPCUが提供するlod開発プラットフォーム
SparqlEPCUが提供するlod開発プラットフォームSparqlEPCUが提供するlod開発プラットフォーム
SparqlEPCUが提供するlod開発プラットフォーム
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
Rails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2editionRails初心者レッスン lesson5 2edition
Rails初心者レッスン lesson5 2edition
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
Grunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanakaGrunt front-osaka-1-lt-tanaka
Grunt front-osaka-1-lt-tanaka
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application Framework
 

New Generation Build System "Fly"