SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3657|回复: 1

[推荐] Worklight 自动化构建

[复制链接]
发表于 2013-2-17 10:29:38 | 显示全部楼层 |阅读模式
本帖最后由 技术狂人 于 2013-2-17 10:37 编辑
# `* g0 _* B- Z. _8 t6 b* n% N' U" \0 e' n
Worklight 简介
, ~" o- X* N& ~( ?2 Q' F: j: O7 NIBM® Worklight® V5 是一种领先的移动企业应用程序平台 (Mobile Enterprise Application Platform, MEAP),利用该平台,IBM 可以跨其产品组合扩展其整体移动能力。如何写 Worklight 应用程序请参考文章 使用 Worklight,第 1 部分 : 开始使用您的第一个 Worklight 应用程序0 c+ L9 \* g+ h( n6 M/ Q3 I. Q/ d


( q& M2 A$ A9 u. G9 ^7 G- H( T
* Q  E% O3 Q, t4 R/ pApache Ant 基础知识
! ^- Q' n' w' c4 x, u- JApache ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。更多关于 Apache Ant 的内容请参考 Apache Ant 手册
1 c3 G0 L% b) W" w8 Z+ P

6 m' j; X' x0 ]3 p% ^# }7 m
" F$ n  p6 \* P* o" l  P: EWorklight Ant tasks 介绍+ o8 h: f3 j4 @. [0 U
Worklight 为了方便开发者自动构建个部署 Worklight 适配器和应用程序,创建了几个 Apache ANT 任务,app-builder、 app-deployer、adapter-builder、adapter-deployer、war-builder。
0 d3 T+ Q( w* h3 M' g! L声明 worklight ant 任务3 V! S# q" c  K! L
Worklight Ant 构建工具包中定义了用了执行构建和部署的 Ant 任务,在使用这些任务前,我们需要将 worklight-ant.jar 文件加载到 classpath,并引用 com/workight/ant/defaults.properties 声明 Ant 任务。
$ O2 Q: z' z: ?' X2 _1 P6 X
/ \( l& S  F) l. M% n清单 1. 声明 Worklight Ant tasks; F0 V4 L+ C" X) u% _+ j6 ^
<taskdef resource="com/worklight/ant/defaults.properties">
7 S; d8 Z% l3 i: Z    <classpath>
' \" B' X! _: V; s' @# j        <pathelement location="${buildToolDir}/worklight-ant.jar"/> 6 m7 S0 }' i- ^
    </classpath>
4 _- X/ \8 ^4 c  u </taskdef>
6 a6 \0 n# v" B% I" p
构建 Worklight 应用3 d- p1 h. w) v) @: Z
Worklight Ant 构建工具包中定义 app-builder 任务用于构建 Worklight 应用。
, O; w9 @% g$ n; {, V8 M
; F/ @8 f1 z0 x清单 2. 构建 Worklight 应用3 k% G! e8 S8 K$ p
<target name="build_wl_apps" depends="change_Server_IP">
( V2 a4 t2 M5 I) Y" P: x    <echo>build_wl_apps ${projectName}</echo> " Q/ j, J: N- u6 T; [) F6 s! ?
    <delete dir="${outputPath}"/> 1 ]+ M" k- p7 Z2 V, l6 X" P
    <mkdir dir="${outputPath}"/> ! P4 [, Z( Z' E% _8 a+ ^, H
    <record name="${outputPath}/build.log" loglevel="verbose"   append="false"/> 6 {! v3 W. A( |& i" z6 t
    <app-builder nativeProjectPrefix="${projectName}_" ) ^+ }' o. Y9 A8 Y$ F# N
    applicationFolder="${projectPath}/apps/${appName}" outputFolder="${outputPath}"> # F. E4 }3 Q# Y) \# z$ M' ^% w
    </app-builder> 1 }0 {6 q0 W6 c
</target>

$ T0 m$ n2 [9 B1 Q& S5 m表 1.app-builder 属性说明2 F) u$ |8 h3 ~, h; J
属性描述默认值
applicationFolderWorklight 应用程序的目录build.xml 父目录 . 如果失败在根目录下寻找包含 application-descriptor.xml 文件的目录作为默认值
environments用逗号隔开的应用环境如:common, android,iphone所有在应用程序里的环境
appsBackupsFolder指定备份应用程序的目录Worklight 应用程序的目录的父目录
concatenate是否连接 web 资源
minifyResources是否最小化 web 资源
nativeProjectPrefix本地应用的前缀
3 u! {6 E- E! F( q# [/ t  当使用 iOS 环境时这个值必须设置
空值
worklightServerHostWorklight 服务主机,使用主机名或者 IP 地址application-descriptor.xml 里 worklightServerRootURL 的值
outputFolder放置 .wlapp 的目录applicationFolder/bin
deploy当设为 'true' 时,应用将被部署到 Worklight 服务端false
failOnError出现错误时终止整个构建任务true
debug设为‘ true ’时采用调试模式,这样会写日志文件false
displayName显示应用的名字来自于 application-descriptor.xml 的 displayName 标签
descriptionApplication's descriptor来自于 application-descriptor.xml 的 discription 标签
androidAPILevelAndroid API 的等级-1
mobileDeviceSSO让设备在应用中可以单点登录
5 S9 Q5 S5 ?3 h3 e
false

6 Y: L% C; M/ h4 l% c3 k部署 Worklight 应用' I5 B# V$ [5 Q4 |+ D- N
Worklight Ant 构建工具包中定义 app-deployer 任务用于部署 Worklight 应用到 Worklight Server。; {9 }5 z% T# p( \. f6 J/ n
% N7 Y3 D! a' i; o7 ~+ q3 V5 |
清单 3. 部署 Worklight 应用
5 W8 v9 J# b5 Y8 `
<app-deployer deployable="${outputPath}/${appName}-all.wlapp"0 y3 q, w6 F) k$ w, ^3 {4 K  P
worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>

# Q) l0 i4 D% I8 H* i
. o1 A& Z  b5 k# l' C7 s2 E- h表 2.app- deployer 属性说明" [1 Y, u1 K8 M2 c
属性描述默认值
worklightServerHostWorklight 服务端的 URLapplication-descriptor.xml 里 worklightServerRootURL 的值
deployable.wlapp 文件的路径
- }$ M1 f/ E: c; ]: Y- p
构建 Worklight 适配器) e. J: c" c- d. a2 n  h3 k5 i
Worklight Ant 构建工具包中定义 adapter-builder 任务用于构建 Worklight 适配器。
; O: d* F: a2 M: X/ N
4 s( g9 i" [1 Z* z% x清单 4. 构建 Worklight 适配器
, y# j7 F# i9 ^' K
<target name="build_wl_adapter">
3 _2 N; a; a  a    <echo>build_wl_adapter ${projectPath}</echo>
4 O7 w* \  q( [0 F$ @  F    <record name="${outputPath}/build.log" loglevel="verbose" append="true"/>
8 Y6 f* A. j+ d9 }2 x3 F    <adapter-builder folder="${projectPath}/adapters/${YouAdapterName}"
& A- ^1 U5 B: w4 c" h" r$ L    destinationFolder="${outputPath}"> * C3 A% o/ |0 y
    </adapter-builder> 2 O1 B; q" e$ V! \% V
</target>
1 j/ s5 @) r, y3 y5 D6 k/ l3 v6 g
6 n, f( o$ [+ W$ |# s9 s: B( n' X& u9 r
表 3. adapter-builder 属性说明
, W2 v& r% Y5 B  u
属性描述默认值
folder适配器源代码所在的目录
destinationfolder指定适配器输出目录
  x. N2 D' v! M* ?- }
部署 Worklight 适配器
( @! w: _3 u5 k7 I% E( OWorklight Ant 构建工具包中定义 adapter-deployer 任务用于部署 Worklight 适配器到 Worklight Server。  Y/ U6 i# g4 U7 c- h# T) x+ a3 @
" p% }3 [& C0 \# k$ K* F+ @. l
清单 5. 部署 Worklight 适配器0 _0 a1 @+ ]: Z$ y# Q2 t
<adapter-deployer   _5 o9 Y0 e) z4 I/ _3 j
deployable="${outputPath}/WorklightStarterAdapter.adapter" # a$ n7 \3 o+ U
   worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>
4 {5 E. e8 D. U$ _" p

6 l" k- C! X5 I4 z% e& F: _表 4. adapter-deployer 属性说明" y7 ~; x+ `2 I1 H( W
属性描述默认值
worklightServerHostWorklight 服务端的 URL application-descriptor.xml 里 worklightServerRootURL 的值
deployable.adapter 文件路径或者他的父目录
1 _2 A  y7 D* H1 V6 ?  A8 @
构建 Worklight 控制台服务5 c$ \7 y. |+ y- x) a
每个 Worklight 应用可以构建出一个 .war 文件用于提供 Worklight 控制台服务,构建出的 .war 文件能够部署到 Web 服务器上,比如 Jetty,tomcat 和 Websphere Application Server 等。Worklight Ant 构建工具包中定义 war-builder 任务用于构建 Worklight 服务。7 S+ ^& F, ~; H$ L6 M3 ]

6 ]* h. R  j0 g. u0 n: U$ O清单 6. 构建 Worklight 控制台服务
& ~* W) `" B2 m" h0 c7 {' v
<target name="build-wl-war" depends="clean, compile-JavaSources"> 1 `0 U& ?1 u. L) k  p' f9 _
    <war-builder projectfolder="${project.path}"  
& X( v$ l" u" a- u    webxml="resources/war/web.xml"# Y9 l" i  {; \, i- _! _4 ~
classesfolder="${java-classes-dir}" destinationfolder="${artifacts.dir}"> 6 X! ^# a  t( P/ C0 P/ E% {
<fileset dir="resources/jsp"/> / E1 y( E% D0 b) t$ A8 {
    </war-builder> 4 `/ e5 ^% P9 N% P
</target>
( h3 W) K, L! H& {, X6 \6 U3 d

* l4 T  b; s) [. d: s5 d表 5. war-builder 属性说明
% ?0 _: V8 Z8 ~' L1 q6 l
属性描述默认值
projectfolderWorklight 项目的目录
classesfolder.adapter 文件路径或者他的父目录
destinationfolderWorklight 项目 war 文件放置的目录
webxml设置 Worklight 项目的 web.xml 文件/war/web.xml

9 N, e8 A! ~9 ]部署 Worklight 服务端到 Websphere Application Server+ I& u, w  h+ q0 l2 V+ T, y5 K
采用 websphere 提供的 ant 任务来实现部署 worklight 服务端的 war 文件到 websphere,通过 python 来自动配置 worklight jee jar, 在 sample 里提供了一个 python 文件 changeConfig.py, 通过这个脚步文件会创建一个共享类,然后把这个共享类添加到 worklight server,设置类的加载顺序为 PARENT_LAST。
% @! @# D1 i: `5 ^& Q/ O; E) z% F7 e0 @  b+ `" F6 C
清单 7. 设置共享类和类加载顺序的程序清单如下' h& C& v& o* v: a
<target name="saveConfig" description="save Config">
; h9 k* p9 T* {5 R8 m6 O    <taskdef classname="com.ibm.websphere.ant.tasks.WsAdmin" name="wsAdmin" />
$ h* Y0 R5 V4 N$ Y        <wsAdmin host="${was.hostname}" conntype="${was.conntype}"  x/ Q9 @- s0 x# T$ ?
                 lang="${language}" port="${was.hostport}" washome="${was.home}"
+ J( Y/ {0 I7 U) V5 E                  user="${was.username}"2 }: V5 m6 x& s$ X- r* W
                 password="${was.userpassword}" script="changeConfig.py">
0 I+ T  Y1 p( A                 <!-- worklight shared lib name --> , O8 G* v8 `* e7 j
                 <arg value="${config.websphere.sharedlib}"/> 5 [/ I, J7 ~- X9 z$ |5 S2 `% @
                 <!-- worklight shared lib path -->
, }! h. z+ o: U3 a; z) n6 q                 <arg value="${config.worklight.jee}"/> / g+ f& }9 b! ~1 d, v' G
                  <!-- worklight server 的名字 -->
% t6 ~" J5 y" [                 <arg value="${projectName}"/>
' N( E. k& a0 x# I                  <!-- Websphere 节点的名字 --> # X- `* O- A8 [
                 <arg value="${config.websphere.node}"/>
% Y* f) [( H. M* ]                  <!-- Websphere 服务器的名字 --> & l; [9 ^" B7 S5 e5 p" T2 `2 j: O
                 <arg value="${config.websphere.server}"/>
) H$ g+ q) ]+ J' Z% C; k( ~8 W$ X </wsAdmin>
" O& f( g) L* D; J$ B- ^  W) p </target>

. K7 R+ h0 d3 f+ j2 ^+ ?在 build.xml 文件里还提供了 uninstallapp, installapp, startApp, stopApp 等任务,这些任务在 Windows 上需要使用 ${WAS_HOME}/bin/ws_ant.bat 来运行,在 Linux 上需要使用 sudo ${WAS_HOME}/bin/ws_ant.sh 来运行。
/ U) Z" C' Q! ?1 {. G) \比如你可以使用下面的命令来运行 saveConfig:
2 L4 q! a6 }8 k0 Z& o
  • 把附件中的文件解压到到你的 worklight 项目的根目录下面
  • 修改 application.xml, 用你的项目的名字替代 WorklightStarter_jQueryMobile
  • 修改 build.properties 里和 Websphere 相关的项目,根据你自己的环境
  • 打开 cmd,把当前目录设置为你的项目的目录,然后在命令行里输入 ${WAS_HOME}/bin/ws_ant.bat saveConfig/ r( K/ ~1 D9 `9 k. B$ k& |& ~


' X9 k, ?5 M" _" C, Y3 X0 ]  J
. l* u* B+ {* i) q/ rWorklight App 本地应用构建% z+ \6 G% P0 C$ ~0 Z
完成 Worklight 应用构建后,在 Worklight 环境文件夹中会生成对应的本地应用目录,对应文件夹名称为 native。本节以 Android 和 iPhone 环境为例展示如何通过 Ant 脚本构建生成 Android 上的 apk 安装文件和 iPhone 上的 ipa 安装文件。
# _# k1 a8 O2 n9 _Android 本地应用构建
5 r8 s" l) E3 \( w+ TWorklight 的 Android 环境本地应用目录中不包含用于 Ant 构建所需要的 build.xml ( 文件位置是 ${projectPath}/apps/${appName}/android/native/build.xml),需要使用 Android SDK 中的 android 工具更新工程并指定用于编译的 Android 平台。7 |3 S+ w4 i5 |

+ y5 M7 {% t: p. ~. n清单 8. 生成 Android 本地 build.xml 文件
% {3 c  V1 p2 k7 t6 p
<target name="prepare_android_build">
. @, C9 r+ M; h3 y# [    <!-- on windows -->
" }. e& v' J4 ~4 ~6 Z8 L9 y- J8 h    <exec executable="cmd" osfamily="windows">
) ]# U/ n, t; f$ C2 @( U* k        <arg value="/c ${androidSDK}/tools/android.bat update project   |& c: K$ q  e0 u
        --path ${projectPath}/apps/${appName}/android/native --target
8 _0 I$ Q2 V0 f         android-8"/>
  F3 y  y: `( b$ x7 @2 ?    </exec> / A  h* |' I/ w% P7 Q1 w% V
    <!-- on linux and Mac --> 6 l) t) [4 X  X/ u2 y
    <exec executable="/bin/sh" osfamily="unix"> ( o% n0 m2 O. P: F7 M
  <arg value="-c"/>
" U2 C$ V- k- l1 l        <arg value="${androidSDK}/tools/android update project ) R; C8 ]( J2 G: R; ]2 x8 R8 v4 V
        --path ${projectPath}/apps/${appName}/android/native ( C) n' v7 l* w5 \0 ?
        --target android-8"/> 4 L. W5 \# q& v4 ]' {% e
    </exec> - {' n: m, x" [5 K/ ^- a- l
</target>
' O- ?2 s2 }9 p; ~& N9 k4 E2 Q
; X% W# V- ]0 ?2 n; k) N
表 5. android 属性说明- q$ G8 r/ {' L+ b. Y
属性描述默认值
pathAndroid 本地工程位置
target构建 APK 的 SDK 平台,例如 android-8

: l" n! Z6 M$ ^- f2 _  p- j需要注意的是在 windows 平台下运行”cmd”命令并执行 android.bat 进行更新,而在 linux 平台和 Mac 平台下运行”/bin/sh”并执行 android 进行更新,更新后的 Android 工程文件夹中将产生用于 Android apk 文件构建的 build.xml 文件。如图 1 所示。
& d$ s0 @# \  _" W; P
% \' v7 H7 N4 C6 h4 V图 1. 使用 Ant 更新 Worklight Android 本地应用工程
& I# o% b. s6 d% M, W
6 O" ]8 n1 @8 t# M检查更新后的文件夹结构,确保 Android 工程目录中产生 build.xml 文件,如图 2 所示。
. ]" n  d, s  j) u( v
( f+ ~, W3 W) v图 2.Worklight Android 本地应用工程构建文件:! x/ |  l, a2 D( L* R
( N, n7 z* z/ r' t# I9 `
然后通过生成的 build.xml 进行 Android 本地 apk 文件构建。* m( H; P- d; N3 T

/ x6 m" L4 P( Z" S清单 9. 构建 Android apk 应用% E) t+ v" z- ^
<target name="build_android"$ x( S7 U! Z4 r+ D
  depends="build_wl_apps, prepare_android_build"> % Y5 T/ ~* {* O4 F- K
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"/ s( v5 G/ U/ H. X
     target="debug" useNativeBasedir="true"/> 4 ~1 A0 ~2 w7 g8 j. Q; |
    <copy todir="${outputPath}">   s: v/ i3 j8 _9 E( T
        <fileset dir="${projectPath}/apps/${appName}/android/native/bin">
$ E5 `$ @8 b! X8 l; i, s            <include name="${appName}-debug.apk"/>
' G3 }/ J: `; K; J3 K        </fileset> 6 O8 K  W5 z' q; S: J6 R% y
    </copy> 5 Y/ |4 W' x. c  q
</target>

, a! u$ `# ^# r6 {$ G
* N1 `6 K/ w! x" @表 6. 构建 apk 属性说明2 L$ c6 n+ b1 x! {# {, K
属性描述默认值
antfile取值为更新 Android 工程后产生的 build.xml 文件路径
target Apk 文件构建类型,取值为 debug 或 release
2 p  \8 c/ T9 v! Z/ s, L, m  debug:Debug 版本 APK1 H- Y$ J/ Y8 v6 y9 k
  release:Release 版本 APK,需指定签名文件。
useNativeBasedir使用 Android 本地工程文件夹作为 build.xml 的 basedir# \/ a' }' \- {) d5 z/ L( W; }  g
取值为 true 或 false
false

. k6 y/ B) K' @* d9 s, N; ~# Z构建完成后 apk 文件保存在 Android 工程的 bin 文件夹下,可以通过 ANT 的 copy 命令将其复制到统一的输出文件夹中。5 F, B6 H/ V5 r" X. A; w: m
如果需要构建出 Release 版本的 APK 文件,请修改 target 参数值为 release,并在 Android 环境 native 文件夹中添加 build.properties 文件指定签名文件路径和对应的密码。9 Z. Y9 l3 N- b% k
2 p) F+ B& T4 g1 H
清单 10. 构建 Android apk Release 应用
9 |6 e( I3 [- C: ?! ~
<target name="build_android" depends="build_wl_apps, prepare_android_build"> 0 V3 L" p5 i: [
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"# d6 R5 \% A; B+ F/ l% ?6 f& O
     target="release" useNativeBasedir="true"/> " Q' l; a% T9 i& _. o# T8 S
    <copy todir="${outputPath}">
! j! v- p4 A/ U        <fileset dir="${projectPath}/apps/${appName}/android/native/bin"> # O: [# Z& o7 l% f( U' {
            <include name="${appName}-release.apk"/>
# D. O2 Y/ h/ r, a# @        </fileset>
, b' p2 u$ B- h# b    </copy> 5 ^! u. E) Z! R1 F
</target>
% M5 g+ x$ i( ^$ r+ ^. o: I0 [0 Y
添加 build.properties 文件到 Android 环境的 native 文件夹 , 如图 3 所示。
2 f/ M  S+ l" d
+ R, |+ i0 |' v图 3. 添加 build.properties 到 android 环境 native 文件夹
  V' d# o4 B& Y5 z4 s$ A+ X' K
- k6 Y& Y$ n( L使用在 Eclipse 中使用“导出 Android 应用”功能创建您的签名文件并设置密码,然后在 build.properties 文件中指定签名文件路径和对应的密码。; r" a$ r! t) b) |

! z0 h) N7 P, T% H$ e* [清单 11. 设置签名文件信息
* F  W' f, _$ x6 ^( S
#Android 签名文件路径 , 例如 D:\\workLight\\AndroidKey\\key.keystore
/ ]$ p4 d0 R$ e2 s9 Q9 d9 l key.store=YouKeystore
/ l  u% |0 g3 c+ K- O #Android 签名文件别名 , 例如 export ' [% l# z% _2 p, h7 {) s5 V
key.alias=YouAlias
. F) n" F, z% M0 a4 X& ~ #Android 签名文件密码
! ]! c( g) C4 N* n2 D+ V" G1 A! E key.store.password=YouPassword
# n  r$ N% H' x+ B8 D7 O6 D #Android 签名文件密码! V% S7 T. U% L) Q! q8 L! y( n6 i
key.alias.password=YouPassword

* a& S8 Y; w/ jiOS 本地应用构建$ P+ e% o/ x) c- L1 b3 z( E
构建 iOS 本地应用需要有一台 Mac 并安装 Xcode,本文使用 Mac OS x 10.7 和 Xcode4.3.3 进行 iPhone 应用构建。为了确保 Ant iOS 构建任务是运行在 Mac 平台上,您可以使用 Ant 来检查运行平台是否符合条件。本节添加一个 Ant target 来检查当前运行平台。; e, G$ @: \4 g* Z
3 o. ^6 D4 J: C
清单 12. 检查 Ant 运行平台信息
* H; ]# G+ T8 C' ?! W* h! ^
<target name="init">
" N$ L, H% k+ }' e         <condition property="isWindows">
% A2 l2 s0 q. P  q5 z# U                 <os family="windows"/>
3 c3 \# w6 `- ~+ _         </condition> ; c* q3 k; y$ e% h
         <condition property="isMac">
1 p( c6 H" L% M                 <os family="mac"/>
% O$ F8 e8 H/ p2 a4 C         </condition>
% {8 r( ^' a, U( V/ F( _         <condition property="isLinux">
, W$ U% m7 }! i# T  Y" z                 <os family="unix"/>
9 x! [+ }$ K; }, d         </condition> ! e$ l3 g' l! N0 g$ j8 U) j. U8 C0 }
</target>

; O! W) y; Z3 X执行 ant init,当前的运行平台信息会保存在对应的变量中,检查平台是 Mac OS 后就可以进行 iOS 本地应用构建。iOS 目标任务构建包含两部分,构建本地应用和打包本地应用为 ipa 文件。完整的 iOS 构建程序清单如下。
9 Z' Z2 [' Z8 n# \1 q8 o0 o. q: t
清单 13. 构建 iOS 本地应用! k* _  f% D, c" h3 v- |$ ]; n
<target name="build_iOS" if="isMac"6 {5 c/ i* z$ Y( V- J
  depends="init, build_wl_apps, prepare_iOS_build">
, G& ^+ D3 w. z         <property name="wlappdir" value="${projectPath}/apps/${appName}" /> 6 o$ v( g. V( G9 l; D
         <property name="xcodebuildCMD" value="/usr/bin/xcodebuild" />
: g' c8 `1 `2 h, z         <property name="iosPackageCMD" value="xcrun" /> " }5 p" i7 p9 p- R' [1 o2 A
         <property name="xcodebuildCMDlog" value="${outputPath}/xcodebuildCMD.log" />
. j6 d8 g; t/ A$ s4 f% @         <property name="iosPackageCMDlog" value="${outputPath}/iosPackageCMD.log" />
' y1 S6 g' F' t1 K         <property name="configuration" value="Ad Hoc" />
/ U  n! _4 X2 Z6 T" U9 \9 m+ s2 m% T* n4 _. N, l) L
<!-- 构建 iPhone native app -->
  a: s+ c8 H' B7 j2 \5 ], F         <exec / j$ v4 I! }7 p  v( B
                 dir="${wlappdir}/iphone/native"* x% u2 j3 z8 p4 S- D2 a0 o- ~
                 executable="${xcodebuildCMD}"9 I! a8 u; H1 [. J
                 failonerror="false"
" U' M1 [% a( `7 ~" {$ D6 b                 output="${xcodebuildCMDlog}"
4 b8 B4 c' {! Q  H: Y7 o, n                 resultproperty="xcodebuildCMDResult" >
9 h, s" A) ~0 W: _. B2 `" o) F
/ ~, e2 H9 F9 o! y                 <arg line=" -configuration '${configuration}' -sdk iphoneos5.1" />
8 y7 Q- M" a# o; |( R1 }         </exec>
! a; Z1 X& `! V+ `
! z  l, [+ H+ b6 O8 t         <!-- Package into IPA --> 7 `' m/ S( h1 w9 `; y. J: V: o: A) k
         <exec 8 Y5 c; H1 k' R
                 dir="${wlappdir}/iphone/native"/ a) B* K% y- D% _. Q( ?2 x- x
                 executable="${iosPackageCMD}"/ e' A- O1 ?5 n5 i+ S( G$ G
                 failonerror="false"
* _$ t0 w* s3 e                 output="${iosPackageCMDlog}"1 s6 K- C" _2 c# }5 }5 r
                 resultproperty="iosPackageCMDResult" > 0 e8 q/ z% [: N/ Q

+ e; g3 \9 ?; J; i, y' ]* [                 <arg value="-sdk" /> 8 U5 X7 J% z: [/ d2 |6 e3 Z
                 <arg value="iphoneos" />
3 R5 S. \, j+ V) l7 b                 <arg value="PackageApplication" /> 2 Z0 N& ?0 _7 b& u" N. `2 o: C1 c
                 <arg value
6 m* X4 ^: N/ K' A& P     ="${wlappdir}/iphone/native/build/Release-iphoneos/${appName}.app" /> & i6 L: X8 k0 q; H# t$ w
                 <arg value="-o" />
; L) n6 T  ]: I; u/ M                 <arg value="${outputPath}/${appName}.ipa" />
; U5 P1 B3 z# O( {                 <arg value="--sign" /> / n( ?! d* B4 l
                 <arg value="${certificate}" />
$ @* K! s  L0 V! X; i                 <arg value="--embed" /> & C3 k) q) m$ f( N4 d
                 <arg value="${provisioningProfile}"/> : l$ s. V' W" m5 ~9 i, z* G
                 <arg value="-verbose" /> " E. [* v5 V1 }' z, U
         </exec> / m3 o( O" W2 w- F- D7 w7 W2 B0 c7 u
</target>

, e; y, Z- {1 r# Z; y. j3 u$ y. Q构建 iOS ipa 应用需要指定开发者账号 provisioning profile 和 certificate,你可以在 worklight 工程根目录下的 build.properties 文件中指定开发者 provisioning profile 和 certificate。3 j/ w: s) Y+ V( M

2 p" [0 C) H. B2 Q: z% q清单 14. 指定 iOS 开发者信息, D, @: S6 _- E5 k' l( K
#iOS provisioning profile. Update this for iOS build 7 T( h' u% Q! y8 w( ^+ M
provisioningProfile=/Users/YourUser/Library/MobileDevice/Provisioning ) ^/ N* }1 p9 H% C0 s% n7 u% q
Profiles/E26327E9-A055-48A5-92A0-FB4850E335BA.mobileprovision ; s$ o0 k" ~( I7 U9 i# q
#iOS certificate. Update this for iOS build ' M. L" }! y4 R' t
certificate=iPhone Developer: Your Name (XZLU45UFKZ)
- Q9 p4 D/ t% a- J, ?% ~
Worklight 构建出的 iPhone 本地应用默认使用 Entitlements-Release.plist 作为命令行构建配置文件。如果您使用 Xcode4.3.3 执行 iOS 本地应用构建,需要将 Entitlements-Release.plist 文件中的 get-task-allow 属性值修改为 true, 否则生成的 ipa 文件将不能安装到您的 iOS 设备上。$ B. D: [, }" a

* t& E% j8 N2 S& w4 `+ F0 T; q清单 15. 修改 Entitlements-Release.plist, ^2 B0 V* E: U( P" S" C+ E
<target name="prepare_iOS_build" if="isMac" depends="init">
( }. }/ J- d, L5 o         <echo> set * W0 r+ ^7 B6 \/ H
         iOS Entitlements-Release.plist get-task-allow=true</echo>
/ R$ z. m7 }7 y" m8 H5 j    <replace file
8 I# {6 |- a0 q1 r    ="${projectPath}/apps/${appName}/iphone/native/Entitlements-Release.plist"
6 f3 j1 _* q) i2 p0 w/ ^1 m            token="false"8 ^4 u7 o$ n8 q$ I+ Z- [
            value="true"/> ! a% v8 A+ ~, r9 [
</target>
* O4 f/ X4 F) r
由于 Entitlements-Release.plist 中 get-task-allow 属性值默认为 false,且整个文件中仅有一个值为 false,可以使用 ANT 的 replace 任务按照关键字直接查找 false 替换为 true。& X+ W) Y- A3 C' `, _9 _" C, q
关于 replace 任务详细介绍可以参考 http://ant.apache.org/manual/Tasks/replace.html
; ?0 {+ e8 y0 [6 R4 D- k3 v
& `; S( e* }  R: S* K) ^& E( i) X

! z4 C2 v' w$ A$ ]$ l部署本地应用到 Worklight App Center
7 {, I. ^  t3 f, k8 k1 K打包好的 Android apk 程序和 iOS ipa 程序可以通过 Ant 发布到 Worklight App Center 上,用户能够直接访问 Worklight App Center 进行安装。在发布本地应用程序前,需要安装并启动 Worklight App Center server,请参考 Application Center User ’ s Guild 完成 Worklight App Center 安装。+ e' D+ r9 w+ i* `) k
Worklight App Center 没有直接定义部署本地应用文件的 Ant 任务,需要复制并修改位于 tools 目录中的 build.xml 完成通过 Ant 发布应用。该目录位于 Worklight 安装目录下 ${install.dir}/ApplicationCenter/tools。
: L# p, K6 h1 A9 \% n2 z为方便修改 App Center Ant 部署任务,本文直接复制 tools 目录下的 build.xml 文件并重命名为 appcenter.xml, 放置到 sample 的根目录下,如图 4 所示。4 y# [7 M3 A; o: ?2 R% q& I
) K# E6 @! g, G7 R
图 4. 添加 appcenter.xml
3 Y; C4 P2 B- a# s: g% T
* a- L4 p5 k& L. A在 build.xml 添加 Ant target 调用 appcenter.xml 进行本地应用发布。  ?/ l! G, n! r
- d  M5 K% Z5 z4 u# L* L7 g5 W1 I! e
清单 16. 调用 appcenter.xml 部署 Worklight 本地应用
0 ]- Q+ S4 y7 T& m, d2 @" X; n
<target name="deploy_to_appcenter">
# E6 _. N# v& {8 f6 s) I0 q2 r         <echo message="deploy to application center"/>
, J; w  ?( r+ b0 [         <ant antfile="${projectPath}/appcenter.xml" target="upload.AllApps"> ! [; n! \( l0 A; d- `& N
                 <property name="server.path"! z0 e1 ?' q$ Q2 V+ t6 m4 \9 T* b% w
                  value="http://${appCenterHost}:${appCenterPort}"/> * T: b! `2 _- H  d. c
                 <property name="context.path" value="${appCenterContext}"/>
* j% u# b1 ^' m1 Y0 R% q                 <property name="install.dir" value="D:/workLight/Worklight"/> % }* n$ L  `# @" s" u. I# P
                 <property name="workspace.root" value="${outputPath}"/> ! |! g' ?0 F/ Q6 a1 Y9 i* o. P0 Q( h
                 <property name="login.user" value="demo" />
; O3 |$ d, X( b" |% i+ V9 q  ?                 <property name="login.pass" value="demo" />
8 H) W* f% G, b% k         </ant> # G' d2 i6 C. k& G* \5 W
</target>
' \( K) d6 c) o  h$ H4 M
2 ]3 M1 {* M  l' p/ j
表 7. 调用 appcenter.xml 属性说明. m* Y7 d! I$ c& B8 I8 o4 S
属性描述默认值
server.pathWorklight App Center 服务器地址http://localhost:9080/
context.pathWorklight App Center 服务上下文路径applicationcenter
login.userApp Center 访问用户名appcenteradmin
login.passApp Center 访问密码admin
install.dirWorklight App Center 部署工具目录
workspace.root需要发布的本地应用父目录
  Q5 [1 `+ Z# D0 P0 F

( p  }1 s: M. B3 e5 R

8 e6 V2 a" w( V2 I结束语
5 j% f4 M$ j, `. e0 U- i关于 IBM Worklight 自动化构建和部署的介绍到此就结束了,希望本篇文章能够对使用 IBM Worklight 在开发中进行自动化构建、部署有所帮助和启发。
( a# ?  O4 r! X1 n) L
6 K2 p6 L1 {- h+ H7 s" N6 T

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
 楼主| 发表于 2013-2-17 10:38:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2018-12-11 02:46 , Processed in 0.145197 second(s), 6 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表