當我們的類庫在Flex Builder中可以編譯通過時,那自動化編譯(ant)主要是根據(jù)在Flex Builder中設(shè)置的參數(shù)一致,基本就可以采用compc命令編譯出一個swc文件。在編譯過程中可能會遇到各種問題,不過不要煩躁,找到每個問題的原因,自然就找到了解決辦法,下面總結(jié)一下在做Flex自動化編譯過程中遇到的問題,希望可以幫助到大家。 在做ant編譯之前,先看一下工程的具體信息,右鍵工程—屬性,切換到Flex Library Build Path中,我們可以看到四個選項卡,Classes\Assers\Source Path\Library Path,那也就是說明我們用編寫腳本的時候只需要指定這四項就可以了,另外,在Flex Library Compiler中可以看到是en_US\zh_CN,證明要做中英文資源化,因此我們自動化編譯的時候需要將資源化文件引入,具體國際化會在后面介紹。 1. Flex Embed資源錯誤Unable to transcode asset處理 <mx:Image id="img_border" source="@Embed('../assets/border.png')" visible="false" width="100%" height="100%"/> 一段簡單的代碼flex編譯居然報錯: Unable to transcode ../assets/border.png. 解決方法很簡單, 將 '../assets/border.png' 改為 '/../assets/border.png' 就是在前面加個斜杠。 2. Flex國際化 首先先介紹下國際化: Flex國際化一般采用的是類似struts的bundle類似的方法,至于好處嘛會使用STRUTS的人都應該知道。 默認為-locale en_US。 舉個例子吧: 如果編譯的時候沒有引用資源文件,則會報相應的資源文件未找到。 在build.xml中添加資源文件即可 <source-path path-element="${project.dir}/locale/en_US"/> <source-path path-element="${project.dir}/locale/zh_CN"/> 3. 編譯后的mx文件夾下所有圖片大小為0字節(jié) Mx中包括controls和container文件夾,主要包括用到的Flex控件的圖片,因此需要在source-path中指定圖片的位置,否則找不到圖片,大小就為0嘍; 加入以下腳本即可: <source-path path-element="${projects.framework}/src"/> 大概目錄位置是E:\Program Files\Adobe\Flex Builder 3\sdks\3.2.0\frameworks\projects\framework\src 里面包括一個mx文件夾,是Flex用到的所有資源圖片的存在位置。 4. 工程目錄中包括mxml時編譯不到swc中 因為我們編譯的時候首先是讀取src文件夾中的所有類,然后指定compc參數(shù)的include-classes參數(shù),這時只是指定的所有as文件,而mxml是不屬于某個包里面的,因此這里需要使用include-sources參數(shù)來指定。 具體代碼如下: <include-sources dir = "${project.dir}\src\com\supermap\web\controls" includes = "Compass.mxml" /> Build.xml文件內(nèi)容如下所示: <project name="Web.swc" basedir="." default="main" > <taskdef resource="flexTasks.tasks" classpath="E:\Flex\flexTasks\lib\flexTasks.jar" /> <property name="FLEX_HOME" value="E:\Progra~1\Adobe\FlexBu~1\sdks\3.2.0" /> <property name="project.dir" value ="E:\FlexProject\FlexClient60\FlexClientLib" /> <property name="output.file" value="Web.swc" /> <property name="projects.framework" value="E:\Program Files\Adobe\Flex Builder 3\sdks\3.2.0\frameworks\projects\framework"/> <target name="main" depends="clean, log, compc" /> <!-- deletes and recreates the compc directory --> <target name="clean"> <delete dir="${project.dir}\compile" failonerror="true"/> <mkdir dir="${project.dir}\compile"/> <echo>${Root}\bin</echo> </target> <!-- runs the compc.exe compiler on the source --> <target name="compc"> <echo>${Root}/src</echo> <fileset dir="${project.dir}\src" id="src.files"> <include name="**\**"/> </fileset> <pathconvert property="evaFramework_classes" pathsep=" " dirsep="." refid="src.files" > <map from="${project.dir}\src\" to=""/> <mapper> <chainedmapper> <globmapper from="*.as" to="*"/> </chainedmapper> </mapper> </pathconvert> <!--輸出所有類--> <echo>${evaFramework_classes}</echo> <!--開始編譯類庫文件--> <compc output="${project.dir}\compile\${output.file}" locale="en_US,zh_CN" include-classes="${evaFramework_classes}" optimize="true" benchmark="true" strict = "true" debug="true" as3="true" actionscript-file-encoding = "utf-8" allow-source-path-overlap = "true" use-resource-bundle-metadata = "true" > <source-path path-element="${project.dir}/src" /> <!--如果類庫做了國際化,那么需要引入國際化資源文件,也就是工程目錄\locale\下面的所有資源文件(類型為.properties)--> <source-path path-element="${project.dir}/locale/en_US"/> <source-path path-element="${project.dir}/locale/zh_CN"/> <source-path path-element="${projects.framework}/src"/> <!-- List of SWC files or directories that contain SWC files. --> <!—注意這里可以指定類庫文件的目錄啊,呵呵--> <compiler.include-libraries dir="${FLEX_HOME}" append="true"> <include name="/frameworks"/> </compiler.include-libraries> <compiler.include-libraries dir="${project.dir}" append="true"> <include name="/lib" /> </compiler.include-libraries> </compc> </target> <!-- writes compc output to log file: compc-log.log --> <target name="log"> <record name="${project.dir}\compile\compc-log.log" action="start" append="true" /> </target> </project>
http://livedocs.adobe.com/flex/3/html/help.html?content=anttasks_1.html |
|