SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2670|回复: 1

[推荐] Worklight 自动化构建

[复制链接]
发表于 2013-2-17 10:29:38 | 显示全部楼层 |阅读模式
本帖最后由 技术狂人 于 2013-2-17 10:37 编辑
1 P7 i7 S* I: V# y! r  ~6 A, V! d+ g* ]' E  P( u3 t
Worklight 简介
! B6 i5 R6 U9 H/ t0 nIBM® Worklight® V5 是一种领先的移动企业应用程序平台 (Mobile Enterprise Application Platform, MEAP),利用该平台,IBM 可以跨其产品组合扩展其整体移动能力。如何写 Worklight 应用程序请参考文章 使用 Worklight,第 1 部分 : 开始使用您的第一个 Worklight 应用程序
- B2 R4 {: I. g
* k6 O6 _. y$ s- M7 b# |( Z

6 c" v+ a- @6 p2 j/ u& ^7 iApache Ant 基础知识
! D+ z& \, s2 B7 q, p$ JApache ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。更多关于 Apache Ant 的内容请参考 Apache Ant 手册4 [" J0 B# Q$ I5 Q0 y

: L+ K( l5 ]: b# T+ }; z% L
% c/ d1 O* O) ?+ o$ ?9 q( f' i
Worklight Ant tasks 介绍
) X4 S: @  ~2 |" |( ]# h: w3 w# vWorklight 为了方便开发者自动构建个部署 Worklight 适配器和应用程序,创建了几个 Apache ANT 任务,app-builder、 app-deployer、adapter-builder、adapter-deployer、war-builder。* |; J, D) q. p% d+ c4 V0 T
声明 worklight ant 任务8 P2 u2 X* X1 D: K/ {2 j/ s% x
Worklight Ant 构建工具包中定义了用了执行构建和部署的 Ant 任务,在使用这些任务前,我们需要将 worklight-ant.jar 文件加载到 classpath,并引用 com/workight/ant/defaults.properties 声明 Ant 任务。* D, F; u5 A8 k1 z. ]  m3 d4 g

. f4 ?) N0 s" R清单 1. 声明 Worklight Ant tasks$ Y7 C7 }" w" H/ ?2 r8 x) N7 I' f
<taskdef resource="com/worklight/ant/defaults.properties">
2 g3 |+ \8 \' y* u: I    <classpath> 2 {; K, ]+ e) r5 V
        <pathelement location="${buildToolDir}/worklight-ant.jar"/>
