среда, 2 февраля 2011 г.

Сохранение номера ревизии в приложении (ActionScript, SVN)

Ниже описанный подход применён в контексте ActionScript-проекта находящемуся под контролем SVN. "Не ActionScript-ом единым жив программист", это подход может пригодится в других проектах с другими CSV-системами.

Проблема:
При достаточно частых обновлениях приложения в сети, хочется визуально видеть какая версия флешки перед тобой, т.е. получить подобную картинку:



Решение:
  1. Определить место, где будет сохранятся номер ревизии, например отдельный класс с настройками приложения или одно из полей уже существующего класса
    Пример класса для первого варианта:
    public class AppOption 
    {
       public static const REVISION:String = "@revision@";
    }
    
  2. Описать ant-овский task в build.xml
    <target name="buildClient">
       <!-- копируем оригинал файла где будет производится замена строки -->
       <copy file="${src}/AppOption.as" tofile="${projectDir}/AppOption.as" overwrite="true" verbose="false" />
    
       <!-- впечатываем номер ревизии по-вкусу, в данном случае последней закомиченой-->
       <property name="revision" value="COMMITTED"/>
       <exec executable="svn" outputproperty="svnlog.out">   
          <arg line="log -r ${revision} -q"/>
       </exec>
       
       <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
       <propertyregex property="revision.number" input="${svnlog.out}" select="\2">
          <regexp pattern="(r)([0-9]*)"/>
       </propertyregex>
       <replace file="${src}/AppOption.as" token="@revision@" value="${revision.number}"/>
    
    <!-- компилируем клиента -->
    
       <!-- перемещаем оригинал файла на родину -->
       <move file="${projectDir}/AppOption.as" tofile="${src}/AppOption.as" overwrite="true" verbose="false"/>
    </target>
    
  3. И наконец использовать номер ревизии
    public class Main extends Sprite 
    {
       private var _contextMenu:ContextMenu;
    
       public Main()
       {
          addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
       }
       
       private function onAddedToStage(e:Event):void
       {
          removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
          _contextMenu = new ContextMenu();
          var menuItem:ContextMenuItem = new ContextMenuItem("Version " + AppOption.REVISION);
          _contextMenu.customItems.push(menuItem);
          contextMenu = _contextMenu;
          
       }
    }
    
Номер ревизии можно использовать не только для визуального контроля версии приложения, но и в качестве антикеша ("http://anysite.com/logo.png?" + AppOption.REVISION) при подгрузке внешних ресурсов, которые могут быть изменены при публикации новой версии приложения.
P.S.: Очень полезно про автоматизацию с испольщованием ant-а см. на http://anykeytocreate.blogspot.com/2011/08/1-ant-flash-faq.html

Комментариев нет:

Отправить комментарий