使用JSFL脚本进行Flash文件版本控制

作者: 2010-02-12,11:36 上午 周五

  多数版本控制软件都只能管理文本文件,对二进制文件很难控制。本文介绍通过jsfl脚本程序实现基本的版本控制的功能的方法,包括记录修改时间,修改者,自动添加版本号等。希望能对大家有一定帮助。

这里我们使用 GNU 风格的版本号命名格式: 主版本号.子版本号[.修正版本号[.编译版本号]]
英文对照: Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]
示例: 1.2.1, 2.0, 5.0.0 build-13124


  为什么需要版本控制呢?
  在多人协作的环境下,有一套有效的版本控制规则和方法对整个团队的工作效率是大有帮助的。最基本的功能,自动维护一个版本号,这样在每次发布、测试的时候可以马上知道文件的版本,避免更新不到位所产生的低级问题。另外在每次文件修改时,对修改时间和修改人做个记录,这样在发生问题的时候至少可以由此找到相关的人员,并推断一些可能的因素。

  但是如果要手工记录和维护,又太麻烦,很多人无法坚持,也常常忘记。。。这样的工作最好能够由电脑自动完成。

  于是我想到了jsfl,jsfl可以对执行大部分flash软件的操作,我的方案是在适当的时候,让flash执行一段jsfl程序,自动把相应的信息保存在整个flash文件第一帧的as代码的最前面。写成变量的形式,这样既可以由开发者查阅,同时也能在swf中操作这些变量,做相应的显示或操作。

以下是代码

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
var yourName             = "嘎嘎 <5Ga.cn>";
var yourNameLink         = "http://www.5ga.cn";
var yourCopyright        = "Fun学网";
var yourCopyrightLink    = "http://www.funshare.com.cn";
var strCopyright         = "const SOFT_INFO_COPYRIGHT:String        ";
var strCopyrightLink     = "const SOFT_INFO_COPYRIGHT_LINK:String   ";
var strCopyrightYear     = "const SOFT_INFO_COPYRIGHT_YEAR:Number   ";
var strAuthor            = "const SOFT_INFO_AUTHOR:String           ";
var strAuthorLink        = "const SOFT_INFO_AUTHOR_LINK:String      ";
var strBuildTime         = "const SOFT_INFO_BUILD_TIME:Number       ";
var strBuildVersion      = "const SOFT_INFO_BUILD_VERSION:Number    ";
var strRevisionVersion   = "const SOFT_INFO_REVISION_VERSION:Number ";
var strMinorVersion      = "const SOFT_INFO_MINOR_VERSION:Number    ";
var strMajorVersion      = "const SOFT_INFO_MAJOR_VERSION:Number    ";
var strName              = "const SOFT_INFO_NAME:String             ";
var asString = fl.getDocumentDOM().timelines[0].layers[0].frames[0].actionScript;
asString = changeVar(asString, strCopyrightLink);   //版权连接
asString = changeVar(asString, strCopyright);       //版权
asString = changeVar(asString, strCopyrightYear);   //版权时间
asString = changeVar(asString, strAuthorLink);      //作者连接
asString = changeVar(asString, strAuthor);          //作者
asString = changeVar(asString, strBuildTime);       //编译版时间
asString = changeVar(asString, strBuildVersion);    //编译版本号
asString = changeVar(asString, strRevisionVersion); //修正版本号
asString = changeVar(asString, strMinorVersion);    //子版本号
asString = changeVar(asString, strMajorVersion);    //主版本号
asString = changeVar(asString, strName);            //软件名称
asString = changeVar(asString, "//Modified by ");   //添加版本
fl.getDocumentDOM().timelines[0].layers[0].frames[0].actionScript = asString;       //设置内容
fl.saveDocument(fl.getDocumentDOM());                                               //保存影片
fl.getDocumentDOM().testMovie();                                                    //测试影片
/**
 * 将内容替换       原始代码   变量名
 **/