! ?7 c5 h1 C$ V$ u% s; a    </classpath> $ a0 F2 G: A" e0 d
</taskdef>
* P# M5 Q4 N* U/ q9 c) f( ?6 W+ R
构建 Worklight 应用
$ b1 X$ o1 _0 [4 k+ @" jWorklight Ant 构建工具包中定义 app-builder 任务用于构建 Worklight 应用。6 t- U' u. C0 T8 b' F8 B/ V
$ p- N6 ~- r2 |5 ~
清单 2. 构建 Worklight 应用
) Z) O( q0 ~1 p  z5 }  S
<target name="build_wl_apps" depends="change_Server_IP"> ( k( X6 s1 y7 Z% D( G1 q) F# u7 E
    <echo>build_wl_apps ${projectName}</echo> " N& Y' p9 Z, W- S2 l* W# D
    <delete dir="${outputPath}"/> + i$ M1 h' g3 J
    <mkdir dir="${outputPath}"/>
! ~5 f2 j; P1 w  Y2 H) n  O- R    <record name="${outputPath}/build.log" loglevel="verbose"   append="false"/>
3 o2 n1 v. ?$ `! \    <app-builder nativeProjectPrefix="${projectName}_" : _  G7 w; j5 v2 Q
    applicationFolder="${projectPath}/apps/${appName}" outputFolder="${outputPath}"> 9 ?2 N# a+ z9 A) ~
    </app-builder>   |/ |$ d$ n) A) u
</target>

- r3 B3 e8 e1 i% s7 b表 1.app-builder 属性说明
( J, J* F; B6 }) M# v: Y/ Y# F
属性描述默认值
applicationFolderWorklight 应用程序的目录build.xml 父目录 . 如果失败在根目录下寻找包含 application-descriptor.xml 文件的目录作为默认值
environments用逗号隔开的应用环境如:common, android,iphone所有在应用程序里的环境
appsBackupsFolder指定备份应用程序的目录Worklight 应用程序的目录的父目录
concatenate是否连接 web 资源
minifyResources是否最小化 web 资源
nativeProjectPrefix本地应用的前缀 3 X" d0 [4 d0 Z% u( I' B
  当使用 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让设备在应用中可以单点登录
2 Q( h/ \- g+ D8 I4 T
false
- }% v- n! k% j1 Q3 I% U* b
部署 Worklight 应用
' f# H; b& b. F, N7 c) gWorklight Ant 构建工具包中定义 app-deployer 任务用于部署 Worklight 应用到 Worklight Server。: j3 l' T( M5 a7 t8 Y

1 t5 ]6 h6 p2 Y1 a$ ~) j% _' d清单 3. 部署 Worklight 应用; ]# v: N8 {* q: T2 a4 t. E' P
<app-deployer deployable="${outputPath}/${appName}-all.wlapp"! f, d2 }* [6 m1 A" I% O
worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>
# r$ d& c( w, _3 c! M
1 B! b9 J3 G* v7 L
表 2.app- deployer 属性说明
: b4 ^1 z6 ?; _) Q, {, o( _- D
属性描述默认值
worklightServerHostWorklight 服务端的 URLapplication-descriptor.xml 里 worklightServerRootURL 的值
deployable.wlapp 文件的路径
( N6 E+ @6 \* g' C2 U5 X$ f
构建 Worklight 适配器4 Z# B! r5 h$ F* I7 K0 s0 K7 Y# K  F
Worklight Ant 构建工具包中定义 adapter-builder 任务用于构建 Worklight 适配器。
; c7 O7 v: b. n% L2 \: M4 d
* l/ v9 h/ N6 E+ Q/ J清单 4. 构建 Worklight 适配器
3 ]4 X+ e; r" ^& j& j3 ~
<target name="build_wl_adapter"> 8 H5 H3 P2 B; J1 m! g+ w1 \
    <echo>build_wl_adapter ${projectPath}</echo> - y1 H) M- t- D& O5 M6 S$ }
    <record name="${outputPath}/build.log" loglevel="verbose" append="true"/>
  L6 Y4 z* p# E5 R4 U$ m% {2 E6 G2 G  A    <adapter-builder folder="${projectPath}/adapters/${YouAdapterName}" 7 w' \$ y4 s' b" o; b
    destinationFolder="${outputPath}">
7 r" V8 z% |" e1 J9 ]    </adapter-builder> / S! P; W; T- v: L
</target>
( B% F  K7 a0 H
$ B) |* a* n) {' k) r" C
表 3. adapter-builder 属性说明
2 D" ^/ M- c2 a5 G( r9 g6 m
属性描述默认值
folder适配器源代码所在的目录
destinationfolder指定适配器输出目录

9 f$ {; f4 h# P0 e- T4 I& v部署 Worklight 适配器6 X/ {% p2 _2 b* V& q
Worklight Ant 构建工具包中定义 adapter-deployer 任务用于部署 Worklight 适配器到 Worklight Server。8 J' Z5 `7 D' Q- r* P) Z
$ A- v+ t/ Y) ]; O
清单 5. 部署 Worklight 适配器2 P" ~( {0 z- h  n' o" l! n, i& R
<adapter-deployer
% H% ?; B: O1 e deployable="${outputPath}/WorklightStarterAdapter.adapter" . i% X& F5 m7 h2 _( D  k
   worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>

, A# x7 @. f' v1 v* X7 \2 b- J1 A8 `$ a- m7 f* ^
表 4. adapter-deployer 属性说明  E( x: n6 v: V8 s8 }3 s9 N
属性描述默认值
worklightServerHostWorklight 服务端的 URL application-descriptor.xml 里 worklightServerRootURL 的值
deployable.adapter 文件路径或者他的父目录

- ]: Y" k0 k2 x* p* m# d( N构建 Worklight 控制台服务" C$ D& O: K  Q7 a6 G3 e
每个 Worklight 应用可以构建出一个 .war 文件用于提供 Worklight 控制台服务,构建出的 .war 文件能够部署到 Web 服务器上,比如 Jetty,tomcat 和 Websphere Application Server 等。Worklight Ant 构建工具包中定义 war-builder 任务用于构建 Worklight 服务。; X8 {9 r' d0 W# {5 p5 R

. N  S  @& K) I$ K7 B3 n3 `清单 6. 构建 Worklight 控制台服务
) n  N8 [2 X* c+ K) O! a
<target name="build-wl-war" depends="clean, compile-JavaSources"> ( N+ J! }3 C" v$ a7 f+ M% j
    <war-builder projectfolder="${project.path}"  3 k  b: D: O5 r2 g
    webxml="resources/war/web.xml"
7 q5 H0 m0 X9 b% n5 I6 k classesfolder="${java-classes-dir}" destinationfolder="${artifacts.dir}">
  `' ]" d+ m8 ~$ [: M <fileset dir="resources/jsp"/> * p( C. b# B3 D* x  y& d5 |0 ~
    </war-builder>
