npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

gulp-task

v2.1.0

Published

A wrapper of gulp.task that enables promise-based dependency management

Downloads

251

Readme

gulp-task

Basic Info

Preface

This was written as a wrapper for gulp.task in order to get promise-based dependency management.

The documentation and source is written in coffeescript but it should work with vanilla gulp just the same.

Installation

npm install --save gulp-task
task = require 'gulp-task'

Optionally, you can configure it to automatically register gulp tasks:

task.configure gulp

API

This module has 4 functions. Here is the order that you'll most likely use them:

  • task.configure
  • task
  • task.run
  • task.watch
  • task.getTaskNames

task.configure(gulp)

This makes it so that when you run task(name, cb), you also register the same task with gulp, enabling command line execution.

task(name, cb)

This registers a new task to later be run via task.run. Dependencies are taken care of via promises.

task.run(name|cb)

This accepts either the name of a previously registered task or an anonymous function.

task.getTaskNames()

This simply returns a sorted list the names of registered tasks.

Notes

A Note About Not Running task.configure

This module was written as a replacement for gulp.task. You're still free to use gulp.task directly but those tasks registered via gulp.task will not be visible via task.run. A usage where you don't run task.configure gulp might looks something like:

gulp.task 'build', ->
	task.run 'compile'
	.then -> task.run 'copy'
task 'compile', -> #compile code
task 'copy', -> #copy code

In this case, you'd be able to run coffeegulp build from command-line but not coffeegulp compile or coffeegulp copy.
This "private task" effect is why configuring was made optional.

A Note About Tasks

task.run returns a Promise. How that promise is resolved depends on the return value of the function being run.

Regardless of if you're running an anonymous function or calling a registered one by name, the nature of the returned promise falls into three cases.

Case 1: Task Returns a Promise

This is simple enough. task.run simply returns the promise.

Case 2: Task Returns a Stream

task.run returns a promise that resolves via .pipe gulpCallback -> resolve stream

Case 3: Task Returns Something Else

In this event, task.run simply returns a resolved promise after running the task.

A Note About .then -> gulp.src

Let's say that you're defining a task that does some stuff via task.run and then calls .then on the promise and provides a callback which returns a Stream.

This would be an issue. The resolve chain would not wait for the gulp.src stream to end before continuing.
This might result in unexpected concurrency and reporting issues.

It's important to wrap streams in a task.run -> when being called from within a .then ->.

###Acceptable

task 'copy', ->
	gulp.src('src')
	.pipe gulp.dest 'dest'
task 'build', ->
	task.run 'compile'
	.then -> task.run 'copy'
task 'build', ->
	task.run 'compile'
	.then -> task.run ->
		gulp.src('src')
		.pipe gulp.dest 'dest'
task 'build', ->
	task.run 'compile'
	.then ->
		somethingSynchronous()
task 'watch', ->
  task.run 'compile'
  .then -># Warning: This is over-simplified and potentially problematic.
          # See "Watch Example" below for more info.
    gulp.watch ['src/**/*.coffee'], -> task.run 'compile'

###Not Acceptable

task 'build', ->
	task.run 'compile'
	.then ->
		gulp.src('src')
		.pipe gulp.dest 'dest'

Examples


Semi-Realistic Stream Example

gulpfile.coffee

task = require 'gulp-task'
gulp = require 'gulp'
coffee = require 'gulp-coffee'
jade = require 'gulp-jade'
rimraf = require 'gulp-rimraf'
Promise = require 'bluebird'
task.configure gulp

task 'refresh', ->
	task.run 'clean'
	.then -> task.run 'compile'

task 'clean', ->
	gulp.src 'bin', read: false
	.pipe rimraf()

task 'compile', ->
	Promise.all([
		task.run 'compile:coffee'
		task.run 'compile:jade'
	])

task 'compile:coffee', ->
  gulp.src "src/**/*.coffee"
  .pipe coffee()
  .pipe gulp.dest 'bin'

task 'compile:jade', ->
  gulp.src "src/**/*.jade"
  .pipe jade()
  .pipe gulp.dest 'bin'

Output

$ coffeegulp rebuild
[gulp] Using gulpfile ~/Documents/GitProjects/gulp-task/gulpfile.coffee
[gulp] Starting 'rebuild'...
[task] Running 'rebuild'
[task] Running 'clean'
[task] Finished 'clean' in 11.546 ms
[task] Running 'compile'
[task] Running 'compile:coffee'
[task] Running 'compile:jade'
[task] Finished 'compile:coffee' in 56.239 ms
[task] Finished 'compile:jade' in 53.605 ms
[task] Finished 'compile' in 56.998 ms
[task] Finished 'rebuild' in 69.254 ms
[gulp] Finished 'rebuild' after 69 ms

