contents/glyph/book/extending/task.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
----- title: "Glyph - Defining Custom Tasks" content-type: page ----- <nav class="navigation"><a href="/glyph/book/extending/commands_tasks.html">← Defining Custom Commands and Tasks</a> | <a href="/glyph/book/index.html">Contents</a> | <a href="/glyph/book/extending/output_format.html">Custom Output Formats →</a></nav> <p>Glyph relies on <a href="http://rake.rubyforge.org/">Rake</a> to perform most of its core operations. Typically, Rake tasks are used do define the high level logic that is used by Glyph commands to, for example, compile a project or load configuration files.</p> <p>Furthermore, Rake provides an easy mechanism to create dependencies among tasks: for example, to make sure that Glyph’s configuration files are loaded before everything else happens.</p> <section class="section"> <header> <h3 id="custom_generate_task" class="toc">Creating a 'custom:generate' task</h1> </header> <p>A custom task has been defined for the Glyph project used to produce this document. This custom task is used to compile a few of the documents files into standalone files, deployed in Glyph’s root folder:</p> <ul> <li><code>book/text/introduction.glyph</code> → <code>README.textile</code></li> <li><code>book/text/changelog.glyph</code> → <code>CHANGELOG.textile</code></li> <li><code>book/text/license.glyph</code> → <code>LICENSE.textile</code></li> <li><code>book/text/acknowledgement.glyph</code> → <code>AUTHORS.textile</code></li> </ul> <p>First of all, create a <code>lib/tasks</code> folder in your project directory. Then, create a <code>.rake</code> file within it, e.g. <code>tasks.rake</code>.</p> <p>Finally, here’s the source of the task:</p> <div class="CodeRay"> <div class="code"> <pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>namespace <span class="symbol">:custom</span> <span class="keyword">do</span> <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> task <span class="symbol">:generate</span>, [<span class="symbol">:file</span>] <span class="keyword">do</span> |t, args| <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> generate = lambda <span class="keyword">do</span> |source, destination| <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> <span class="constant">Glyph</span>.info <span class="string"><span class="delimiter">"</span><span class="content">Generating </span><span class="inline"><span class="inline-delimiter">#{</span>destination<span class="inline-delimiter">}</span></span><span class="content">...</span><span class="delimiter">"</span></span> <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span class="constant">Glyph</span>.compile <span class="constant">Glyph</span>::<span class="constant">PROJECT</span>/<span class="string"><span class="delimiter">"</span><span class="content">text/</span><span class="inline"><span class="inline-delimiter">#{</span>source<span class="inline-delimiter">}</span></span><span class="content">.glyph</span><span class="delimiter">"</span></span>, <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> <span class="constant">Glyph</span>::<span class="constant">PROJECT</span>/<span class="string"><span class="delimiter">"</span><span class="content">../</span><span class="inline"><span class="inline-delimiter">#{</span>destination<span class="inline-delimiter">}</span></span><span class="content">.textile</span><span class="delimiter">"</span></span> <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span class="keyword">end</span> <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> files = { <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span class="symbol">:AUTHORS</span> => <span class="symbol">:acknowledgements</span>, <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> <span class="symbol">:CHANGELOG</span> => <span class="symbol">:changelog</span>, <span class="line-numbers"><a href="#n11" name="n11">11</a></span> <span class="symbol">:LICENSE</span> => <span class="symbol">:license</span>, <span class="line-numbers"><a href="#n12" name="n12">12</a></span> <span class="symbol">:README</span> => <span class="symbol">:introduction</span> <span class="line-numbers"><a href="#n13" name="n13">13</a></span> } <span class="line-numbers"><a href="#n14" name="n14">14</a></span> arg = args[<span class="symbol">:file</span>].upcase.to_sym <span class="line-numbers"><a href="#n15" name="n15">15</a></span> raise <span class="constant">RuntimeError</span>, <span class="string"><span class="delimiter">"</span><span class="content">Unknown file '</span><span class="inline"><span class="inline-delimiter">#{</span>arg<span class="inline-delimiter">}</span></span><span class="content">.glyph'</span><span class="delimiter">"</span></span> <span class="line-numbers"><a href="#n16" name="n16">16</a></span> <span class="keyword">unless</span> files.keys.include? arg <span class="line-numbers"><a href="#n17" name="n17">17</a></span> generate.call files[arg], arg <span class="line-numbers"><a href="#n18" name="n18">18</a></span> <span class="constant">Glyph</span>.info <span class="string"><span class="delimiter">"</span><span class="content">Done.</span><span class="delimiter">"</span></span> <span class="line-numbers"><a href="#n19" name="n19">19</a></span> <span class="keyword">end</span> <span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span><span class="keyword">end</span></pre> </div> </div> <p>That’s it. Note that this task is pretty useless without a command that calls it, and it won’t even show up if you run <code>rake -T</code> within your project directory. <span class="fmi">for more information on <mark>creating custom commands</mark>, see <a href="/glyph/book/extending/command.html#custom_command">Defining Custom Commands</a></span>.</p> </section> <nav class="navigation"><a href="/glyph/book/extending/commands_tasks.html">← Defining Custom Commands and Tasks</a> | <a href="/glyph/book/index.html">Contents</a> | <a href="/glyph/book/extending/output_format.html">Custom Output Formats →</a></nav> |