% W/ @4 [. j$ Y5 j6 R6 D; u </target>

. d: \# F1 P# N1 R. c! j' p0 j2 V9 _, l
表 5. war-builder 属性说明
  u, E1 I4 a* G, q! o
属性描述默认值
projectfolderWorklight 项目的目录
classesfolder.adapter 文件路径或者他的父目录
destinationfolderWorklight 项目 war 文件放置的目录
webxml设置 Worklight 项目的 web.xml 文件/war/web.xml
* h! t- R) |" P
部署 Worklight 服务端到 Websphere Application Server3 @: e6 T  U+ Y. y: m* `
采用 websphere 提供的 ant 任务来实现部署 worklight 服务端的 war 文件到 websphere,通过 python 来自动配置 worklight jee jar, 在 sample 里提供了一个 python 文件 changeConfig.py, 通过这个脚步文件会创建一个共享类,然后把这个共享类添加到 worklight server,设置类的加载顺序为 PARENT_LAST。
+ C+ A# F/ p) j. F0 B; `  q9 B2 p, s; ?. m+ U% T, ~
清单 7. 设置共享类和类加载顺序的程序清单如下
% m3 R) |: |+ K7 ^
<target name="saveConfig" description="save Config"> 4 H  W7 T# i5 j' F) s
    <taskdef classname="com.ibm.websphere.ant.tasks.WsAdmin" name="wsAdmin" />
& P5 f6 Y* S- x1 e" W8 V$ y/ `        <wsAdmin host="${was.hostname}" conntype="${was.conntype}"% ^1 P8 b5 K) n+ n4 j% @! X
                 lang="${language}" port="${was.hostport}" washome="${was.home}"
1 R. R6 _# G4 T# l1 O! A, j                  user="${was.username}"
) u, s7 ~" f2 @                 password="${was.userpassword}" script="changeConfig.py">
( y, }  c% n' [4 W+ X2 X) R                 <!-- worklight shared lib name -->
* I+ c7 u: `/ J+ j: V                 <arg value="${config.websphere.sharedlib}"/> " G7 s0 @& j* W- |7 w2 @
                 <!-- worklight shared lib path --> ) W3 }6 d8 z0 t$ ]: g0 R3 ^
                 <arg value="${config.worklight.jee}"/> ' @$ k$ n9 X1 S% t2 v& W3 K
                  <!-- worklight server 的名字 -->
1 ~# w7 U5 T" B6 I' v! a. K9 ]                 <arg value="${projectName}"/>
( p, l' k& `' N. k3 t" I6 y                  <!-- Websphere 节点的名字 --> * E3 q6 E: T/ P6 g. \( k6 B
                 <arg value="${config.websphere.node}"/> % T2 G4 i" I+ s. g, ^1 @; G
                  <!-- Websphere 服务器的名字 -->