Hello World

gulpfile.coffee

task = require 'gulp-task'
gulp = require 'gulp'
task.configure gulp

task 'default', ->
	task.run 'hello'

task 'hello', ->
	console.log 'Hello World!'

Output

$ coffeegulp
[gulp] Using gulpfile ~/Documents/GitProjects/gulp-task/gulpfile.coffee
[gulp] Starting 'default'...
[task] Running 'default'
[task] Running 'hello'
Hello World!
[task] Finished 'hello' in 1.244 ms
[task] Finished 'default' in 1.728 ms
[gulp] Finished 'default' after 1.91 ms

Basic Stream

gulpfile.coffee

task = require 'gulp-task'
gulp = require 'gulp'
coffee = require 'gulp-coffee'
gulp = require 'gulp'
task.configure gulp

task 'compile', ->
  gulp.src "src/**/*.coffee"
  .pipe coffee()
  .pipe gulp.dest 'bin'

Output

$ coffeegulp compile
[gulp] Using gulpfile ~/Documents/GitProjects/gulp-task/gulpfile.coffee
[gulp] Starting 'compile'...
[task] Running 'compile'
[task] Finished 'compile' in 22.872 ms
[gulp] Finished 'compile' after 23 ms

Basic task.watch

gulpfile.coffee

task = require 'gulp-task'
gulp = require 'gulp'
coffee = require 'gulp-coffee'
gulp = require 'gulp'
task.configure gulp

task 'compile', ->
  gulp.src "src/**/*.coffee"
  .pipe coffee()
  .pipe gulp.dest 'bin'

task 'watch', ->
  task.run 'compile'
  .then ->
    task.watch ['src/**/*.coffee'], -> task.run 'compile'

Output

$ coffeegulp watch
[gulp] Using gulpfile ~/Documents/GitProjects/gulp-task/gulpfile.coffee
[gulp] Starting 'watch'...
[task] Running 'watch'
[task] Running 'compile'
[task] Finished 'compile' in 14.42 ms
[task] Finished 'watch' in 20.66 ms
[gulp] Finished 'watch' after 21 ms
<MADE CHANGE>
[task] Running 'compile'
[task] Finished 'compile' in 3.800 ms

Running Tasks in Series / Using Promises

gulpfile.coffee

task = require 'gulp-task'
gulp = require 'gulp'
task.configure gulp
Promise = require 'bluebird'

task 'series', ->
	task.run 'a'
	.then -> task.run 'b'
	.then ->
		console.log 'We Are Done'

task 'a', -> new Promise (resolve, reject)->
	setTimeout ->
		console.log 'Task A!'
		resolve()
	, 1500

task 'b', -> new Promise (resolve, reject)->
	setTimeout ->
		console.log 'Task B!'
		resolve()
	, 2000

Output

$ coffeegulp series
[gulp] Using gulpfile ~/Documents/GitProjects/gulp-task/gulpfile.coffee
[gulp] Starting 'series'...
[task] Running 'series'
[task] Running 'a'
Task A!
[task] Finished 'a' in 1.502 s
[task] Running 'b'
Task B!
[task] Finished 'b' in 2.001 s
We Are Done
[task] Finished 'series' in 3.504 s
[gulp] Finished 'series' after 3.5 s

Running Tasks in Parallel / Using Promises

gulpfile.coffee

task = require 'gulp-task'
gulp = require 'gulp'
task.configure gulp
Promise = require 'bluebird'

task 'parallel', ->
	Promise.all([
		task.run 'a'
		task.run 'b'
	]).then ->
		console.log 'We Are Done'

task 'a', -> new Promise (resolve, reject)->
	setTimeout ->
		console.log 'Task A!'
		resolve()
	, 1500

task 'b', -> new Promise (resolve, reject)->
	setTimeout ->
		console.log 'Task B!'
		resolve()
	, 2000

Output

$ coffeegulp parallel
[gulp] Using gulpfile ~/Documents/GitProjects/gulp-task/gulpfile.coffee
[gulp] Starting 'parallel'...
[task] Running 'parallel'
[task] Running 'a'
[task] Running 'b'
Task A!
[task] Finished 'a' in 1.502 s
Task B!
[task] Finished 'b' in 2.002 s
We Are Done
[task] Finished 'parallel' in 2.003 s
[gulp] Finished 'parallel' after 2 s