diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ac3dc3b..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -*.iml -target -*.abc \ No newline at end of file diff --git a/CLI/src/main/as3/ftask.as b/CLI/src/main/as3/ftask.as deleted file mode 100644 index 32313ce..0000000 --- a/CLI/src/main/as3/ftask.as +++ /dev/null @@ -1,9 +0,0 @@ -include "../../../../Library/src/main/as3/org/devboy/ftask/fTaskInternal.as"; -include "../../../../Library/src/main/as3/org/devboy/ftask/FTask.as"; -include "../../../../Library/src/main/as3/org/devboy/ftask/task.as"; -include "org/devboy/ftask/redtamarin/FTaskCLI.as"; - -import org.devboy.ftask.redtamarin.FTaskCLI; -import avmplus.System; -new FTaskCLI(System.argv); - diff --git a/CLI/src/main/as3/org/devboy/ftask/redtamarin/FTaskCLI.as b/CLI/src/main/as3/org/devboy/ftask/redtamarin/FTaskCLI.as deleted file mode 100644 index 2ea516d..0000000 --- a/CLI/src/main/as3/org/devboy/ftask/redtamarin/FTaskCLI.as +++ /dev/null @@ -1,90 +0,0 @@ -package org.devboy.ftask.redtamarin -{ - - import avmplus.FileSystem; - import avmplus.System; - - import org.devboy.ftask.FTask; - import org.devboy.ftask.fTaskInternal; - - import org.devboy.ftask.task; - - public class FTaskCLI - { - public static const VERSION:String="0.0.1-SNAPSHOT"; - private const DEFAULT_BUILDFILE:String = "build.as"; - private const HELP:String = - "Usage: ftask [-f buildfile] tasks...\n" + - "Options:\n" + - "-help: Prints this screen.\n" + - "-v: Prints the version of fTask.\n" + - "-T: Prints all available tasks.\n"; - - public function FTaskCLI(argv:Array) - { - parseArgs(argv); - } - - private function parseArgs(argv:Array):void - { - var printTasks:Boolean=false; - var buildfile:String = ""; - var taskNames:Array = []; - var arg:String = ""; - var i:int = 0; - const l:int = argv.length; - for (; i < l; i++) - { - arg = argv[i]; - if (arg == "-help") - { - trace(HELP); - } - if (arg == "-v") - { - trace("fTask version: "+VERSION); - } - else if (arg == "-T") - { - printTasks = true; - } - else if (arg == "-f") - { - buildfile = argv[i + 1]; - i++; - } - else - { - taskNames.push(arg); - } - } - - if(l<1) - trace(HELP); - - buildfile = buildfile == "" ? DEFAULT_BUILDFILE : buildfile; - var absBuildfile:String = FileSystem.absolutePath(buildfile); - if (!FileSystem.exists(absBuildfile)) - { - trace( "Could not find buildfile: " + buildfile ); - System.exit(1); - } - - System.eval(FileSystem.read(absBuildfile)); - - if(printTasks) - printAllTasks(); - - var taskName:String; - for each( taskName in taskNames ) - task(taskName).invoke({}); - } - - private function printAllTasks():void - { - var ftask:FTask; - for each( ftask in FTask.fTaskInternal::ROOT.fTaskInternal::getAllTasks() ) - trace( ftask.name + "\t#" + ftask.description ); - } - } -} diff --git a/Library/src/main/as3/org/devboy/ftask/FTask.as b/Library/src/main/as3/org/devboy/ftask/FTask.as deleted file mode 100644 index 88ce5a1..0000000 --- a/Library/src/main/as3/org/devboy/ftask/FTask.as +++ /dev/null @@ -1,177 +0,0 @@ -package org.devboy.ftask{ - - import flash.utils.getQualifiedClassName; - - public class FTask - { - fTaskInternal static const ROOT:FTask = new FTask("root"); - - private var _name:String; - private var _dependencies:Array; - private var _closure:Function; - private var _taskVars:Object; - private var _tasks:Array; - private var _description:String; - - public function FTask(name:String) - { - _name = name; - init(); - } - - private function init():void - { - _tasks = []; - _dependencies = []; - } - - public function task(name:String, ...args):FTask - { - var task:FTask = fTaskInternal::getTask(name); - parseArguments(task,args); - return task; - } - - private function parseArguments( task:FTask, args:Array ) : void - { - var arg:*; - for each(arg in args) - { - switch (getQualifiedClassName(arg)) - { - case "Array": - var tasks:Array = []; - var taskName:String; - for each(taskName in arg) - tasks.push(fTaskInternal::getTask(taskName)); - task.fTaskInternal::addDependencies(tasks); - break; - case "String": - task.fTaskInternal::addDependency(fTaskInternal::getTask(arg)); - break; - case "Object": - task.fTaskInternal::setTaskVars(arg); - break; - case "Function": - task.fTaskInternal::setClosure(arg); - break; - } - } - } - - fTaskInternal function getAllTasks():Array - { - var tasks:Array=[]; - var ftask:FTask; - for each( ftask in _tasks ) - tasks = tasks.concat(ftask.fTaskInternal::getAllTasks()); - return _tasks; - } - - fTaskInternal function getTask(name:String):FTask - { - var task:FTask=this; - var taskNames:Array=name.split(":"); - var taskName:String; - for each( taskName in taskNames ) - task = task.fTaskInternal::getTaskByName(taskName); - return task; - } - - fTaskInternal function getTaskByName(name:String):FTask - { - var task:FTask; - for each(task in _tasks) - if (task.name == name) - return task; - return createTask(name); - } - - private function createTask(name:String):FTask - { - var task:FTask = new FTask(name); - _tasks.push(task); - return task; - } - - fTaskInternal function addDependency(task:FTask):void - { - var depTask:FTask; - for each(depTask in _dependencies) - if (depTask == task) - return; - _dependencies.push(task); - } - - fTaskInternal function addDependencies(tasks:Array):void - { - var task:FTask; - for each(task in tasks) - fTaskInternal::addDependency(task); - } - - fTaskInternal function setClosure(closure:Function):void - { - _closure = closure; - } - - public function describe( description:String ) : FTask - { - _description = description; - return this; - } - - public function invoke( runVars:Object ):FTask - { - invokeDependencies(runVars); - invokeClosure(runVars); - return this; - } - - private function invokeClosure(runVars:Object):void - { - if (_closure != null) - _closure(createVars(runVars,_taskVars)); - } - - private function invokeDependencies(runVars:Object):void - { - var task:FTask; - for each(task in _dependencies) - task.invoke(runVars); - } - - public function get name():String - { - return _name; - } - - fTaskInternal function setTaskVars(taskVars:Object):void - { - _taskVars = taskVars; - } - - private function createVars( runVars:Object, taskVars:Object ) : Object - { - var vars:Object = {task:this}; - if(taskVars) - mergeVars(vars,taskVars); - if(runVars) - mergeVars(vars,runVars); - return vars; - } - - private function mergeVars( target:Object, source:Object ) : Object - { - var param:String; - for( param in source) - target[param] = source[param]; - return target; - } - - public function get description():String - { - return _description || "No description."; - } - } -} \ No newline at end of file diff --git a/Library/src/main/as3/org/devboy/ftask/fTaskInternal.as b/Library/src/main/as3/org/devboy/ftask/fTaskInternal.as deleted file mode 100644 index aa8600f..0000000 --- a/Library/src/main/as3/org/devboy/ftask/fTaskInternal.as +++ /dev/null @@ -1,3 +0,0 @@ -package org.devboy.ftask{ - public namespace fTaskInternal; -} diff --git a/Library/src/main/as3/org/devboy/ftask/task.as b/Library/src/main/as3/org/devboy/ftask/task.as deleted file mode 100644 index 525af49..0000000 --- a/Library/src/main/as3/org/devboy/ftask/task.as +++ /dev/null @@ -1,9 +0,0 @@ -package org.devboy.ftask{ - use namespace fTaskInternal; - - public function task(name:String, ...args):FTask - { - args.unshift(name); - return FTask.fTaskInternal::ROOT.task.apply(null, args); - } -} diff --git a/buildfile b/buildfile deleted file mode 100644 index be5e585..0000000 --- a/buildfile +++ /dev/null @@ -1,21 +0,0 @@ -require 'buildr/as3' -require File.dirname(__FILE__) + '/redtamarin-tools' - -FLEX_SDK = FlexSDK.new("4.5.0.20967") -FLEX_SDK.default_options << "-compiler.incremental=true" << "-static-link-runtime-shared-libraries=true" - -define "fTask" do - project.version = "0.0.1-SNAPSHOT" - - define "Library" do - compile.using :compc - compile.options[:flexsdk] = FLEX_SDK - package :swc - end - - define "CLI" do - compile.using :rtc - end - - doc.options[:flexsdk] = FLEX_SDK -end \ No newline at end of file diff --git a/css/css3buttons.css b/css/css3buttons.css new file mode 100644 index 0000000..5a0c34f --- /dev/null +++ b/css/css3buttons.css @@ -0,0 +1,87 @@ +a.button, button { display: inline-block; padding: 5px; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 12px; color: #3C3C3D; text-shadow: 1px 1px 0 #FFFFFF; background: #ECECEC url('../images/css3buttons_backgrounds.png') 0 0 no-repeat; white-space: nowrap; overflow: visible; cursor: pointer; text-decoration: none; border: 1px solid #CACACA; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; outline: none; position: relative; zoom: 1; line-height: 1.11; *display: inline; *vertical-align: middle; } +button { margin-left: 0; margin-right: 0; *padding: 5px 5px 3px 5px; } +a.button { -moz-user-select: none; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-user-select: none; -webkit-touch-callout: none;} +button::-moz-focus-inner { border: 0; padding:0px; } +a.button.primary, button.primary { font-weight: bold } +button:focus,a.button:hover, +button:hover { color: #FFFFFF; border-color: #388AD4; text-decoration: none; text-shadow: -1px -1px 0 rgba(0,0,0,0.3); background-position: 0 -40px; background-color: #2D7DC5; } +a.button:active, button:active, +a.button.active, button.active { background-position: 0 -81px; border-color: #347BBA; background-color: #0F5EA2; color: #FFFFFF; text-shadow: none; } +a.button:active, button:active { top: 1px } +a.button.negative:hover, button.negative:hover { color: #FFFFFF; background-position: 0 -121px; background-color: #D84743; border-color: #911D1B; } +a.button.negative:active, button.negative:active, +a.button.negative.active, button.negative.active { background-position: 0 -161px; background-color: #A5211E; border-color: #911D1B; } +a.button.positive:hover, button.positive:hover { background-position: 0 -280px; background-color: #96ED89; border-color: #45BF55; } +a.button.positive:active, button.positive:active, +a.button.positive.active, button.positive.active { background-position: 0 -320px; background-color: #45BF55; } +a.button.pill, button.pill { -webkit-border-radius: 19px; -moz-border-radius: 19px; border-radius: 19px; padding: 5px 10px 4px 10px; *padding: 4px 10px; } +a.button.left, button.left { -webkit-border-bottom-right-radius: 0px; -webkit-border-top-right-radius: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-topright: 0px; border-bottom-right-radius: 0px; border-top-right-radius: 0px; margin-right: 0px; border-right: none; } +a.button.middle, button.middle { margin-right: 0px; margin-left: 0px; -webkit-border-radius: 0px; -moz-border-radius: 0px; border-radius: 0px; border-right: none; } +a.button.right, button.right { -webkit-border-bottom-left-radius: 0px; -webkit-border-top-left-radius: 0px; -moz-border-radius-bottomleft: 0px; -moz-border-radius-topleft: 0px; border-top-left-radius: 0px; border-bottom-left-radius: 0px; margin-left: 0px; } +a.button.left:active, button.left:active, +a.button.middle:active, button.middle:active, +a.button.right:active, button.right:active { top: 0px } +a.button.big, button.big { font-size: 16px; padding-left: 14px; padding-right: 17px; } +button.big { *padding: 4px 17px 2px 17px; } +a.button span.icon, button span.icon { display: inline-block; width: 14px; height: 12px; margin: auto 7px auto auto; position: relative; top: 0; *top: 0px; background-image: url('../images/css3buttons_icons.png'); background-repeat: no-repeat; } +a.big.button span.icon, button.big span.icon { top: 0px } +a.button span.icon.book, button span.icon.book { background-position: 0 0 } +a.button:hover span.icon.book, button:hover span.icon.book { background-position: 0 -15px } +a.button span.icon.calendar, button span.icon.calendar { background-position: 0 -30px } +a.button:hover span.icon.calendar, button:hover span.icon.calendar { background-position: 0 -45px } +a.button span.icon.chat, button span.icon.chat { background-position: 0 -60px } +a.button:hover span.icon.chat, button:hover span.icon.chat { background-position: 0 -75px } +a.button span.icon.check, button span.icon.check { background-position: 0 -90px } +a.button:hover span.icon.check, button:hover span.icon.check { background-position: 0 -103px } +a.button span.icon.clock, button span.icon.clock { background-position: 0 -116px } +a.button:hover span.icon.clock, button:hover span.icon.clock { background-position: 0 -131px } +a.button span.icon.cog, button span.icon.cog { background-position: 0 -146px } +a.button:hover span.icon.cog, button:hover span.icon.cog { background-position: 0 -161px } +a.button span.icon.comment, button span.icon.comment { background-position: 0 -176px } +a.button:hover span.icon.comment, button:hover span.icon.comment { background-position: 0 -190px } +a.button span.icon.cross, button span.icon.cross { background-position: 0 -204px } +a.button:hover span.icon.cross, button:hover span.icon.cross { background-position: 0 -219px } +a.button span.icon.downarrow, button span.icon.downarrow { background-position: 0 -234px } +a.button:hover span.icon.downarrow, button:hover span.icon.downarrow { background-position: 0 -249px } +a.button span.icon.fork, button span.icon.fork { background-position: 0 -264px } +a.button:hover span.icon.fork, button:hover span.icon.fork { background-position: 0 -279px } +a.button span.icon.heart, button span.icon.heart { background-position: 0 -294px } +a.button:hover span.icon.heart, button:hover span.icon.heart { background-position: 0 -308px } +a.button span.icon.home, button span.icon.home { background-position: 0 -322px } +a.button:hover span.icon.home, button:hover span.icon.home { background-position: 0 -337px } +a.button span.icon.key, button span.icon.key { background-position: 0 -352px } +a.button:hover span.icon.key, button:hover span.icon.key { background-position: 0 -367px } +a.button span.icon.leftarrow, button span.icon.leftarrow { background-position: 0 -382px } +a.button:hover span.icon.leftarrow, button:hover span.icon.leftarrow { background-position: 0 -397px } +a.button span.icon.lock, button span.icon.lock { background-position: 0 -412px } +a.button:hover span.icon.lock, button:hover span.icon.lock { background-position: 0 -427px } +a.button span.icon.loop, button span.icon.loop { background-position: 0 -442px } +a.button:hover span.icon.loop, button:hover span.icon.loop { background-position: 0 -457px } +a.button span.icon.magnifier, button span.icon.magnifier { background-position: 0 -472px } +a.button:hover span.icon.magnifier, button:hover span.icon.magnifier { background-position: 0 -487px } +a.button span.icon.mail, button span.icon.mail { background-position: 0 -502px } +a.button:hover span.icon.mail, button:hover span.icon.mail { background-position: 0 -514px } +a.button span.icon.move, button span.icon.move { background-position: 0 -526px } +a.button:hover span.icon.move, button:hover span.icon.move { background-position: 0 -541px } +a.button span.icon.pen, button span.icon.pen { background-position: 0 -556px } +a.button:hover span.icon.pen, button:hover span.icon.pen { background-position: 0 -571px } +a.button span.icon.pin, button span.icon.pin { background-position: 0 -586px } +a.button:hover span.icon.pin, button:hover span.icon.pin { background-position: 0 -601px } +a.button span.icon.plus, button span.icon.plus { background-position: 0 -616px } +a.button:hover span.icon.plus, button:hover span.icon.plus { background-position: 0 -631px } +a.button span.icon.reload, button span.icon.reload { background-position: 0 -646px } +a.button:hover span.icon.reload, button:hover span.icon.reload { background-position: 0 -660px } +a.button span.icon.rightarrow, button span.icon.rightarrow { background-position: 0 -674px } +a.button:hover span.icon.rightarrow, button:hover span.icon.rightarrow { background-position: 0 -689px } +a.button span.icon.rss, button span.icon.rss { background-position: 0 -704px } +a.button:hover span.icon.rss, button:hover span.icon.rss { background-position: 0 -719px } +a.button span.icon.tag, button span.icon.tag { background-position: 0 -734px } +a.button:hover span.icon.tag, button:hover span.icon.tag { background-position: 0 -749px } +a.button span.icon.trash, button span.icon.trash { background-position: 0 -764px } +a.button:hover span.icon.trash, button:hover span.icon.trash { background-position: 0 -779px } +a.button span.icon.unlock, button span.icon.unlock { background-position: 0 -794px } +a.button:hover span.icon.unlock, button:hover span.icon.unlock { background-position: 0 -809px } +a.button span.icon.uparrow, button span.icon.uparrow { background-position: 0 -824px } +a.button:hover span.icon.uparrow, button:hover span.icon.uparrow { background-position: 0 -839px } +a.button span.icon.user, button span.icon.user { background-position: 0 -854px } +a.button:hover span.icon.user, button:hover span.icon.user { background-position: 0 -869px } diff --git a/css/reset.css b/css/reset.css new file mode 100644 index 0000000..1c85489 --- /dev/null +++ b/css/reset.css @@ -0,0 +1,53 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/css/screen.css b/css/screen.css new file mode 100644 index 0000000..9713888 --- /dev/null +++ b/css/screen.css @@ -0,0 +1,149 @@ +@import url("./reset.css"); + +body { + font-family: Cabin, 'Lucida Grande', Verdana, sans-serif; + background-color: #f1f1f1; + overflow: auto; + color: #444; + font-size: 16px; + +} + +container h1 { + /*text-shadow: white 0px 1px 0;*/ +} + +.left-column { + width: 50%; + float: left; + display: block; +} + +.right-column { + width: 50%; + float: right; +} + +h1, h2 { + font-family: Cabin, 'Myriad Pro', 'Lucida Grande', sans-serif; +} + +p { + padding-bottom: 10px; + padding-top: 10px; + line-height: 18px; +} + +h1 { + font-family: Cabin, 'Myriad Pro', 'Lucida Grande', sans-serif; + font-weight: bold; + margin-bottom: 30px; + padding-bottom: 20px; + color: #222; + font-size: 140px; + text-shadow: white 0px 1px 0, black 0 -1px 0; + letter-spacing: -3px; + text-align: center; +} + +h2 { + font-weight: normal; + color: #666; + font-size: 40px; +} + +h2 strong { + color: #555; +} + +h2 strong:hover { + color: #444; +} + +h4 { + color: #666; +} + +section, article { + margin-bottom: 35px; + padding: 30px; + background-color: #fefefe; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.5); + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; +} + +section h2 { + text-align: center; + margin-bottom: 35px; +} + +section h2:last-child { + margin-bottom: 0px; +} + +article .content { + color: #333; +} + +article .content p { + margin: 10px 0; +} + +footer { + text-align: right; + color: #aaa; +} + +footer div.adr { + color: #444; +} + +ul { + margin-left: 20px; +} + +a { + text-decoration: none; + color: #999; + font-weight: bold; +} + +a:hover { + color: #444; +} + +img#forkme { + position: absolute; + top: 0; + left: 0; + border: 0; +} + +#container { + width: 800px; + margin: 100px auto; +} + +pre { + background: #444; + color: #fff; + padding: 8px 10px; + -box-shadow: 0 0 3px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.5); + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + /*overflow-x: hidden;*/ +} + +pre code { + /*font-size: 10pt;*/ + /*font-family: "Droid sans";*/ + font-weight: lighter; +} + diff --git a/images/css3buttons_backgrounds.png b/images/css3buttons_backgrounds.png new file mode 100644 index 0000000..6a503da Binary files /dev/null and b/images/css3buttons_backgrounds.png differ diff --git a/images/css3buttons_icons.png b/images/css3buttons_icons.png new file mode 100644 index 0000000..30e3f3d Binary files /dev/null and b/images/css3buttons_icons.png differ diff --git a/images/devboy.png b/images/devboy.png new file mode 100644 index 0000000..09ab555 Binary files /dev/null and b/images/devboy.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..feba2a7 --- /dev/null +++ b/index.html @@ -0,0 +1,112 @@ + + +
+Start by downloading the source or the swc-file and inlcude it in your project.
+Now you can start defining tasks, and execute them in your ActionScript projects.
import org.devboy.ftask.*;
+
+var shape:Shape = new Shape();
+
+// Define a task named "paintShape"
+task("paintShape", function(t){
+ shape.graphics.beginFill(t.color);
+ shape.graphics.drawRect(0, 0, 100, 100);
+ shape.graphics.endFill();
+});
+
+// Define a task named "addShape"
+task("addShape", function(t){
+ addChild(shape);
+});
+
+// Define a task named "rotateShape"
+// Define "addShape" & "paintShape" as its dependencies
+task("rotateShape", ["addShape","paintShape"], function(t){
+ shape.rotation = 29
+}).invoke({color:0x0000FF});
+//invoke will execute the task and its dependencies
+ Thanks to the redtamarin-project we are able to run ActionScript3 on the command-line.
To start with the fTask build-tool just download an executable for your OS here.
Put the executable on your path and verify it by checking fTask's version:
+$ ftask -v
+fTask version: 0.0.1-SNAPSHOT
+ Now you can write buildfiles in ActionScript3 and run them with fTask.
Let's work with this example buildfile:
import avmplus.*;
+import org.devboy.ftask.*;
+
+var content:String = "Created by the compile task.";
+
+task("compile", function(t)
+{
+ FileSystem.write("compile.txt",content)
+}).
+describe("Compile task example.");
+
+task("clean", function(t)
+{
+ if(FileSystem.exists("compile.txt"))
+ FileSystem.remove("compile.txt");
+}).
+describe("Clean task example.");
+
+task("test",["compile"], function(t)
+{
+ if(FileSystem.exists("compile.txt"))
+ if( FileSystem.read("compile.txt") == content )
+ trace("Test passed!");
+ else
+ trace("Test failed!");
+}).
+describe("Test task example.");
+
+task("build", ["test"]).describe("Build task example.");
+ Save the script above as "build.as". Then cd into the directory containing "build.as".
+$ cd path/to/directory
+ Let's run fTask to see what tasks are available in our buildfile:
+$ ftask -T
+compile #Compile task example.
+clean #Clean task example.
+test #Test task example.
+build #Build task example.
+ Now we can run each task by just "calling" its name:
+$ ftask compile
+ We could also run multiple tasks at once:
+$ ftask clean compile
+ We can open the help message by typing:
+$ ftask -help
+Usage: ftask [-f buildfile] tasks...
+Options:
+-help: Prints this screen.
+-v: Prints the version of fTask.
+-T: Prints all available tasks.
+