* ^0 q! @! F5 z" z2 Q" @1 N8 Z                 <arg value="${config.websphere.server}"/>
, F. H2 ^7 P5 v% ? </wsAdmin> 7 C/ Q9 |8 R- K8 f7 j/ i
</target>
7 A# I7 N  {- a2 j
在 build.xml 文件里还提供了 uninstallapp, installapp, startApp, stopApp 等任务,这些任务在 Windows 上需要使用 ${WAS_HOME}/bin/ws_ant.bat 来运行,在 Linux 上需要使用 sudo ${WAS_HOME}/bin/ws_ant.sh 来运行。
' \% E0 {/ Z& m比如你可以使用下面的命令来运行 saveConfig:
: O5 n1 S/ J3 a* G( L
  • 把附件中的文件解压到到你的 worklight 项目的根目录下面
  • 修改 application.xml, 用你的项目的名字替代 WorklightStarter_jQueryMobile
  • 修改 build.properties 里和 Websphere 相关的项目,根据你自己的环境
  • 打开 cmd,把当前目录设置为你的项目的目录,然后在命令行里输入 ${WAS_HOME}/bin/ws_ant.bat saveConfig
    $ s9 i& [9 K! M


2 r, k& H  R/ a! B$ m8 i  _- M
2 o1 L  F: J) G5 o% b8 L" r- B, hWorklight App 本地应用构建  i$ s( w) A! `! |. Q$ F
完成 Worklight 应用构建后,在 Worklight 环境文件夹中会生成对应的本地应用目录,对应文件夹名称为 native。本节以 Android 和 iPhone 环境为例展示如何通过 Ant 脚本构建生成 Android 上的 apk 安装文件和 iPhone 上的 ipa 安装文件。
' m' r8 ~7 t! w2 H% n1 DAndroid 本地应用构建) f  {& d( P+ m3 y3 D
Worklight 的 Android 环境本地应用目录中不包含用于 Ant 构建所需要的 build.xml ( 文件位置是 ${projectPath}/apps/${appName}/android/native/build.xml),需要使用 Android SDK 中的 android 工具更新工程并指定用于编译的 Android 平台。. o$ ~9 `$ y7 ?
0 M2 x* A6 p% r' M7 R
清单 8. 生成 Android 本地 build.xml 文件. p7 P* L' ^, f2 J; E9 n9 M
<target name="prepare_android_build">
: f5 V9 `7 y  X( l; T! R* ~    <!-- on windows -->
6 t" _9 {9 J- R* ]. C5 O/ @$ @    <exec executable="cmd" osfamily="windows">
4 l+ ^7 v8 H8 j5 U: t4 O5 j, S! R        <arg value="/c ${androidSDK}/tools/android.bat update project
9 E6 c+ L  F1 B2 ]/ i        --path ${projectPath}/apps/${appName}/android/native --target 0 P2 e% y7 g; f0 d
         android-8"/>
$ \' \0 K. L2 j- V; B    </exec> + h5 M# g/ W" `6 z# I! L7 h6 h
    <!-- on linux and Mac --> & N5 e  W$ M2 ?1 s* F4 {0 x
    <exec executable="/bin/sh" osfamily="unix"> ) ]0 R9 P# n' Z4 ~0 K
  <arg value="-c"/> 8 D/ m, ~# T2 P( ?
        <arg value="${androidSDK}/tools/android update project
& L4 `# H. t( X, v        --path ${projectPath}/apps/${appName}/android/native
$ ]! ?# L( ~/ l9 z, x' z! A        --target android-8"/>
( v2 p6 @0 d' _, v1 i# E" {2 }    </exec> ) J1 c8 H" r6 U( E
</target>

  j# X7 |% x& X$ e5 U/ w5 j* r0 u& r6 e4 k
表 5. android 属性说明
4 j. R' N) e" k) H5 Q; h
属性描述默认值
pathAndroid 本地工程位置
target构建 APK 的 SDK 平台,例如 android-8
: x) d2 i+ a' S% C  ?: K4 }( `
需要注意的是在 windows 平台下运行”cmd”命令并执行 android.bat 进行更新,而在 linux 平台和 Mac 平台下运行”/bin/sh”并执行 android 进行更新,更新后的 Android 工程文件夹中将产生用于 Android apk 文件构建的 build.xml 文件。如图 1 所示。
) k7 O( `7 O, \1 I1 |1 A! C+ l$ |0 n- B, ]" t0 U& g2 S' w. W
图 1. 使用 Ant 更新 Worklight Android 本地应用工程
1 [6 e7 y( F4 M4 @5 D' b2 I0 \+ N: s
检查更新后的文件夹结构,确保 Android 工程目录中产生 build.xml 文件,如图 2 所示。: c* ^) Y0 B/ I( \* p

; D1 l, H  V. k& M4 I$ Y# L图 2.Worklight Android 本地应用工程构建文件:
4 P# r2 r, h0 j; L/ s2 _% M# {% [2 A* L& x0 x* x- }- p& t. I. \8 ?0 ~
然后通过生成的 build.xml 进行 Android 本地 apk 文件构建。
' S0 H& U3 Q" A1 ^3 B# M+ L* v' `9 B$ t; l$ M$ n
清单 9. 构建 Android apk 应用
8 c" B; a# }: x6 S& d- W
<target name="build_android"
2 x8 g% p2 ?$ j& b& T, w% @  depends="build_wl_apps, prepare_android_build">
$ ~: E& `5 e+ b: Y5 H' J, f  N    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"3 q+ I, f' p! j5 O! M4 |$ O
     target="debug" useNativeBasedir="true"/> : j+ O) k& B/ s" M9 W5 d
    <copy todir="${outputPath}">
! w. J2 J$ U. b$ g. A( ^( Y' U& \        <fileset dir="${projectPath}/apps/${appName}/android/native/bin"> 5 V- L/ z- r  |7 e, w  H' P& v
            <include name="${appName}-debug.apk"/>
( j# x' ^; e( r; d" T; m( _        </fileset>
- h$ p4 Q8 X" }    </copy>
1 \& L7 l  i' W: L- n" r </target>

8 v, Y( K, g% n" b
9 B7 d* V; _$ g表 6. 构建 apk 属性说明
/ v, q# [( p& n0 N! X
属性描述默认值
antfile取值为更新 Android 工程后产生的 build.xml 文件路径
target Apk 文件构建类型,取值为 debug 或 release1 m& {5 q9 Z8 D, I' g& \
  debug:Debug 版本 APK
' ~* R5 r$ f$ ~$ @  release:Release 版本 APK,需指定签名文件。
useNativeBasedir使用 Android 本地工程文件夹作为 build.xml 的 basedir- N- J1 G2 c' A
取值为 true 或 false
false

" z( @2 ]) V# ~% j构建完成后 apk 文件保存在 Android 工程的 bin 文件夹下,可以通过 ANT 的 copy 命令将其复制到统一的输出文件夹中。7 Q9 c. ~- [# E" F, m, x! q5 y; C
如果需要构建出 Release 版本的 APK 文件,请修改 target 参数值为 release,并在 Android 环境 native 文件夹中添加 build.properties 文件指定签名文件路径和对应的密码。
2 {: d$ g& s- l3 S
$ B* Y5 m  z4 ~8 D1 i$ z! m- `清单 10. 构建 Android apk Release 应用
3 @- n( h6 ?2 a+ P5 I
<target name="build_android" depends="build_wl_apps, prepare_android_build"> * {) K+ m3 d) Y& v9 e0 X
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"4 \8 ]9 e. M3 ~5 C( c
     target="release" useNativeBasedir="true"/>
1 _& b1 I& Q1 ?# H, R& m0 r% q' o    <copy todir="${outputPath}">
( V- d* [3 y# P  @( L* K* |        <fileset dir="${projectPath}/apps/${appName}/android/native/bin">
6 u, B0 m; s! k3 T            <include name="${appName}-release.apk"/>
% ], x" i* H+ E2 d  v        </fileset> 7 n2 \$ f2 t' p9 m9 G
    </copy> . y* ?! o  C' a6 Q7 m/ D+ Y
</target>

4 y( N, H( o0 g' y添加 build.properties 文件到 Android 环境的 native 文件夹 , 如图 3 所示。9 U4 e" {/ v. @0 N- k! T3 O3 ?
! s# `9 ^# x0 U1 m2 t
图 3. 添加 build.properties 到 android 环境 native 文件夹
! `7 O2 z. ?6 Q% y1 F; T6 X1 U
: y& E8 F8 q  {1 L4 F& D: q/ f* H使用在 Eclipse 中使用“导出 Android 应用”功能创建您的签名文件并设置密码,然后在 build.properties 文件中指定签名文件路径和对应的密码。3 O8 S6 j8 @5 ?1 ~2 Y
5 f, M/ N; p0 f# W+ C) m) R
清单 11. 设置签名文件信息
7 ?/ _( t% U& f7 y$ v; g
#Android 签名文件路径 , 例如 D:\\workLight\\AndroidKey\\key.keystore
) Y* z4 X# B. r( {5 ~- M( L: Z key.store=YouKeystore + ?+ P$ j  \' {* I* \" N; b
#Android 签名文件别名 , 例如 export 8 B; C) H" L; W2 Q( l  c; |
key.alias=YouAlias : Y- r6 x# U# ?/ I( `, \
#Android 签名文件密码) O$ o  @7 i; C/ j5 u
key.store.password=YouPassword + }& ?" o' w2 N! l9 H$ m
#Android 签名文件密码4 K7 S! D: j9 P' b% \# n
key.alias.password=YouPassword

* ^( U5 O0 \' V2 biOS 本地应用构建; v+ `! V* j4 _! ]
构建 iOS 本地应用需要有一台 Mac 并安装 Xcode,本文使用 Mac OS x 10.7 和 Xcode4.3.3 进行 iPhone 应用构建。为了确保 Ant iOS 构建任务是运行在 Mac 平台上,您可以使用 Ant 来检查运行平台是否符合条件。本节添加一个 Ant target 来检查当前运行平台。
" w2 k8 h8 x) [9 a' s- `. c, t2 g" v# [; d7 N
清单 12. 检查 Ant 运行平台信息" x! I4 l) B3 @
<target name="init">
5 s$ W7 }0 J* O; G         <condition property="isWindows"> $ [, M1 b$ A) {; q' v; C' V
                 <os family="windows"/> % ?; }) G% A& o' r6 X& E
         </condition>
4 o7 a( ~* E, ~* W1 L$ h         <condition property="isMac">
1 J  b0 u. j! _3 R, j4 Z: B                 <os family="mac"/>
/ J: m# s& F  ]. I8 z         </condition>
5 }% v3 P7 n4 {1 l3 f         <condition property="isLinux">
. X; u9 K- @& x6 u9 y  A                 <os family="unix"/> 9 X8 s5 s( v) M) K
         </condition>
  ]0 B* Q  c1 C. a2 r </target>
( M% g; U# B1 L
执行 ant init,当前的运行平台信息会保存在对应的变量中,检查平台是 Mac OS 后就可以进行 iOS 本地应用构建。iOS 目标任务构建包含两部分,构建本地应用和打包本地应用为 ipa 文件。完整的 iOS 构建程序清单如下。
+ p- T4 E) {8 f; L+ I& W5 l8 w0 b! B. m, d* T( z9 H
清单 13. 构建 iOS 本地应用
3 ]7 s5 f+ t! ]7 q+ e9 Y
<target name="build_iOS" if="isMac"0 @$ w8 T! g7 a  `0 Y& ?
  depends="init, build_wl_apps, prepare_iOS_build"> ' C" x6 M. _9 g* t1 K8 d! X1 ~
         <property name="wlappdir" value="${projectPath}/apps/${appName}" />
9 Q$ N2 m5 g" N5 r0 T         <property name="xcodebuildCMD" value="/usr/bin/xcodebuild" />
8 {; n& A, g* E         <property name="iosPackageCMD" value="xcrun" />
. w# x+ u# j  V0 Y4 ]         <property name="xcodebuildCMDlog" value="${outputPath}/xcodebuildCMD.log" />
* n$ r9 F4 Q# y6 A( W         <property name="iosPackageCMDlog" value="${outputPath}/iosPackageCMD.log" /> ( O2 V9 Z4 e/ O& `* \
         <property name="configuration" value="Ad Hoc" />
! U3 Q) ~# ?4 o& @. v
3 x! _0 E2 @. b' O <!-- 构建 iPhone native app -->
/ _; L( D) @8 w         <exec
2 }8 G+ l: ^0 t) \                 dir="${wlappdir}/iphone/native"3 @" I0 N; t4 h3 [0 }
                 executable="${xcodebuildCMD}"& }+ t  b, \4 _% l+ {6 \
                 failonerror="false"
7 h* I) n$ N: K+ R                 output="${xcodebuildCMDlog}"/ }" M5 u7 W- e, F" i7 ^
                 resultproperty="xcodebuildCMDResult" > 6 }& |! Z$ M$ e4 `: g
) b8 ~; m- a7 @/ }, u2 O6 C5 U* |
                 <arg line=" -configuration '${configuration}' -sdk iphoneos5.1" />
% M: @1 A. _$ H. l) O         </exec> , m- t1 e' N. Y' x

0 Q9 m8 t3 A6 j5 N4 ?- k         <!-- Package into IPA --> 4 |( m+ D1 I- U: S; @- H. c7 ?
         <exec
" i& v- Q4 w+ H, l                 dir="${wlappdir}/iphone/native"
- F8 {  h0 T1 h2 G) [                 executable="${iosPackageCMD}"
  X! X* j: Q+ Y, X( o" p                 failonerror="false"
" V1 M+ C) {2 g, s  ~2 ^4 K- ~+ y                 output="${iosPackageCMDlog}"6 }0 L2 [7 A3 p, g& e! C
                 resultproperty="iosPackageCMDResult" > 5 }% p! e2 S1 O! Q- X
1 F4 u( M5 h, J8 w% G3 E2 z4 O3 K
                 <arg value="-sdk" />
1 _( j5 ?6 `' t, ?* d$ s2 r4 r. U0 @4 x                 <arg value="iphoneos" /> ' Q+ [5 h* }* d
                 <arg value="PackageApplication" /> - f/ b) J* Z( e, g4 m7 P
                 <arg value
1 a* K; ]' H7 Y' O. x     ="${wlappdir}/iphone/native/build/Release-iphoneos/${appName}.app" /> ; E& L) _1 v4 z% l  H- F: V
                 <arg value="-o" /> 7 T. ?+ ]1 R: o9 ~' h
                 <arg value="${outputPath}/${appName}.ipa" /> 5 a* F2 P' M4 D* Q# z3 I/ h- E! \
                 <arg value="--sign" /> 3 z4 I. W$ E) w' }9 b
                 <arg value="${certificate}" />
