<?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>Code.ge Blog &#187; Ant</title>
	<atom:link href="http://www.code.ge/posts/tag/ant/feed" rel="self" type="application/rss+xml" />
	<link>http://www.code.ge</link>
	<description>ბლოგი ვებ პროგრამირებისა და ტექნოლოგიების შესახებ</description>
	<lastBuildDate>Mon, 03 May 2010 14:38:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ant, Rhino, YUICompressor &amp; JS Packer</title>
		<link>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer</link>
		<comments>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer#comments</comments>
		<pubDate>Mon, 22 Dec 2008 07:06:33 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ant]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=155</guid>
		<description><![CDATA[დაახლოვებით ერთი წლის წინ ზედაპირულად შევეხე JavaScript ფაილების კომპრესიას. ძველი პოსტის მიხედვით თუ ვიმსჯელებთ არცთუ ისე ცუდი შედეგია. თუმცა რამდენიმე დეტალი მაინც საჭიროებს გადახედვას, კერძოდ კი: JavaScript ფაილების კომპრესიის პროცესი არ არის ავტომატიზებული; ფაილების კომპრესია მთლიანად ეყრდნობა დენ ედვარდსის ე.წ Packer &#8211; ს რომელიც გარკვეულ მიზეზთა გამო საკმაოდ მოუხერხებელია; პირველ რიგში სანამ გადავალთ უშუალოდ ფაილების [...]]]></description>
			<content:encoded><![CDATA[<p>დაახლოვებით ერთი წლის წინ ზედაპირულად შევეხე JavaScript ფაილების კომპრესიას. <a href="http://www.code.ge/apache/mod_deflate-js-css-file-compression">ძველი პოსტის</a> მიხედვით თუ ვიმსჯელებთ არცთუ ისე ცუდი შედეგია. თუმცა რამდენიმე დეტალი მაინც საჭიროებს გადახედვას, კერძოდ კი:</p>
<ul>
<li>JavaScript ფაილების კომპრესიის პროცესი არ არის ავტომატიზებული;</li>
<li>ფაილების კომპრესია მთლიანად ეყრდნობა დენ ედვარდსის ე.წ Packer &#8211; ს რომელიც გარკვეულ მიზეზთა გამო საკმაოდ მოუხერხებელია;</li>
</ul>
<p>პირველ რიგში სანამ გადავალთ უშუალოდ ფაილების კომპრესიის ავტომატიზაციის პროცედურაზე საჭიროა საბოლოო ამოცანის სრულად ჩამოყალიბება.</p>
<p><strong>მიზანი</strong></p>
<ul>
<li>JavaScript ფაილების გაერთიანება და ერთი საბოლოო ფაილის მიღება;</li>
<li>გაერთიანების შედეგად მიღებული ფაილის მინიფიკაცია და ობფუსკაცია;</li>
<li>მინიფიცირებული ფაილის ზომაში კიდევ უფრო მეტად შემცირება base62 კოდირებით;</li>
<li>საბოლოო ფაილის gzip კომპრესია;</li>
</ul>
<p><span id="more-155"></span><br />
პირველ რიგში მანამდე სანამ შევუდგებით JavaScript ფაილების კომპრესიის პროცესს მოვამზადოთ შესაბამისი გარემო, პირველ რიგში თქვენთვის მოსახერხებელ მისამართზე შექმენით კატალოგების შემდეგი სტრუქტურა:</p>
<pre>
project
    tools
    src
    build
</pre>
<p>ჩამოთვლილი პუნქტების რეალიზაციისათვის პოსტის სათაურში ნახსენები უტილიტებს გამოვიყენებთ.</p>
<p>უფრო კონკრეტულად კი მიზნის მისაღწევად დაგვჭირდება:</p>
<ul>
<li><a href="http://ant.apache.org/">Apache Ant</a> &#8211; თუ გიყენიათ JDK მას დამატებითი ინსტალაცია არ ესაჭიროება;</li>
<li>მოზილას <a href="http://www.mozilla.org/rhino/">Rhino &#8211; JavaScript for Java</a>, JavaScript კოდის შესასრულებლად. გადმოწერეთ ბოლო ვერსია გახსენით არქივი და დააკოპირეთ js.jar ფაილი /project/tools კატალოგში;</li>
<li>ჟულიენ ლეკომტეს მიერ შექმნილი <a href="http://www.julienlecomte.net/yuicompressor/">YUICompressor</a> რომელსაც გამოვიყენებთ JavaScript ფაილების მინიფიკაციისა და ობფუსკაციისათვის. გადმოწერეთ ბოლო ვერსია გახსენით არქივი დააკოპირეთ build კატალოგში არსებული yuicompressor-2.x.x.ჯარ ფაილი /project/tools კატალოგში, შეუცვალეთ მას სახელი და დაარქვით yuicompressor.jar;</li>
<li>დენ ედვარდსის <a href="http://dean.edwards.name/packer/">Packer</a> რომლის მეშვეობითაც შევამცირებთ უკვე მინიფიცირებულ ფაილის მოცულობას</li>
<li>ჩემს მიერ დაწერილ პატარა სკრიპტი რომელიც საშულებას მოგვცემს Ant სკრიპტიდან გამოვიძახოთ Packer &#8211; ის pack მეთოდი მინიფიცირებული კოდის base62 კოდირებისათვის. ფაილი აერთიანებს როგორც ჩემს მიერ დაწერილ კოდს, ასევე დენ ედვარდსის Packer &#8211; ს. გადმოწერეთ ფაილი და დააკოპირეთ იგი /project/tools კატალოგში</li>
</ul>
<p>სამუშაო გარემოს დასასრულებლად /project კატალოგში შექმენით ცარიელი build.xml ფაილი.<br />
საბოლოო ჯამში მივიღებთ კატალოგებისა და ფაილების ასეთ სტრუქტურას:</p>
<pre>
project
    tools
        js.jar
        yuicompressor.jar
        pack.js
    src
    build
    build.xml
</pre>
<p>მანამდე სანამ შევუდგებით ფაილების უშუალო კომპრესიას /project/src კატალოგში დააკოპირეთ თქვენთვის სასურველი/საჭირო JavaScript ფაილები. ამ პოსტის წერისას, ტესტირებისათვის გამოვიყენე ორი ფაილი, jquery-1.2.6.js და jQuery &#8211; ს პლაგინი jquery.form.js .</p>
<p>დროა შევუდგეთ Ant სკრიპტის წერას რომლის მეშვეობითაც გავაერთიანებთ ფაილებს, გამოვიძახებთ შესაბამის უტილიტებს საჭირო პარამეტრებით და მივიღებთ საბოლოო შედეგს.</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="MyProject" default="build" basedir="."&gt;

    &lt;!-- Source Directory --&gt;
    &lt;property name="src" value="src" /&gt;
    &lt;!-- Build Directory --&gt;
    &lt;property name="build" value="build" /&gt;
    &lt;!-- Tools Directory --&gt;
    &lt;property name="tools" value="tools" /&gt;

    &lt;target name="init"&gt;
        &lt;!-- Cleanup build folder --&gt;
        &lt;delete&gt;
            &lt;fileset dir="${build}" includes="**/*.*"/&gt;
        &lt;/delete&gt;
    &lt;/target&gt;

    &lt;target name="build" depends="init"&gt;
        &lt;!-- Concatenate source files --&gt;
        &lt;concat destfile="${build}/library.js"&gt;
            &lt;filelist dir="${src}" files="jquery-1.2.6.js,jquery.form.js"/&gt;
        &lt;/concat&gt;
        &lt;!-- Minify concatenated file with YUICompressor --&gt;
        &lt;java fork="true" jar="${tools}/yuicompressor.jar"&gt;
            &lt;arg line="-o ${build}/library.min.js ${build}/library.js" /&gt;
        &lt;/java&gt;
        &lt;!-- Pack minified file with Dean Edwards' Packer --&gt;
        &lt;java fork="true" jar="${tools}/js.jar"&gt;
            &lt;arg line="${tools}/pack.js ${build}/library.min.js ${build}/library.pack.js" /&gt;
        &lt;/java&gt;
    &lt;/target&gt;

&lt;/project&gt;
</pre>
<p>ნაჩვენები Ant სკრიპტის დეტალების განხილვა სცილდება ამ პოსტის მიზანს, თუმცა ყველა მნიშნველოვან დირექტივას თანდართული აქვს კომენტარები ზოგადი წარმოდგენის შესაქმნელად. </p>
<p>სკრიპტის შექმნის შემდეგ ტერმინალიდან შედით თქვენი პროექტის კატალოგში და აკრიფეთ შემდეგი ბრძანება:</p>
<pre>
ant
</pre>
<p>პროცესის დასრულების შემდეგ ტერმინალში დაინახავთ დაახლოვებით მსგავს შედეგს:</p>
<pre>
Buildfile: /Users/iosebdzmanashvili/Sites/test/pack/build.xml
init:
build:
     [java] completed...
BUILD SUCCESSFUL
Total time: 17 seconds
</pre>
<p>მაშ ასე ფაილების გაერთიანების, მინიფიკაციის, ობფუსკაციისა და კოდის base62 კოდირებაში გადაყვანის პროცესი დასრულებულია. თუ შეხვალთ /project/build კატალოგში, დაგხვდებათ სამი ფაილი:</p>
<ul>
<li><strong>library.js</strong> &#8211; რომელშიც გაერთიანებულია ზემოთ ნახსენები ორი JS ფაილი. ამ ფაილის ზომა დაახლოვებით 124KB &#8211; ს შეადგენს;</li>
<li><strong>library.min.js</strong> &#8211; YUICompressor &#8211; ის მეშვეობით მინიფიცირებული ფაილი რომლის ზომაც დაახლოვებით 64KB &#8211; ა;</li>
<li><strong>library.pack.js</strong> &#8211; Packer &#8211; ის მეშვეობით base62 კოდირებაში გადაყვანილი ფაილი რომლის ზომაც დაახლოვებით 36KB &#8211; ა;</li>
</ul>
<p>დამერწმუნებით რომ შედეგი თვალსაჩიანოა და დამატებით კომენტარებს არ საჭიროებს, 124KB &#8211; დან საბოლოო ფაილი დავიყვანეთ 36KB &#8211; მდე რაც უდავოდ მნიშვნელოვანი სხვაობაა. თუ ამ ფაილს დამატებით პოსტის დასაწყიში ნახსენები მეთოდით დავამუშავებთ მისი ზომა დაახლოვებით 20KB &#8211; მდე დავა რაც თავისთავად ასევე მნიშვნელოვანია.</p>
<p>რეზიუმეს სახით ასევე მნიშვნელოვანია რამდენიმე დეტალი. თუ ფაილის მინიფიკაციის პროცესს შევასრულებდით მხოლოდ Packer &#8211; ის გამოყენებით, მივიღებდით დაახლოვებით იგივე შედეგს. თუმცა არსებობს ერთი საჩოთირო დეტალი რამაც YUICompressor &#8211; ის ჩართვისაკენ მიბიძგა.</p>
<p>როდესაც ვიყენებთ Packer &#8211; ს, მნიშნველოვანია გავითვალისწინოთ რომ ნებისმიერი ფუნქცია რომელსაც აღვწერთ სხვა ფუნქციისა ან მეთოდის შიგნით უნდა მთავრდებოდეს წერტილ მძიმით &#8220;;&#8221;. თუ ეს პირობა არ არის დაცული Packer &#8211; ის მიერ დაპატარავებული ფაილი უსარგებლო იქნება. ამ პროლემას აგვარებს YUICompressor, რადგან იგი ასეთ ფუნქციებს ავტომატურად ასრულებს წერტილ მძიმით ხოლო შედეგად ვღებულობთ სუფთა, Packer &#8211; ისათვის გამოსადეგ კოდს. მაგალითში ნაჩვენებია ასეთი შემთხვევა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> myFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> myPrivateFunction <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//rest of code here</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">//აქ აუცილებელია წერტილ მძიმე</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>სამწუხაროდ Packer &#8211; ს არ აქვს იმის უნარი რომ ასეთი მცირე პრობლემები მოაგვაროს თავისით, თუმცა როგორც უკვე აღვნიშნე ამ პრობლემის თავიდან არიდება შესაძლებელია YUICompressor &#8211; ის მეშვეობით.</p>
<p>ასევე ყურადღებას შევაჩერებ ჩემს მიერ დაწერილ პატარა სკრიპტზე რომლის მეშვეობითაც ხდება მინიფიცირებული კოდის base62 კოდირებაში გადაყვანა. სკრიპტი არის Rhino &#8211; ს რამდენიმე სტრიქონი კლიენტი რომლის შესრულებაც შესაძლებელია ტერმინალიდან. მას ესაჭიროება ორი პარამეტრი: 1) საწყისი ფაილი რომლის კოდირებაც გვესაჭიროება; 2) საბოლოო ფაილის სახელი; </p>
<p>Rhino &#8211; ს კლიენტი კითხულობს პირველ პარამეტრად გადაცემული ფაილიდან JavaScript კოდს, იძახებს Packer &#8211; ის pack მეთოდს შესაბამისი პარამეტრებით, და მიღებულ შედეგს ინახავს შესაბამის ფაილში:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">output <span style="color: #339933;">=</span> java.<span style="color: #660066;">io</span>.<span style="color: #660066;">FileWriter</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//obtain FileWriter object</span><br />
output.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; pack<span style="color: #009900;">&#40;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//invoke Dean Edward's packer function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; readFile<span style="color: #009900;">&#40;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//read input file: http://www.mozilla.org/rhino/shell.html</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//input file path</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #CC0000;">62</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//base62 encode</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #CC0000;">0</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//shrink variable names?</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
output.<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'completed...'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//Dean Edwrads' Packer code here</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
