ANT & Flex Application: đôi khi Flash Builder không phải là tất cả ;)

Tôi có dịp trao đổi về chuyên môn với 1 số flex developer mà tôi gặp trong quá trình làm việc. Và thật bất ngờ khi phần lớn họ đều phụ thuộc quá nhiều vào Flex (Flash) Builder cho việc build ứng dụng và không mấy hào hứng với các công cụ build khác như mxmlc, hfcd … có vẻ các công cụ không mấy trực quan này không phải là lựa chọn hàng đầu cho các lập trình viên flex, hoặc cũng có thể do tính chất các project mà họ đang làm không thực sự phải dùng đến các công cụ build khác ngoài tính năng build đã có sẵn trong Flex (Flash Builder). Thực sự tôi cũng không có đủ kinh nghiệm để giải thích một cách bài bản khi nào nên dùng các công cụ khác ngoài Flex (Flash) Builder. Nhưng với project thực tế mà tôi đang làm việc, một automation tester cần chỉ cần build application hàng ngày thì việc mở Flash (Flex) Builder chỉ để build thì chả mấy khả quan tí nào.

Kịch bản mà tôi cần giải quyết đó là xây dựng một cơ chế tự động để có thể tự động check-out, merge source code, sau đó build và tự deploy lên server. Công cụ automation mà tôi đang sử dụng là RIATest (sẽ có một bài viết về mảng RIATest – FlexMonkey sau khi tôi hoàn thành việc đánh giá và so sánh 2 công cụ này).  Hệ thống tự động cần build 1 phiên bản application thông thường và một phiên bản tích hợp với các automation library, automation agent và deploy lên 2 server khác nhau. Tôi không có nhiều kinh nghiệm với ANT, ngay cả sau khi đã tốn khá nhiều thời gian với MAVEN để giải quyết một số trục trặc trong quá trình build tự động. Nhưng cá nhân tôi lại thấy cách tiếp cận của ANT dễ dàng hơn rất nhiều so với MAVEN.

Trước hết, nội dung của file build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="webviewer" default="riatest" basedir=".">
	<property file="settings.properties" />
	<!-- path to the flex task libraries. -->
	<path id="flextasks.classpath">
		<fileset dir="${FLEX_HOME}/ant/lib">
			<include name="*.jar" />
		</fileset>
	</path>

	<typedef resource="flexTasks.tasks" classpathref="flextasks.classpath" />
	<target name="riatest" depends="riatest.compile.web,deploy.web" />

	<target name="clean">
		<echo message="Cleaning Build Space" />
		<delete dir="${base.dir}/${build.dir}" />
	</target>

	<target name="deploy.web">
		<copy file="${swfFile}" tofile="${swfFileDomain}" />
	</target>

	<target name="riatest.compile.web" depends="clean">
		<echo message="Compiling Project with RIATest" />
		<mxmlc file="${projectFile}" output="${swfFile}" locale="en_US">
			<load-config filename="${FLEX_HOME}/frameworks/flex-config-riatest.xml" />
			<source-path path-element="${FLEX_HOME}/frameworks" />
			<source-path path-element="${resources.dir}" />
			<source-path path-element="${locales.dir}/{locale}" />
			<source-path path-element="${dev.dir}" />
			<static-link-runtime-shared-libraries />
			<compiler.library-path dir="${FLEX_HOME}/frameworks" append="true">
				<include name="libs/*" />
			</compiler.library-path>
			<compiler.include-libraries dir="${libs.dir}" append="true">
				<include name="cairngorm-2.2.1.swc" />
			</compiler.include-libraries>
			<compiler.include-libraries dir="${libs.dir}" append="true">
				<include name="flexspy-1.2.swc" />
			</compiler.include-libraries>
			<compiler.include-libraries dir="${automationlibs.dir}" append="true">
				<include name="automation_dmv.swc" />
				<include name="automation.swc" />
				<include name="automation_agent.swc" />
				<include name="automation_spark.swc" />
				<include name="riatestagent.swc" />
			</compiler.include-libraries>
			<theme dir="${FLEX_HOME}/frameworks/themes/Halo">
				<include name="halo.swc" />
			</theme>
		</mxmlc>
	</target>
</project>

File settings.properties

flex.path = C:/sdks/

flex.sdkVersion= 4.1.0
flex.sdkPath= ${flex.path}/${flex.sdkVersion}
FLEX_HOME= ${flex.sdkPath}

contentText = [This value will be overwritten by Flash Builder in the output app.xml]

base.dir =..
build.dir = ../bin-release

dev.dir = ../main/flex
resources.dir = ../main/resources/
locales.dir = ../main/locales/
automationlibs.dir = ../flexlib
libs.dir = ../libs

domain1.dir = C:/development/glassfish3/glassfish/domains/domain1/applications/enterprise-app/core-web_war
app.name = flex_application

## mxml or as
app.type = mxml

swfFile=${build.dir}/${app.name}.swf
swcDelegateFile=${build.dir}/${app.name}.swc
swfFileDomain = ${domain1.dir}/${app.name}.swf
projectFile=${dev.dir}/org/catapult//app/webview/${app.name}.${app.type}

swfViewerFile=${build.dir}/${appviewer.name}.swf
projectViewerFile=${dev.dir}/${appviewer.name}.${app.type}

Lưu ý:  trong file build.xml, dòng lệnh <load-config filename=”${FLEX_HOME}/frameworks/flex-config-riatest.xml” /> để load file cấu hình của flex SDK cho mxmlc. Do tôi có một số config riêng như cần include thêm các file AS (delegation class, các file AS được kế thừa từ các lớp xxxImpl) và có cả license Flex SDK. Nếu bạn không sử dụng các automation library hoặc include thêm các file AS khác thì nên thay đổi thành <load-config filename=”${FLEX_HOME}/frameworks/flex-config.xml” />

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s