' N% Q9 m- g) f* |                 <arg value="--embed" />
7 x" N0 y: X4 R( T0 d                 <arg value="${provisioningProfile}"/>
$ t: a* b: k/ [7 O                 <arg value="-verbose" />
4 w0 g+ a8 T* Q  a( |, x5 N         </exec>
/ _' g/ ?# f; u8 ?: v8 i- { </target>

4 h3 q( b2 u! Q, t1 D# u& G$ o构建 iOS ipa 应用需要指定开发者账号 provisioning profile 和 certificate,你可以在 worklight 工程根目录下的 build.properties 文件中指定开发者 provisioning profile 和 certificate。8 Q: \2 M# a# d
5 }/ [# S7 W7 X+ X0 `8 n3 A
清单 14. 指定 iOS 开发者信息. k$ Z+ X8 j2 O4 f7 \! Y
#iOS provisioning profile. Update this for iOS build $ {# t  ^* y) \4 X4 k) M
provisioningProfile=/Users/YourUser/Library/MobileDevice/Provisioning ' Y8 F% ~. l# i3 e% M
Profiles/E26327E9-A055-48A5-92A0-FB4850E335BA.mobileprovision
& T: f$ Q: w# [9 k- U #iOS certificate. Update this for iOS build ( n0 D- F& ~( L% V! q) \
certificate=iPhone Developer: Your Name (XZLU45UFKZ)
% w& X$ n2 f  C+ x% {
Worklight 构建出的 iPhone 本地应用默认使用 Entitlements-Release.plist 作为命令行构建配置文件。如果您使用 Xcode4.3.3 执行 iOS 本地应用构建,需要将 Entitlements-Release.plist 文件中的 get-task-allow 属性值修改为 true, 否则生成的 ipa 文件将不能安装到您的 iOS 设备上。  T) ]9 R6 a: f/ v; G- L

. D2 q$ J5 W: I4 ?清单 15. 修改 Entitlements-Release.plist4 M  x' k) X/ K! E6 v* @- D) R
<target name="prepare_iOS_build" if="isMac" depends="init">
! R& t$ x. z- n9 C         <echo> set
) c9 T; O, z$ M$ `         iOS Entitlements-Release.plist get-task-allow=true</echo>
+ c. s- Y. B1 j+ D+ |/ p2 |    <replace file
! u0 x+ P9 R. x  W- p; g    ="${projectPath}/apps/${appName}/iphone/native/Entitlements-Release.plist"2 i# b! x& v" k; D6 {  _: R( o
            token="false"
1 y& o0 T) c8 `% Y3 B+ N" p" j5 Q& A8 t            value="true"/>
  o2 L; u- P/ o1 L </target>
  z7 g' B" G8 E, d1 R2 P
由于 Entitlements-Release.plist 中 get-task-allow 属性值默认为 false,且整个文件中仅有一个值为 false,可以使用 ANT 的 replace 任务按照关键字直接查找 false 替换为 true。
$ L. ?* d8 P$ |, \1 a7 l) g" a关于 replace 任务详细介绍可以参考 http://ant.apache.org/manual/Tasks/replace.html' P4 v  p1 P1 D& {3 Z. s  b/ ?

