Flash,Ant和许多正则表达式替换

时间:2011-10-24 13:06:56

标签: ant flash-builder

我有一个flash项目,出于优化目的,在发布版本期间必须用文字替换常量引用。

我想要替换数百个常量。所有这些都以这种格式存储在单个文件中:

FILE: Constants.as
public static const CONST_1         :uint = 0;
public static const CONST_LOLO      :int = -1;
public static const CONST_WHEE      :Number = 2.55;
public static const OTHER_CONST     :String = "La string!";
public static const ITSAMEMARIO     :String = "O, HAI!";
public static const MAGE_WALL       :uint = 15;

我想我可以手动完成,就像那样:

<replaceregexp match="CONST_1" replace="0">
    <fileset dir="${project.sourcePath}" includes="**/*.as" />
</replaceregexp>
<replaceregexp match="CONST_LOLO" replace="-1">
    <fileset dir="${project.sourcePath}" includes="**/*.as" />
</replaceregexp>

等等,对于所有其他变量。问题是双重的 - 首先,这是一项相当多的工作。但更大的问题是,这些常数可以改变,我必须记住在两个地方进行改变。

一般来说,我正在使用Ant(我刚刚开始学习)来完成这项任务,但如果你认为有更好的方法,我会全力以赴。我能想到两种解决方案,其中没有一种我知道如何执行:

  1. 编写一些智能裤子的Ant代码,它会解析这个常量文件并愉快地进行替换,将所有内容保存在内存中。
  2. 让任务首先解析 Constants.as ,输出一个新的Ant脚本,然后由第一个任务执行。
  3. 我正在使用Flash Builder 4.5来满足我的所有Ant需求。

    编辑: 一些澄清。在项目中我使用常量,例如LEVEL_WIDTH。所有这些常量都在前面提到的Constants.as中声明。现在我想要的是用它们的实际值替换整个项目中这些常量的所有实例。所以这样的界限:

    return (x >= 0 && x < Constants.LEVEL_WIDTH);
    

    将替换为:

    return (x >= 0 && x < 20);
    

1 个答案:

答案 0 :(得分:1)

好的,这对蚂蚁来说不是最简单的事情。首先,你需要知道你可以改变什么。这意味着您的常量的所有名称以及相应的值。常量名称是唯一的吗?如果是,这听起来像是我的地图结构。然后,您需要重新放置包含一个或多个这些变量的所有源文件,以便将每个常量替换为实际值。这不是ant的设计目标,但你可以使用脚本def来实现。

我会像这样用java做这个:

将所有常量/值存储到映射中(如果常量是唯一的),否则使用不同的结构。

示例代码:

<project name="test" default="build">
  <property name="constants" value="constants.txt"/>

  <scriptdef name="replaceConstants" language="java">
    <attribute name="constants" />
    <attribute name="srcFile" />
    <![CDATA[
      import java.util.*;
      import java.util.regex.*;
      ArrayList constantNameList = new ArrayList();
      ArrayList constantValueList = new ArrayList();

      var constantFile = attributes.get("constants");
      Pattern regex = Pattern.compile("(?<=const)\\s+(\\b\\w+\\b).*?=\\s*(.*?)\\s*;");
        Matcher regexMatcher = regex.matcher(constantFile);
        while (regexMatcher.find()) {
            constantNameList.add(regexMatcher.group(1));
        constantValueList.add(regexMatcher.group(2));
        }
      for(int i = 0; i < constantNameList.size(); ++i)
      {
        //debugging
        System.out.print("key : ");
        System.out.print(constantNameList.get(i));
        System.out.print(" value : ");
        System.out.println(constantValueList.get(i));
        //do the actual replacement here
      }
     ]]>
  </scriptdef>

  <target name="build">
    <loadfile property="constants.file" srcFile="${constants}"/>
    <loadfile property="source.file" srcFile="sourceFile.txt"/>
    <echo message="${constants.file}"/>
    <replaceConstants constants="${constants.file}" srcFile="${source.file}"/>
  </target>
</project>

您需要使用java 1.6或更高版本以及http://www.java2s.com/Code/Jar/ABC/bsh-2.0b5.jar.htm

来运行它

运行它的jar。

输出:

[replaceConstants] key : CONST_1 value : 0
[replaceConstants] key : CONST_LOLO value : -1
[replaceConstants] key : CONST_WHEE value : 2.55
[replaceConstants] key : OTHER_CONST value : "La string!"
[replaceConstants] key : ITSAMEMARIO value : "O, HAI!"
[replaceConstants] key : MAGE_WALL value : 15

所以我所做的是将所有常量名称/值存储到两个数组中。您需要遍历每个源文件的数组和正则表达式替换。整个事情可以是一个你可以多次调用的macrodef。