Declarative
Build Configurations

Build Configurations?







That's a lot of configuration!

A typical
app layout

Actual app files
Build tool
related
Configuration
files
Can we do better?
Declarative?
Let's go to a
restaurant
do you
make your
own food?
Are you stating what needs to be done?
Of course not!
Case study
GulpJs

gulp.task('clean', function(cb) {
del(['build'], cb);
});
gulp.task('scripts', ['clean'], function() {
return gulp.src(paths.scripts)
.pipe(sourcemaps.init())
.pipe(coffee())
.pipe(uglify())
.pipe(concat('all.min.js'))
.pipe(sourcemaps.write())
.pipe(gulp.dest('build/js'));
});
gulp.task('images', ['clean'], function() {
return gulp.src(paths.images)
.pipe(imagemin({optimizationLevel: 5}))
.pipe(gulp.dest('build/img'));
});
gulp.task('watch', function() {
gulp.watch(paths.scripts, ['scripts']);
gulp.watch(paths.images, ['images']);
});
gulp.task('default', ['watch', 'scripts', 'images']);
gulp.task('clean', function(cb) {
del(['build'], cb);
});
gulp.task('scripts', ['clean'], function() {
return gulp.src(paths.scripts)
.pipe(sourcemaps.init())
.pipe(coffee())
.pipe(uglify())
.pipe(concat('all.min.js'))
.pipe(sourcemaps.write())
.pipe(gulp.dest('build/js'));
});
gulp.task('images', ['clean'], function() {
return gulp.src(paths.images)
.pipe(imagemin({optimizationLevel: 5}))
.pipe(gulp.dest('build/img'));
});
gulp.task('watch', function() {
gulp.watch(paths.scripts, ['scripts']);
gulp.watch(paths.images, ['images']);
});
gulp.task('default', ['watch', 'scripts', 'images']);
We are telling Gulp everything!
How When What Where
Can we do better?
What about
maintenance?
Case study
sofa.io


21 Projects
21 Gruntfiles

Let's switch to Gulpjs!

Can we do better?
Yes, we can!
Angus, a declarative build tool

How?
Convention
Over
Configuration
Installs globally
npm install -g angus

Actual app files
Taken care of by Angus
Taken care of by Angus
Common app structure
hello-world/
bower_components/
src/
assets/
style/
core/
index.html
angus.config.js
Declarative configuration
{
bower: {
packages: [
'angular',
'threejs',
'Keypress',
'underscore@1.7.0',
'angular-ui-router',
'hammerjs'
],
filesNeeded: {
js: [
'angular/angular.js',
'angular-ui-router/release/angular-ui-router.js',
'Keypress/keypress.js',
'hammerjs/hammer.min.js',
'threejs/build/three.js',
'underscore/underscore.js'
]
}
},
usesAngularJS: true,
testRunner: 'karma',
cssCompiler: 'less'
}
Embraces Bower

Even if you
don't like Bower...
Angus supports
local folders!
One command to build your app
angus dev

Every build task
is pre-configured!

Uses GulpJs internally

Production builds
angus prod
Case Study
Ironbane

Now using Angus!

Btw, if you want to work on a cool 3D WebGL game...
We're looking for people!
ironbane.com
github.com/ironbane
Any questions?
Oh and hey,
I'm Nick!

nickjanssen.com
@nickjanssen_com
Declarative Build Configurations
By Nick Janssen
Declarative Build Configurations
Tools like GruntJS and Yeoman are great, but they can be a headache when you need to maintain several apps. Most web apps share the same build tasks, yet they are usually copied over or generated instead of reusing them. Out of my own frustrating experience with copying and maintaining too many Gruntfiles, I decided to create a declarative build framework called Angus that chooses convention over configuration. This talk will explore the problem of build code duplication and how Angus can be used to resolve it.
- 9,219