3 {8 y! m8 Q' ~  M
  B5 w, U% s6 ^  Z& T
部署本地应用到 Worklight App Center
' F* ?+ T! k$ }/ p% i打包好的 Android apk 程序和 iOS ipa 程序可以通过 Ant 发布到 Worklight App Center 上,用户能够直接访问 Worklight App Center 进行安装。在发布本地应用程序前,需要安装并启动 Worklight App Center server,请参考 Application Center User ’ s Guild 完成 Worklight App Center 安装。
# i5 e3 n4 X2 q% S4 xWorklight App Center 没有直接定义部署本地应用文件的 Ant 任务,需要复制并修改位于 tools 目录中的 build.xml 完成通过 Ant 发布应用。该目录位于 Worklight 安装目录下 ${install.dir}/ApplicationCenter/tools。- T% z- V9 p4 a/ ^
为方便修改 App Center Ant 部署任务,本文直接复制 tools 目录下的 build.xml 文件并重命名为 appcenter.xml, 放置到 sample 的根目录下,如图 4 所示。
8 f9 j/ X: {+ m: C5 J  Q
+ u, y0 j; ~% K图 4. 添加 appcenter.xml
8 A/ \. d, C* V  O
7 R9 L  V$ W9 y+ W3 B, t在 build.xml 添加 Ant target 调用 appcenter.xml 进行本地应用发布。
  s& o) h5 R4 {# ]' a5 X" R5 i- ~5 L* Y' o
清单 16. 调用 appcenter.xml 部署 Worklight 本地应用
/ b( R) V5 D  m
<target name="deploy_to_appcenter">
6 s; L4 a7 D8 L, D' i         <echo message="deploy to application center"/>
# K) n$ V+ e0 ?         <ant antfile="${projectPath}/appcenter.xml" target="upload.AllApps"> ( c) G4 ]  Y- _( G8 l. D! J& ]
                 <property name="server.path"
7 ]+ E: v. m* {/ G                  value="http://${appCenterHost}:${appCenterPort}"/> + r% l$ s: q$ T1 ~" f& C
                 <property name="context.path" value="${appCenterContext}"/> * P! w/ f* {8 W4 C0 Z) U
                 <property name="install.dir" value="D:/workLight/Worklight"/> / J% m& e3 `" S* _* |& [: B$ {
                 <property name="workspace.root" value="${outputPath}"/>
! `. N* \* }! a& U/ g                 <property name="login.user" value="demo" />
; a4 C" S3 S# o7 \  R& o+ c                 <property name="login.pass" value="demo" /> ) v1 }4 m, ]9 R. d" S/ x# m# K
         </ant>
+ n. C7 |) b8 P6 P </target>
( q  u& I7 f' G9 x( s( L" [. B9 F  Y
6 P1 `$ l) s: @9 @/ x& \
表 7. 调用 appcenter.xml 属性说明) W. D! ]2 B) E
属性描述默认值
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需要发布的本地应用父目录
, Q* k% z) g+ Q8 a0 `2 L


1 [7 p; o- W: G8 H" H- Y3 L* {7 p4 _
结束语
  H7 Q& Q, F& o8 B关于 IBM Worklight 自动化构建和部署的介绍到此就结束了,希望本篇文章能够对使用 IBM Worklight 在开发中进行自动化构建、部署有所帮助和启发。4 U& \6 L8 ~2 D0 H9 I' N

3 J4 T; T1 d- ^- {  J- Z' G

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-1-18 00:12 , Processed in 0.085835 second(s), 6 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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