我正在尝试使用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>
我完全不知道为什么这不起作用。
谢谢,
- 莱恩
答案 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>
在这个新的宏中,我添加了几个编译器选项。在设置了源路径和编译器库选项之后(这告诉编译器要链接什么),一切都很顺利。