function changeVar(asString, varName) {
    var sep = " = ";
    var ns = "";//需要添加的内容
    if(asString.indexOf(varName + sep) != -1 || asString.indexOf("//Modified by ") != -1) {
        if(varName == "//Modified by "){
            var s  = asString.indexOf("//Modified by ");
        }else{
            var s  = asString.indexOf(varName + sep);
        }
        var e  = asString.indexOf(";", s);
        var e2 = asString.indexOf("", s);
        if(e == -1) {
            if(e2 != -1) {
                e = e2;
            }else {
                e = asString.length - 1;
            }
        }
        var str = asString.substring(s, e);//获取了要替换的内容
        switch (varName) {
            case strCopyright:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strCopyrightLink:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strCopyrightYear:
                ns = varName + sep + String(new Date().getFullYear());
                break;
            case strAuthor:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strAuthorLink:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strBuildTime:
                ns = varName + sep + String(new Date().getTime());
                break;
            case strBuildVersion:
                ns = varName + sep + (Number(str.split(sep)[1]) + 1);
                break;
            case strRevisionVersion:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strMinorVersion:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strMajorVersion:
                ns = varName + sep + str.split(sep)[1];
                break;
            case strName:
                ns = varName + sep + str.split(sep)[1];
                break;
            case "//Modified by ":
                ns = "//Modified by " + yourName + " at " + new Date();
                break;
            default:
                alert("传入了奇怪的值(修正):" + varName);
        }
        return asString.split(str).join(ns);//拆分并替换
    }else {
        switch (varName) {
            case strCopyright:
                ns = varName + sep + "\"" + yourCopyright + "\"";
                break;
            case strCopyrightLink:
                ns = varName + sep + "\"" + yourCopyrightLink + "\"";
                break;
            case strCopyrightYear:
                ns = varName + sep + String(new Date().getFullYear());
                break;
            case strAuthor:
                ns = varName + sep + "\"" + yourName + "\"";
                break;
            case strAuthorLink:
                ns = varName + sep + "\"" + yourNameLink + "\"";
                break;
            case strBuildTime:
                ns = varName + sep + String(new Date().getTime());
                break;
            case strBuildVersion:
                ns = varName + sep + "1";
                break;
            case strRevisionVersion:
                ns = varName + sep + "0";
                break;
            case strMinorVersion:
                ns = varName + sep + "0";
                break;
            case strMajorVersion:
                ns = varName + sep + "0";
                break;
            case strName:
                ns = varName + sep + "\"\"";
                break;
            case "//Modified by ":
                ns = "//Modified by " + yourName + " at " + new Date();
                break;
            default:
                alert("传入了奇怪的值(建立):" + varName);
        }
        return ns + ";\n" + asString;
    }
}
/*
Name   :Fun地盘
Version:1.1.2 (Build:123)
Time   :Thu Feb 11 2010 14:56:46 GMT+0800
Author :嘎嘎磨房 <wjjhappy@gmail.com><www.5ga.cn>
-----------------------------------------------
Copyright©2009 Fun学网
*/

  首先,在flash中新建一个jsfl文件,复制以上代码。
  然后,修改第一行YourName变量中的内容,改成你自己的名字。
  起一个适当的名字,例如”Flash 发布并版本设置 V1.0.jsfl”,保存在你的系统盘下面的
Documents and Settings/<你的login id>/Local SettingsApplication Data/Macromedia/<你的flash版本>/<语言>/Configuration/Commands
目录下

Windows 7目录
C:\Users\<你的login id>\AppData\Local\Adobe\Flash CS4\zh_CN\Configuration\Commands
目录下

  这样Flash的command菜单下会多出一项,名称是你刚保存的jsfl的文件名。
  点击这项菜单,你会看到flash开始执行test movie的操作。
  然后去查看第一个场景的action,你会发现多出类似下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
