all repos — h3rald @ 9b40a65613f396e9da8ea38609cbc25e643c6e57

The sources of https://h3rald.com

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&#8217;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&#8217;s root folder:</p>
	<ul>
		<li><code>book/text/introduction.glyph</code> &rarr; <code>README.textile</code></li>
		<li><code>book/text/changelog.glyph</code> &rarr; <code>CHANGELOG.textile</code></li>
		<li><code>book/text/license.glyph</code> &rarr; <code>LICENSE.textile</code></li>
		<li><code>book/text/acknowledgement.glyph</code> &rarr; <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&#8217;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">&quot;</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">&quot;</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">&quot;</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">&quot;</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">&quot;</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">&quot;</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> =&gt; <span class="symbol">:acknowledgements</span>, 
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>      <span class="symbol">:CHANGELOG</span> =&gt; <span class="symbol">:changelog</span>, 
<span class="line-numbers"><a href="#n11" name="n11">11</a></span>      <span class="symbol">:LICENSE</span> =&gt; <span class="symbol">:license</span>, 
<span class="line-numbers"><a href="#n12" name="n12">12</a></span>      <span class="symbol">:README</span> =&gt; <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">&quot;</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">&quot;</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">&quot;</span><span class="content">Done.</span><span class="delimiter">&quot;</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&#8217;s it. Note that this task is pretty useless without a command that calls it, and it won&#8217;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>