<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Blog that Noone Reads &#187; Flex on Rails</title>
	<atom:link href="http://theblogthatnoonereads.davegrijalva.com/category/geek/flex-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://theblogthatnoonereads.davegrijalva.com</link>
	<description>Except for you.  You read it.</description>
	<lastBuildDate>Tue, 09 Mar 2010 11:23:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9-rare</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Building Flex on Rails</title>
		<link>http://theblogthatnoonereads.davegrijalva.com/2007/04/29/building-flex-on-rails/</link>
		<comments>http://theblogthatnoonereads.davegrijalva.com/2007/04/29/building-flex-on-rails/#comments</comments>
		<pubDate>Sun, 29 Apr 2007 20:20:28 +0000</pubDate>
		<dc:creator>Dave Grijalva</dc:creator>
				<category><![CDATA[Flex on Rails]]></category>
		<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://theblogthatnoonereads.tunasoft.com/2007/04/29/building-flex-on-rails/</guid>
		<description><![CDATA[I&#8217;ve been working on a Flex based component for a Ruby on Rails application I&#8217;m doing.  So far, I&#8217;ve made few decent strides toward integration with the rails framework.  The following describes my first pass at integration and build automation.

The first step was determining how I want to setup my file structure within [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on a <a href="http://www.adobe.com/products/flex/">Flex</a> based component for a <a href="http://rubyonrails.com/">Ruby on Rails</a> application I&#8217;m doing.  So far, I&#8217;ve made few decent strides toward integration with the rails framework.  The following describes my first pass at integration and build automation.</p>
<p><span id="more-348"></span></p>
<p>The first step was determining how I want to setup my file structure within my Rails project.  Here&#8217;s what I came up with:<br />
New directories/files are in bold.  Project specific content, in italic.</p>
<pre>
	- app
	- components
	- config
	- db
	- doc
	+ <strong>flex</strong>
		+ <strong>components</strong>
			- <strong>build</strong>
			- <strong><em>$component_name</em></strong>
			&#8226; <em><strong>$component_name.mxml</strong></em>
		- <em><strong>$application_name</strong></em>
	+ lib
		+ tasks
			&#8226; <strong>flex.rake</strong>
	+ log
		&#8226; <strong>flex.log</strong>
	+ public
		- <strong>flash</strong>
	- script
	- test
	- tmp
	- vendor
</pre>
<p>Now comes the fun part.  Here is the contents of my flex.rake file:</p>
<pre class="textmate-source mac_classic"><span class='linenum'>    1</span> <span class="source source_ruby">namespace <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>flex</span> <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do
</span><span class='linenum'>    2</span> <span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>Find components and build them out
</span><span class='linenum'>    3</span>   components = []
<span class='linenum'>    4</span>   <span class="support support_class support_class_ruby">Dir</span>.foreach(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>flex/components<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>) <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do </span>|filename|
<span class='linenum'>    5</span>     <span class="keyword keyword_control keyword_control_ruby">if</span> filename.match <span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span><span class="constant constant_character constant_character_escape constant_character_escape_ruby">\.</span>mxml$<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span></span>
<span class='linenum'>    6</span>       component_name = filename.sub(<span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span><span class="constant constant_character constant_character_escape constant_character_escape_ruby">\.</span>mxml$<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span></span>, <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)
<span class='linenum'>    7</span>       component_files = [<span class="support support_class support_class_ruby">File</span>.join(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>flex/components<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>, filename)].concat(<span class="support support_class support_class_ruby">Dir</span>[<span class="support support_class support_class_ruby">File</span>.join(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>flex/components<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>, component_name,<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>**<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)])
<span class='linenum'>    8</span>       components &lt;&lt; file(<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>flex/components/build/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>component_name<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>.swc<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; component_files) <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do
</span><span class='linenum'>    9</span>         puts <span class="string string_interpolated string_interpolated_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">`</span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span><span class="support support_class support_class_ruby">File</span>.join(<span class="meta meta_environment-variable meta_environment-variable_ruby"><span class="variable variable_other variable_other_constant variable_other_constant_ruby">ENV</span>[<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>FLEX_SDK<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>]</span>, <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>compc<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span> -source-path ./flex -output flex/components/build/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>component_name<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>.swc -include-classes components.<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>component_name<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">`</span></span>
<span class='linenum'>   10</span>       <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class='linenum'>   11</span>     <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class='linenum'>   12</span>   <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class='linenum'>   13</span>
<span class='linenum'>   14</span>   task <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>components</span> =&gt; components
<span class='linenum'>   15</span>
<span class='linenum'>   16</span> <span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>Find applications and build them into the public/flash directory
</span><span class='linenum'>   17</span>   app_tasks = []
<span class='linenum'>   18</span>   <span class="support support_class support_class_ruby">Dir</span>.foreach(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>flex<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>) <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do </span>|dirname|
<span class='linenum'>   19</span>     <span class="keyword keyword_control keyword_control_ruby">if</span> ![<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>components<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>].include?(dirname) &amp;&amp; !dirname.match(<span class="string string_regexp string_regexp_classic string_regexp_classic_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span>^<span class="constant constant_character constant_character_escape constant_character_escape_ruby">\.</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_ruby">/</span></span>)
<span class='linenum'>   20</span>       app_files = <span class="support support_class support_class_ruby">Dir</span>[<span class="support support_class support_class_ruby">File</span>.join(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>flex<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>, dirname,<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>**.mxml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)].concat <span class="support support_class support_class_ruby">Dir</span>[<span class="support support_class support_class_ruby">File</span>.join(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>flex<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>, dirname,<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>**.as<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)]
<span class='linenum'>   21</span>       app_tasks &lt;&lt; file( <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>public/flash/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>dirname<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>.swf<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; app_files.concat(components)) <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do
</span><span class='linenum'>   22</span>         puts <span class="string string_interpolated string_interpolated_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">`</span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span><span class="support support_class support_class_ruby">File</span>.join(<span class="meta meta_environment-variable meta_environment-variable_ruby"><span class="variable variable_other variable_other_constant variable_other_constant_ruby">ENV</span>[<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>FLEX_SDK<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>]</span>, <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>mxmlc<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span> -library-path+=flex/components/build -output public/flash/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>dirname<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>.swf flex/<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>dirname<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>/Application.mxml<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">`</span></span>
<span class='linenum'>   23</span>       <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class='linenum'>   24</span>     <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class='linenum'>   25</span>   <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class='linenum'>   26</span>
<span class='linenum'>   27</span>   task <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>build_all</span> =&gt; app_tasks
<span class='linenum'>   28</span>
<span class='linenum'>   29</span> <span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>So what&#8217;s happening here?  First, (line 1) I create a rake namespace.  This way I can name my commands whatever I want without polluting the global namespace.  To invoke a task defined here, you use the namespace, a colon, then the task name.  Example: <code>rake flex:build_all</code>.</p>
<p>The following section (lines 3-14) finds all components and builds them as .swc files into the flex/components/build directory.  The output filename will be the same as the source file&#8217;s name.  So, flex/components/Widget.mxml will become flex/components/build/Widget.swc.  Note that this code is still rather primitive.  It doesn&#8217;t currently check to see if the build was successful or not before moving on.</p>
<p>The last section (lines 17-27) finds all the applications and builds them into the public/flash directory.  So, flex/gallery/Application.mxml will become public/flash/gallery.swf.  It automatically makes all components defined above available and will rebuild the app if the components have changed.  There are some drawbacks to this approach, such as the fact that <em>all</em> applications will be rebuilt if any components have been modified as the script doesn&#8217;t know which components go with which applications.  This is a non-issue for me as I only have a single Flex app in my project.</p>
<p>I&#8217;m trying to keep with the theme of convention over configuration at this point.  By placing your files in the correct locations, rake will automagicaly find and build all the parts of your flex app.  The next task I&#8217;ve set out for myself is creating rails helpers to easily include our newly created bundles of Flex joy.</p>
]]></content:encoded>
			<wfw:commentRss>http://theblogthatnoonereads.davegrijalva.com/2007/04/29/building-flex-on-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
