使用Ant编译Flex模块

时间:2010-11-25 18:05:35

标签: flex ant

我正在尝试使用Ant编译我的Flex 4项目。我可以编译主应用程序,我可以编译我的一些模块。在子包中具有依赖关系的任何模块都没有说Error: Type was not found or was not a compile-time constant。我使用Flash Builder 4在Windows上进行所有开发,因此我可以编译所有内容,但我需要做的是将编译移动到基于Linux的无头服务器(这是Ant的用武之地)。

我创建了一个简单的项目来测试我的问题:

src-> Main.mxml
 |->modules
       |-> module1-> Module1.mxml
       |-> module2-> Module2.mxml
               |-> subPackage-> SubClass.as

Module1除Flex框架类之外不使用任何类,其中Module2具有SubClass的实例。编译主应用程序工作正常,Module1也是如此。当它尝试编译Module2时,我收到错误Error: Type was not found or was not a compile-time constant: SubClass.

我的完整Ant脚本是:

<project name="Test" basedir=".">

<property file="build.properties" />
<target name="properties">
    <fail unless="mxmlc">The "mxmlc" property must be set in build.properties.</fail>
</target>

<target name="build-app" depends="properties">
    <exec executable="${mxmlc}" dir="${src.dir}" failonerror="true">

        <!-- Point to the mxml file -->
        <arg line="${app.name}.mxml" />

        <!-- Don\t generate debug swf -->
        <arg line="-debug=false" />

        <!-- Generate optimized swf -->
        <arg line="-optimize=true" />

        <!-- Don't build incrementally -->
        <arg line="-incremental=false" />

        <!-- Place the built .swf file in the "bin" directory -->
        <arg line="-output '${build.dir}/${app.name}.swf'" />

        <!--
           Create a linker report that lists all the classes already in the main app
           This gets passed to the modules so that they don't load up the shared libs again.
        -->
        <arg line="-link-report='${temp.dir}/link-report.xml'"/>

    </exec>
</target>

<target name="build-modules" description="Build Modules">
    <build.module dir="${module.dir}/module1" file="Module1"/>
    <build.module dir="${module.dir}/module2" file="Module2"/>
</target>

<macrodef name="build.module">
    <attribute name="dir" />
    <attribute name="file" />
    <sequential>
        <echo>@{file}</echo>
        <exec executable="${mxmlc}" dir="${src.dir}"  failonerror="true">
            <!-- Point to the mxml file -->
            <arg line="'@{dir}/@{file}.mxml'" />

            <!-- Don't generate debug swf -->
            <arg line="-debug=false" />

            <!-- Generate optimized swf -->
            <arg line="-optimize=true" />

            <!-- Don't build incrementally -->
            <arg line="-incremental=false" />

            <!-- Place the built .swf file in the "bin" directory -->
            <arg line="-output '${module.build.dir}/@{file}.swf'" />

            <!-- Exclude all classes that are already in the main application -->
            <arg line="-load-externs='${temp.dir}/link-report.xml'"/>
         </exec>
    </sequential>
</macrodef>

我完全不知道为什么这不起作用。

谢谢,

- 莱恩

1 个答案:

答案 0 :(得分:3)

经过大量的研究,试验和错误以及诅咒,我终于找到了解决方案。最初我试图使用ANT <exec>命令编译模块。在我的最终解决方案中,我确实将其更改为使用ANT的<mxmlc>目标(来自Flex SDK目录ant / lib / flexTasks.jar中的flexTasks.jar)。

<macrodef name="build.module">
    <attribute name="moduleDir" />
    <attribute name="dir" />
    <attribute name="file" />
    <sequential>
        <echo>@{file}</echo>
        <mxmlc file="@{moduleDir}/@{dir}/@{file}.mxml"
                output='${module.build.dir}/@{dir}/@{file}.swf' 
                optimize="true" 
                debug="false" 
                load-externs="${temp.dir}/link-report.xml" 
                incremental="false"
                fork="true" maxmemory="${maxMem}">
            <compiler.source-path path-element="${src.dir}"/>
            <source-path path-element="${FLEX_HOME}/frameworks"/>
            <compiler.library-path dir="${FLEX_HOME}/frameworks" append="true">
                <include name="libs" />
            </compiler.library-path>
            <source-path path-element="${src.dir}"/>
            <compiler.library-path dir="${libs.dir}/" append="true">
                <include name="*" />
            </compiler.library-path>
        </mxmlc>
    </sequential>
</macrodef>

在这个新的宏中,我添加了几个编译器选项。在设置了源路径和编译器库选项之后(这告诉编译器要链接什么),一切都很顺利。