//Modified by 嘎嘎磨房 <5Ga.cn> at Fri Feb 12 2010 17:54:23 GMT+0800;
const SOFT_INFO_NAME:String              = "";
const SOFT_INFO_MAJOR_VERSION:Number     = 0;
const SOFT_INFO_MINOR_VERSION:Number     = 0;
const SOFT_INFO_REVISION_VERSION:Number  = 0;
const SOFT_INFO_BUILD_VERSION:Number     = 4;
const SOFT_INFO_BUILD_TIME:Number        = 1265968463223;
const SOFT_INFO_AUTHOR:String            = "嘎嘎磨房 <5Ga.cn>";
const SOFT_INFO_AUTHOR_LINK:String       = "http://www.5ga.cn";
const SOFT_INFO_COPYRIGHT_YEAR:Number    = 2010;
const SOFT_INFO_COPYRIGHT:String         = "Fun学网";
const SOFT_INFO_COPYRIGHT_LINK:String    = "http://www.funshare.com.cn";

  第一行注释写明了作者以及修改时间
  下面的是其他的常量信息,可以配合显示在菜单上,这个类我回头有时间写出来~~ ^_^
  SOFT_INFO_BUILD_VERSION是编译号,每次执行这段命令,版本号会自动加1。
  你可以通过一些快捷键设定使这段程序完全融入你的日常工作中。通常ctrl-enter是flash开发者最常用的快捷键,我们来把这个快捷  键改成执行我们刚才创建的jsfl程序。在维护版本的操作完成之后,这段jsfl最后执行一个Test Movie的操作,这样使用中我们就完全感觉不到区别了。

  1. 在Flash的菜单中选择Edit -> Keyboard Shortcuts…
  2. 从默认设置复制一份setting
  3. 找到Control -> Test Movie
  4. 删除默认的Ctrl-Enter快捷键
  5. 然后到Commands -> [JSFL脚本的文件名]
  6. 设定快捷键Ctrl-Enter

  以后你每次按下Test Movie的时候,脚本会帮你记录上你的名字,修改的时间并把版本号加1,很完美吧!哈哈~

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package cn.wjj.versions {
    import flash.ui.ContextMenu;
    import flash.ui.ContextMenuItem;
    import flash.ui.ContextMenuBuiltInItems;
    import flash.events.ContextMenuEvent;
   
    import flash.net.URLRequest;
    import flash.net.navigateToURL;
    /**
     * 控制 Flash Play 播放器,反键菜单的类
     *                               V1.0
     *
     * Name   :Fun地盘
     * Version:1.1.2 (Build:123)
     * Time   :Thu Feb 11 2010 14:56:46 GMT+0800
     * Author :嘎嘎磨房 <5Ga.cn>
     * -----------------------------------------------
     * Copyright©2009 Fun学网
     */

    public class DisVerMenu {
       
        private var Obj:*;//选择添加在那个场景上面.
        private var newMenu:ContextMenu;
       
        //public function DisVerMenu(sysMenuItems:customItems) {
        public function DisVerMenu(_obj:*) {
            Obj = _obj;
            newMenu = new ContextMenu();
            putName();
            putVersion();
            getTime();
            getAuthor();
            getCopyright();
            Obj.contextMenu = newMenu;
        }
       
        /**
         * 添加软件名称
         */

        private function putName():void {
            if (Obj.hasOwnProperty("SOFT_INFO_NAME")) {
                if(Obj.SOFT_INFO_NAME != ""){
                    var str:String = "Name   :" + Obj.SOFT_INFO_NAME;
                    var item:ContextMenuItem = new ContextMenuItem(str, true, false);
                    newMenu.customItems.push(item);
                }
            }
        }
       
        /**
         * 添加版本号
         */

        private function putVersion():void {
            var str:String = "";
            str = getVerString("SOFT_INFO_MAJOR_VERSION");
            str = str + "." + getVerString("SOFT_INFO_MINOR_VERSION");
            str = str + "." + getVerString("SOFT_INFO_REVISION_VERSION");
            str = str + " (Build:" + getVerString("SOFT_INFO_BUILD_VERSION") + ")";
            str = "Version:" + str;
            var item:ContextMenuItem = new ContextMenuItem(str, false, false);
            newMenu.customItems.push(item);
        }
       
        /**
         * 辅助版本号,获取版本的字符串编号.
         * @param   verName
         * @return
         */

        private function getVerString(verName:String):String {
            if (Obj.hasOwnProperty(verName)) {
                if (Obj[verName] >= 0) {
                    var num:Number = Obj[verName];
                    return String(num);
                }else {
                    return "0";
                }
            }else {
                return "0";
            }
        }
       
        /**
         * 获取现在版本的创建日期
         */

        private function getTime():void {
            if (Obj.hasOwnProperty("SOFT_INFO_BUILD_TIME")) {
                if (Obj.SOFT_INFO_BUILD_TIME >= 0) {
                    var softTime:Date = new Date();
                    softTime.setTime(Obj.SOFT_INFO_BUILD_TIME);
                    var str:String = "Time   :" + softTime;
                    var item:ContextMenuItem = new ContextMenuItem(str, false, false);
                    newMenu.customItems.push(item);
                }
            }
        }
       
        /**
         * 添加作者
         */

        private function getAuthor():void {
            if (Obj.hasOwnProperty("SOFT_INFO_AUTHOR")) {
                if (Obj.SOFT_INFO_AUTHOR != "") {
                    var str:String = "Author :" + Obj.SOFT_INFO_AUTHOR;
                    //添加连接
                    var item:ContextMenuItem;
                    if (Obj.hasOwnProperty("SOFT_INFO_AUTHOR_LINK")) {
                        if (Obj.SOFT_INFO_AUTHOR_LINK != "") {
                            item = new ContextMenuItem(str, false, true);
                            newMenu.customItems.push(item);
                            item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemSelectAuthor);
                        }else {
                            item = new ContextMenuItem(str, false, false);
                            newMenu.customItems.push(item);
                        }
                    }else {
                        item = new ContextMenuItem(str, false, false);
                        newMenu.customItems.push(item);
                    }
                }
            }
        }
       
        /**
         * 为作者添加连接
         * @param   event
         */

        private function menuItemSelectAuthor(event:ContextMenuEvent):void {
            //trace("menuItemSelectAuthor: " + event);
            var str:String = Obj.SOFT_INFO_AUTHOR_LINK;
            var req:URLRequest = new URLRequest(str);
            navigateToURL(req, "_blank");
        }
       
        /**
         * 添加版权信息
         */

        private function getCopyright():void {
            var copyTime:String = getVerString("SOFT_INFO_COPYRIGHT_YEAR");
            if (Obj.hasOwnProperty("SOFT_INFO_COPYRIGHT")) {
                if (Obj.SOFT_INFO_COPYRIGHT != "") {
                    var str:String = "Copyright©" + copyTime + " " +Obj.SOFT_INFO_COPYRIGHT;
                    //添加连接
                    var item:ContextMenuItem;
                    if (Obj.hasOwnProperty("SOFT_INFO_COPYRIGHT_LINK")) {
                        if (Obj.SOFT_INFO_COPYRIGHT_LINK != "") {
                            item = new ContextMenuItem(str, false, true);
                            newMenu.customItems.push(item);
                            item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemSelectCopyright);
                        }else {
                            item = new ContextMenuItem(str, false, false);
                            newMenu.customItems.push(item);
                        }
                    }else {
                        item = new ContextMenuItem(str, false, false);
                        newMenu.customItems.push(item);
                    }
                }
            }
        }
       
        /**
         * 为版权添加连接
         * @param   event
         */

        private function menuItemSelectCopyright(event:ContextMenuEvent):void {
            //trace("menuItemSelectCopyright: " + event);
            var str:String = Obj.SOFT_INFO_COPYRIGHT_LINK;
            var req:URLRequest = new URLRequest(str);
            navigateToURL(req, "_blank");
        }
    }
}

文件下载:
DisVerMenu 类文件
Flash 发布并版本设置 V1.0

相关文章

分类 : FLASH (阅览:) Tags :

评论

还没有评论呢。


留下评论


|:victory:| |:tongue:| |:titter:| |:time:| |:sweat:| |:smile:| |:shy:| |:shocked:| |:sad:| |:mad:| |:lol:| |:kiss:| |:hug:| |:huffy:| |:handshake:| |:cry:| |:call:| |:biggrin:|