SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3287|回复: 1

[推荐] Worklight 自动化构建

[复制链接]
发表于 2013-2-17 10:29:38 | 显示全部楼层 |阅读模式
本帖最后由 技术狂人 于 2013-2-17 10:37 编辑
* Q9 F' O6 [0 y0 p; \9 ~
1 n7 t5 y; E0 a$ d1 cWorklight 简介8 g/ c9 `: h# \6 ^% ]+ L) r
IBM® Worklight® V5 是一种领先的移动企业应用程序平台 (Mobile Enterprise Application Platform, MEAP),利用该平台,IBM 可以跨其产品组合扩展其整体移动能力。如何写 Worklight 应用程序请参考文章 使用 Worklight,第 1 部分 : 开始使用您的第一个 Worklight 应用程序
! ^& C, }& @% B  M9 x0 r& _. W7 X, i

& S5 o- `* I# Z- \, Z  J. e
$ X8 M; K* R; MApache Ant 基础知识
* m/ _  m0 T% E! n9 W) WApache ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。更多关于 Apache Ant 的内容请参考 Apache Ant 手册
5 g2 H# u) _+ {6 T) H

& {9 k! {) T# D6 m( t6 U- \( Q" F
Worklight Ant tasks 介绍
: |% X. j- ^3 B3 `Worklight 为了方便开发者自动构建个部署 Worklight 适配器和应用程序,创建了几个 Apache ANT 任务,app-builder、 app-deployer、adapter-builder、adapter-deployer、war-builder。
! F9 c3 s2 R+ p0 @3 M: o" o声明 worklight ant 任务
7 b" h" w7 B' ]: r' S6 {8 NWorklight Ant 构建工具包中定义了用了执行构建和部署的 Ant 任务,在使用这些任务前,我们需要将 worklight-ant.jar 文件加载到 classpath,并引用 com/workight/ant/defaults.properties 声明 Ant 任务。" |- x$ x; R' [" G: m3 s5 Y: V
7 Q6 Q6 o7 h6 z/ O9 `& t5 r
清单 1. 声明 Worklight Ant tasks
( d$ E8 [" ]! a
<taskdef resource="com/worklight/ant/defaults.properties">
/ d- V& e2 ?  L* D1 L+ `    <classpath> 1 s6 v& Q5 ^* V8 M* O( S5 K! c
        <pathelement location="${buildToolDir}/worklight-ant.jar"/> : {" U# D. z$ m7 s$ C- l: x6 [
    </classpath>
. q) b" h- y3 C3 ? </taskdef>

+ E8 n  b* K: U5 ^% M构建 Worklight 应用, \8 ?2 ~- F6 K- W+ s6 ~
Worklight Ant 构建工具包中定义 app-builder 任务用于构建 Worklight 应用。; J" c6 v! ], ^6 L3 k
) p/ [2 d4 Q* x1 ~' W: i
清单 2. 构建 Worklight 应用, ~6 y, k* x  a) h* Q6 q
<target name="build_wl_apps" depends="change_Server_IP"> # o7 t* \$ }( A5 H
    <echo>build_wl_apps ${projectName}</echo>
' b6 I( E1 \: d9 z$ p2 e    <delete dir="${outputPath}"/> . I& l( {) d. m
    <mkdir dir="${outputPath}"/> . ]+ ^" M! B% [. Z3 J2 R
    <record name="${outputPath}/build.log" loglevel="verbose"   append="false"/> * `% O3 c0 s, @+ e) |+ `
    <app-builder nativeProjectPrefix="${projectName}_"
$ s2 s$ t0 b  F  N- J+ h1 {    applicationFolder="${projectPath}/apps/${appName}" outputFolder="${outputPath}">
$ ]6 I- G: s: c( i3 i# o/ W! p- s    </app-builder>
& o7 g4 B: B6 N </target>
2 g: s" r: `$ K& E
表 1.app-builder 属性说明2 L! ]: U- [& M/ \# r
属性描述默认值
applicationFolderWorklight 应用程序的目录build.xml 父目录 . 如果失败在根目录下寻找包含 application-descriptor.xml 文件的目录作为默认值
environments用逗号隔开的应用环境如:common, android,iphone所有在应用程序里的环境
appsBackupsFolder指定备份应用程序的目录Worklight 应用程序的目录的父目录
concatenate是否连接 web 资源
minifyResources是否最小化 web 资源
nativeProjectPrefix本地应用的前缀 3 H5 N# Y/ r1 g8 m# v
  当使用 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让设备在应用中可以单点登录
0 {. }& c  H$ w
false

& U8 u) z8 Z4 U& ?部署 Worklight 应用
( t5 ]3 k8 i8 U* Y; e+ X/ KWorklight Ant 构建工具包中定义 app-deployer 任务用于部署 Worklight 应用到 Worklight Server。3 |+ i6 d$ B4 |2 E1 ]1 K: M
4 g8 g2 W' W: H. ?$ M2 H
清单 3. 部署 Worklight 应用& l/ U; L. Y0 K8 L/ I
<app-deployer deployable="${outputPath}/${appName}-all.wlapp"
, g0 x8 f' @. c, K1 F# |4 h worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>
1 D  T! N% G" K2 q0 S' \
9 Z0 G' J! n9 i
表 2.app- deployer 属性说明
* x0 ~( |/ G& _6 P8 W( {/ u& E0 Q0 Z
属性描述默认值
worklightServerHostWorklight 服务端的 URLapplication-descriptor.xml 里 worklightServerRootURL 的值
deployable.wlapp 文件的路径

2 h/ ~& P# {4 _1 x9 l构建 Worklight 适配器% e* a$ K" ~' m% ^- ^3 G9 X
Worklight Ant 构建工具包中定义 adapter-builder 任务用于构建 Worklight 适配器。/ y" B* M" A7 i% D% l# g' u

' Q: [( F$ C, v. q5 R- W3 L1 w清单 4. 构建 Worklight 适配器0 K+ C5 u8 o  F% I9 B" U
<target name="build_wl_adapter">
8 R5 }. b5 @* f8 K/ T% b    <echo>build_wl_adapter ${projectPath}</echo> 8 F* [! Q. ?9 E1 h& K
    <record name="${outputPath}/build.log" loglevel="verbose" append="true"/>
% L( @7 ?) y% _# m) o    <adapter-builder folder="${projectPath}/adapters/${YouAdapterName}" " f  _) a' r& c5 w: F% Z2 S# k
    destinationFolder="${outputPath}"> * J* d- b0 Y% L1 L
    </adapter-builder> # |# k" v$ J& H0 P  R
</target>

  R, J3 R8 ^6 n* b# K/ P1 i4 Q& A0 g4 g: b
表 3. adapter-builder 属性说明/ [; _$ ?7 m- I8 b9 Z
属性描述默认值
folder适配器源代码所在的目录
destinationfolder指定适配器输出目录

5 {" E4 j5 }* c, W8 m部署 Worklight 适配器
& A, ]' J( Z5 y! IWorklight Ant 构建工具包中定义 adapter-deployer 任务用于部署 Worklight 适配器到 Worklight Server。8 _& Y, z5 _+ h0 D9 T( y: E

+ a% l9 v; i" X& i8 y清单 5. 部署 Worklight 适配器
. ?: X4 O  c5 `1 E* ^
<adapter-deployer ) c, ?( c8 l# c$ X
deployable="${outputPath}/WorklightStarterAdapter.adapter"
2 T6 y" b- c6 I- F   worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>

4 f3 b- s/ u0 O5 H! b' u5 v* k: h# d8 j6 G3 G
表 4. adapter-deployer 属性说明/ d1 Z7 W+ l- v9 m1 k
属性描述默认值
worklightServerHostWorklight 服务端的 URL application-descriptor.xml 里 worklightServerRootURL 的值
deployable.adapter 文件路径或者他的父目录
) \  Q7 i# \& D5 _' k' _2 l
构建 Worklight 控制台服务
: X' M* S3 u, y每个 Worklight 应用可以构建出一个 .war 文件用于提供 Worklight 控制台服务,构建出的 .war 文件能够部署到 Web 服务器上,比如 Jetty,tomcat 和 Websphere Application Server 等。Worklight Ant 构建工具包中定义 war-builder 任务用于构建 Worklight 服务。3 L! r9 z3 X$ I- {, B

" ]2 c$ g- ]% Y! B6 ]& b清单 6. 构建 Worklight 控制台服务: m3 ^3 F/ y- O; G- U9 h! L1 {
<target name="build-wl-war" depends="clean, compile-JavaSources">
% E8 s5 \+ d$ o2 V% W0 u9 T/ z3 I    <war-builder projectfolder="${project.path}"  4 v0 @5 O& N$ U, v3 u# f
    webxml="resources/war/web.xml"8 h, I# K. J% s% y4 d- y+ [
classesfolder="${java-classes-dir}" destinationfolder="${artifacts.dir}"> - N  @& o1 t2 {# L5 E
<fileset dir="resources/jsp"/> 1 @; C- U* u% i3 m6 ~
    </war-builder> ) Q% R3 u* {$ L, z9 k7 L
</target>
0 c8 k0 q+ n9 `& O
1 b, v: k# y$ Q5 X, i+ `( w: J
表 5. war-builder 属性说明* H: |/ k% g/ d5 r/ Z* Q
属性描述默认值
projectfolderWorklight 项目的目录
classesfolder.adapter 文件路径或者他的父目录
destinationfolderWorklight 项目 war 文件放置的目录
webxml设置 Worklight 项目的 web.xml 文件/war/web.xml
+ K+ k3 ]8 a7 n. B2 `" ~
部署 Worklight 服务端到 Websphere Application Server
- J( b2 p: J' u; J. V7 b采用 websphere 提供的 ant 任务来实现部署 worklight 服务端的 war 文件到 websphere,通过 python 来自动配置 worklight jee jar, 在 sample 里提供了一个 python 文件 changeConfig.py, 通过这个脚步文件会创建一个共享类,然后把这个共享类添加到 worklight server,设置类的加载顺序为 PARENT_LAST。) b, j9 q. O+ c( \+ r: z9 c1 V
3 n9 S, O3 ~% f! R
清单 7. 设置共享类和类加载顺序的程序清单如下8 D8 a* i! a. P
<target name="saveConfig" description="save Config">
$ P$ a8 m/ D: x; Y1 m3 L" O& t# P% n1 m    <taskdef classname="com.ibm.websphere.ant.tasks.WsAdmin" name="wsAdmin" />
! \" Q% O2 ^7 y3 S" I/ O5 {5 d4 k        <wsAdmin host="${was.hostname}" conntype="${was.conntype}"
" B: M! @5 P6 k' R% T                 lang="${language}" port="${was.hostport}" washome="${was.home}"
0 O3 |& g- z; w6 F1 X( S                  user="${was.username}"
) _& a3 `7 M* [5 l$ j5 s& F: F                 password="${was.userpassword}" script="changeConfig.py"> 8 f% `, P5 g( v. u+ o6 ~
                 <!-- worklight shared lib name -->
/ |) m+ b& {( ~8 ~; S& G, V                 <arg value="${config.websphere.sharedlib}"/>
) l$ G/ N  h  P2 L6 ?8 T* s                 <!-- worklight shared lib path --> 9 W+ T" X& w, M  {$ d4 n0 Q5 `
                 <arg value="${config.worklight.jee}"/>
) [, S8 w" O" C! G1 q                  <!-- worklight server 的名字 -->
) R: i8 w& b# |* F7 g0 t                 <arg value="${projectName}"/>
! ]- q! f" d; x                  <!-- Websphere 节点的名字 --> ) w& ~5 A$ i5 g  c4 g' O3 v, {
                 <arg value="${config.websphere.node}"/>   g7 X* ^, H2 {/ R# h
                  <!-- Websphere 服务器的名字 -->
; A& |0 p$ F9 y7 r2 k                 <arg value="${config.websphere.server}"/> , j% r, N% n/ J6 T. l* O) l( V
</wsAdmin>
+ F, @9 k" ?! o) p. }1 Y </target>
- y' q6 P7 @$ R5 \3 W- Y4 j" e/ q# |
在 build.xml 文件里还提供了 uninstallapp, installapp, startApp, stopApp 等任务,这些任务在 Windows 上需要使用 ${WAS_HOME}/bin/ws_ant.bat 来运行,在 Linux 上需要使用 sudo ${WAS_HOME}/bin/ws_ant.sh 来运行。
4 ^/ W. r$ T" ~8 I0 U. b比如你可以使用下面的命令来运行 saveConfig:" z. `- m0 ?+ t5 a0 u- x; s
  • 把附件中的文件解压到到你的 worklight 项目的根目录下面
  • 修改 application.xml, 用你的项目的名字替代 WorklightStarter_jQueryMobile
  • 修改 build.properties 里和 Websphere 相关的项目,根据你自己的环境
  • 打开 cmd,把当前目录设置为你的项目的目录,然后在命令行里输入 ${WAS_HOME}/bin/ws_ant.bat saveConfig+ R; U8 n1 b* c9 V) r


. S% n# F" b6 E+ Y7 }- B
  K- T8 ^2 N( j2 L) ~; JWorklight App 本地应用构建
  t4 K9 v, r+ H. v. Y  i( f完成 Worklight 应用构建后,在 Worklight 环境文件夹中会生成对应的本地应用目录,对应文件夹名称为 native。本节以 Android 和 iPhone 环境为例展示如何通过 Ant 脚本构建生成 Android 上的 apk 安装文件和 iPhone 上的 ipa 安装文件。; n3 }$ ~3 f& d# z8 q& r0 g
Android 本地应用构建+ T: |, h" \, x" S4 Q9 P
Worklight 的 Android 环境本地应用目录中不包含用于 Ant 构建所需要的 build.xml ( 文件位置是 ${projectPath}/apps/${appName}/android/native/build.xml),需要使用 Android SDK 中的 android 工具更新工程并指定用于编译的 Android 平台。
9 J. E# ~" Q6 ~) G# X8 o* |$ x; ~9 o( X# ]8 {% _
清单 8. 生成 Android 本地 build.xml 文件8 Y4 L3 W# G3 y
<target name="prepare_android_build"> % R( L' G! Y# R  P' z! S4 S; q
    <!-- on windows --> + I6 J1 b- T- N! j' u) y% A
    <exec executable="cmd" osfamily="windows"> 0 h* K, u7 c2 H% f5 n9 ?
        <arg value="/c ${androidSDK}/tools/android.bat update project / r( Y* k  b" ^
        --path ${projectPath}/apps/${appName}/android/native --target
2 c, R5 @& X! P- R" L; c+ B" x" Y5 n         android-8"/> & h1 ?( f: D& Q& w2 v/ F" j! s
    </exec> - S' K! `$ W; z. t
    <!-- on linux and Mac -->
( A  o+ D9 j8 I8 s$ m( u    <exec executable="/bin/sh" osfamily="unix"> 5 R3 o; i8 U' c0 b% n1 q+ V3 x
  <arg value="-c"/>
8 ~5 a5 L  J4 A- G        <arg value="${androidSDK}/tools/android update project $ ^& \& J: E, \; m9 o7 M
        --path ${projectPath}/apps/${appName}/android/native
) L5 a4 t( }& X! M) i0 {        --target android-8"/>
9 {( O! q8 g9 ]3 }' |    </exec> ; w# b! U/ ~3 W4 l, _. \
</target>

2 i. S: V) g" o- g! m
" n1 d! T0 W/ n# N5 Q表 5. android 属性说明" q7 @$ D3 a! u$ ~' t$ Q* U# h
属性描述默认值
pathAndroid 本地工程位置
target构建 APK 的 SDK 平台,例如 android-8

- [& [/ k0 L6 f# Y& I. S需要注意的是在 windows 平台下运行”cmd”命令并执行 android.bat 进行更新,而在 linux 平台和 Mac 平台下运行”/bin/sh”并执行 android 进行更新,更新后的 Android 工程文件夹中将产生用于 Android apk 文件构建的 build.xml 文件。如图 1 所示。
4 G' |- l. a3 W8 Y0 I5 E- I7 S0 v0 Q9 ?. W; q8 ~# P2 Z
图 1. 使用 Ant 更新 Worklight Android 本地应用工程1 e4 H1 }1 k9 g) l4 B1 [- a

# n( {5 l% R. d, `& w检查更新后的文件夹结构,确保 Android 工程目录中产生 build.xml 文件,如图 2 所示。; H& W4 h  V/ ?4 r- }, C& J+ c1 |

+ \; X9 ~$ c7 B; I' r图 2.Worklight Android 本地应用工程构建文件:# [3 }% v( S: [# z

5 ^/ e0 ]( a. v5 P7 b- I5 B, ~+ n然后通过生成的 build.xml 进行 Android 本地 apk 文件构建。9 q9 U2 P$ y! E. S( \/ F* h* Y
8 M: @% S* y% Q2 ]2 j$ q% U  l7 a
清单 9. 构建 Android apk 应用
: G- f3 V2 F& Q/ Z- r! U
<target name="build_android"- W% y: [2 l* ]
  depends="build_wl_apps, prepare_android_build"> / @  Q  r8 U$ y" \
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"( U2 ]( \: q- [; g* w3 N
     target="debug" useNativeBasedir="true"/> 9 v6 A8 m$ b  c7 O
    <copy todir="${outputPath}">
; Q7 y5 W6 X* G3 q' S  D        <fileset dir="${projectPath}/apps/${appName}/android/native/bin"> & F. ^2 W. w0 P! p$ G! q9 B1 T" W
            <include name="${appName}-debug.apk"/>
2 i, ]$ ~6 R: p$ v        </fileset> 2 g) [4 H! W3 k4 ~
    </copy>
/ u8 L) Z3 y; {  K( v </target>

) ]7 M% s4 J6 E: e! W8 o2 D
8 O- Y- l* h) v6 U3 U  N+ T表 6. 构建 apk 属性说明
+ N. V/ u8 I% I! x
属性描述默认值
antfile取值为更新 Android 工程后产生的 build.xml 文件路径
target Apk 文件构建类型,取值为 debug 或 release& `  C# _5 ~9 b. Y9 c
  debug:Debug 版本 APK
& u6 R" e- U* x" C# b) G0 W7 H  release:Release 版本 APK,需指定签名文件。
useNativeBasedir使用 Android 本地工程文件夹作为 build.xml 的 basedir( t' m5 X6 T, f: m0 D% E: C3 U
取值为 true 或 false
false
, V  w2 T! `0 y5 v  |
构建完成后 apk 文件保存在 Android 工程的 bin 文件夹下,可以通过 ANT 的 copy 命令将其复制到统一的输出文件夹中。" A; ^- `! G% n; ?, _8 P
如果需要构建出 Release 版本的 APK 文件,请修改 target 参数值为 release,并在 Android 环境 native 文件夹中添加 build.properties 文件指定签名文件路径和对应的密码。$ m7 @5 E! u3 R* T% _! M/ L

8 R  u: w) E$ ~清单 10. 构建 Android apk Release 应用% A1 t4 h# \: \& U9 U3 q
<target name="build_android" depends="build_wl_apps, prepare_android_build">
& }, w  M+ r. F: Y( V' R9 ?    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"% J& G& t. F* {; X2 ^  h
     target="release" useNativeBasedir="true"/>
! |+ C3 L/ E$ t9 a, e6 D% K    <copy todir="${outputPath}">
/ L) }1 d! y; q+ X1 Q0 ?( J        <fileset dir="${projectPath}/apps/${appName}/android/native/bin">
1 p2 V. P! U- Y3 _+ w* P0 s6 w0 K            <include name="${appName}-release.apk"/> , X1 A3 g+ n! X  L" }3 N
        </fileset> 1 M" g4 a5 ~0 `: F1 }- l& a, x* D
    </copy> 5 Z& n3 m' E: P- f
</target>
2 y8 j# \) m9 R) J( Z1 e' T7 q
添加 build.properties 文件到 Android 环境的 native 文件夹 , 如图 3 所示。
) {) l% C3 \- {' H! W4 d7 v1 r2 }# p: [* p3 ]
图 3. 添加 build.properties 到 android 环境 native 文件夹
! y) C2 y) ?5 c4 S8 t( B
+ m- S1 @$ D8 R" k* }  x使用在 Eclipse 中使用“导出 Android 应用”功能创建您的签名文件并设置密码,然后在 build.properties 文件中指定签名文件路径和对应的密码。
) b1 k8 c3 E9 n3 Z# u: d) A7 t- m
& s; F9 E4 g2 f7 ?1 ~- r5 X清单 11. 设置签名文件信息7 b; _' B) I; F
#Android 签名文件路径 , 例如 D:\\workLight\\AndroidKey\\key.keystore
) ]& X3 U: M! q) p4 g+ w key.store=YouKeystore 0 l, c8 q" D' N0 D
#Android 签名文件别名 , 例如 export 8 F: |3 s! |) z: x. Y
key.alias=YouAlias
( P: a0 i9 p& b5 P #Android 签名文件密码
. a9 ~- R% i5 k. ^5 J6 r key.store.password=YouPassword ! b; ]& U7 U/ C3 w+ h* [
#Android 签名文件密码
( u  ^) f+ P, G4 D, }* l1 W key.alias.password=YouPassword
: m" [% V0 T0 a6 a
iOS 本地应用构建% B$ B, W/ \( R; p5 D0 U4 e6 W
构建 iOS 本地应用需要有一台 Mac 并安装 Xcode,本文使用 Mac OS x 10.7 和 Xcode4.3.3 进行 iPhone 应用构建。为了确保 Ant iOS 构建任务是运行在 Mac 平台上,您可以使用 Ant 来检查运行平台是否符合条件。本节添加一个 Ant target 来检查当前运行平台。6 m* ?1 Y- V$ R* K% u% w' x: R8 X

6 m: Z+ r0 g: Z% ~, g) F: E& u清单 12. 检查 Ant 运行平台信息
! S% ^9 F/ J) m/ e0 W' t
<target name="init"> . [0 T* ]( Z9 h4 B# j" ?7 ~$ C
         <condition property="isWindows"> ' I- J/ r3 n' b  n: T) _
                 <os family="windows"/> ( a$ c' m& H! c. e4 L; z
         </condition>
! ]& i# \8 X( i( N         <condition property="isMac"> 7 B8 r$ ?2 s0 }8 y, L+ E5 y: \
                 <os family="mac"/> 6 U- {: o2 m: d
         </condition> ' V. V- U: n" W0 G( P1 n
         <condition property="isLinux"> / E9 ?4 D* o$ e# E8 C
                 <os family="unix"/> ( L5 W2 F7 V2 s9 S* `
         </condition>
. R6 q% B) }9 b: e( |9 A' w0 F </target>
0 H! [% N' f% U- g
执行 ant init,当前的运行平台信息会保存在对应的变量中,检查平台是 Mac OS 后就可以进行 iOS 本地应用构建。iOS 目标任务构建包含两部分,构建本地应用和打包本地应用为 ipa 文件。完整的 iOS 构建程序清单如下。
" k- \4 G+ N4 b5 i8 V8 W
. T* n- _0 L' {/ h/ T) `- ?清单 13. 构建 iOS 本地应用, N) m4 L! b# |) K- l! U( r
<target name="build_iOS" if="isMac"
1 t0 P0 b, Y$ g) K( p: C' C  depends="init, build_wl_apps, prepare_iOS_build">
! t" ]: i9 n6 L6 C5 k         <property name="wlappdir" value="${projectPath}/apps/${appName}" /> 3 C; {/ b$ G( s& l7 q: ~) E
         <property name="xcodebuildCMD" value="/usr/bin/xcodebuild" />
; t8 m! N7 {5 h* w         <property name="iosPackageCMD" value="xcrun" />
# Y1 f+ n; u2 h$ H% H' g* z         <property name="xcodebuildCMDlog" value="${outputPath}/xcodebuildCMD.log" />   u7 W4 W& j" s' V! a- ]7 v* e
         <property name="iosPackageCMDlog" value="${outputPath}/iosPackageCMD.log" /> , v6 K# }1 p% ~. j
         <property name="configuration" value="Ad Hoc" /> ( V6 a7 A" @0 L/ v5 e1 [

0 }5 a3 }- W/ b/ Y7 l  o <!-- 构建 iPhone native app --> : `& a% H& \- M
         <exec $ [! Q5 h; ?+ n
                 dir="${wlappdir}/iphone/native"
  L! b) p( A, O2 l/ W                 executable="${xcodebuildCMD}"
! K5 o2 r" ~" V6 S5 b9 j                 failonerror="false"
# ~* ?" w* Q4 I+ J                 output="${xcodebuildCMDlog}"# v* S# d' {, h$ X" \! W6 G
                 resultproperty="xcodebuildCMDResult" > ; |, _3 h( l0 @9 }  D. C7 E, p

, ?/ s$ ]" e8 j% ]                 <arg line=" -configuration '${configuration}' -sdk iphoneos5.1" />
7 ^& A  v: g$ Y0 C8 O         </exec>
. Y2 a7 F( a+ D% l, U, Y$ Q1 p# b$ P5 Y* g
         <!-- Package into IPA -->
( E/ C& w0 v/ u         <exec
6 w8 Y  N* a* X4 ^6 x4 {                 dir="${wlappdir}/iphone/native"2 Z* }3 X9 ?8 H! ~
                 executable="${iosPackageCMD}"
/ B" N' Y. U& E, L0 C                 failonerror="false"
3 I* V% ]+ Y, k& ]& }                 output="${iosPackageCMDlog}"
: k1 {$ H4 s2 t" A3 K& ]                 resultproperty="iosPackageCMDResult" >
- H/ K$ n* b$ n. _- k& i
0 }% j9 L( W" ]0 z                 <arg value="-sdk" />
" ~4 }- [1 e) L9 f/ l% W                 <arg value="iphoneos" />
0 {2 J# h+ z# O- Y& z$ \                 <arg value="PackageApplication" /> 0 \; l7 W) @; B! `; m, z, L
                 <arg value/ D" X8 B& }& Q/ I. h/ @% o1 f' @
     ="${wlappdir}/iphone/native/build/Release-iphoneos/${appName}.app" /> 6 C2 c9 X# J0 V+ N8 c6 c4 S
                 <arg value="-o" /> $ Z4 W3 i# f& e4 k$ t
                 <arg value="${outputPath}/${appName}.ipa" /> ! N8 G/ n; d: u* F
                 <arg value="--sign" /> # I- p1 `$ U! J* N0 K$ t
                 <arg value="${certificate}" /> . {) K6 {/ f3 L4 Y: Z
                 <arg value="--embed" />
: G- h7 @: e0 t) N5 L7 D                 <arg value="${provisioningProfile}"/>
3 i. P/ v* d' y* i$ _. A                 <arg value="-verbose" /> # L3 E6 S& j! t- A& R
         </exec> , W! t* \4 J3 u
</target>

$ r1 N$ G+ R8 S$ q/ a: e6 r3 ~构建 iOS ipa 应用需要指定开发者账号 provisioning profile 和 certificate,你可以在 worklight 工程根目录下的 build.properties 文件中指定开发者 provisioning profile 和 certificate。
* w/ X4 q; c) y. C, o" W: c1 J$ A6 Y9 Q9 M: m9 K4 t- A1 Z5 H/ W
清单 14. 指定 iOS 开发者信息
  Z4 C6 c3 G. x7 n* T3 x3 z
#iOS provisioning profile. Update this for iOS build / J$ t4 |3 O$ b' d  a: l6 B2 F% Y
provisioningProfile=/Users/YourUser/Library/MobileDevice/Provisioning
* p) K' O: ~, R Profiles/E26327E9-A055-48A5-92A0-FB4850E335BA.mobileprovision # ]0 o, B7 K  t* u8 C- u
#iOS certificate. Update this for iOS build . C6 M2 _' q6 P( v! _  Z  _4 X  n
certificate=iPhone Developer: Your Name (XZLU45UFKZ)

2 q3 f: Q$ Q5 a2 b" \1 ^Worklight 构建出的 iPhone 本地应用默认使用 Entitlements-Release.plist 作为命令行构建配置文件。如果您使用 Xcode4.3.3 执行 iOS 本地应用构建,需要将 Entitlements-Release.plist 文件中的 get-task-allow 属性值修改为 true, 否则生成的 ipa 文件将不能安装到您的 iOS 设备上。$ y  e4 E' U. z1 ^0 z* z
9 ^% `$ ]5 ?. Q
清单 15. 修改 Entitlements-Release.plist
+ ]& x6 O/ z8 X/ n7 b  `& p
<target name="prepare_iOS_build" if="isMac" depends="init"> , N0 [- {0 I' ?+ X
         <echo> set ! |% L, n7 J7 S) A/ n  T# r& q
         iOS Entitlements-Release.plist get-task-allow=true</echo>
3 h' r1 G7 j# r0 n! M    <replace file
1 W# i7 `+ a0 K. C+ \# U    ="${projectPath}/apps/${appName}/iphone/native/Entitlements-Release.plist"
7 O- H3 }% v5 {6 [- U            token="false"
  `0 M% w: E7 |" N# \5 h            value="true"/>
7 ?9 A9 b$ p9 a1 ?$ {  c" J </target>
5 a5 F, Z- H( h% S; o
由于 Entitlements-Release.plist 中 get-task-allow 属性值默认为 false,且整个文件中仅有一个值为 false,可以使用 ANT 的 replace 任务按照关键字直接查找 false 替换为 true。9 y% `  u. x- V( |
关于 replace 任务详细介绍可以参考 http://ant.apache.org/manual/Tasks/replace.html
4 }$ Y4 p$ L. V; f% T1 M/ I

2 a! t9 i% Q% ]* G" C1 w4 t$ j& h- V* x( ]1 L7 `* I  I
部署本地应用到 Worklight App Center
) z! k/ h  t; G+ D- \2 n4 R; _打包好的 Android apk 程序和 iOS ipa 程序可以通过 Ant 发布到 Worklight App Center 上,用户能够直接访问 Worklight App Center 进行安装。在发布本地应用程序前,需要安装并启动 Worklight App Center server,请参考 Application Center User ’ s Guild 完成 Worklight App Center 安装。. I+ s  _- J) Q( ?5 F
Worklight App Center 没有直接定义部署本地应用文件的 Ant 任务,需要复制并修改位于 tools 目录中的 build.xml 完成通过 Ant 发布应用。该目录位于 Worklight 安装目录下 ${install.dir}/ApplicationCenter/tools。
3 ]8 x( g  B1 R" o为方便修改 App Center Ant 部署任务,本文直接复制 tools 目录下的 build.xml 文件并重命名为 appcenter.xml, 放置到 sample 的根目录下,如图 4 所示。
& _2 M/ s/ C: b: y
0 X! `# {6 |* Y3 H. U1 ~图 4. 添加 appcenter.xml( r5 E# q1 M  y7 y
: ?9 b1 B, B, h2 K3 s( ~0 q
在 build.xml 添加 Ant target 调用 appcenter.xml 进行本地应用发布。
( B2 {' g  g( U3 P$ r' j. x6 j* w  Y2 o
清单 16. 调用 appcenter.xml 部署 Worklight 本地应用
! i! y3 [8 J9 m! u- K0 P! ^( a( i+ ~
<target name="deploy_to_appcenter"> 1 D- I1 |9 |% }  m
         <echo message="deploy to application center"/> ( L* v/ E2 W6 U- T2 I4 H! K
         <ant antfile="${projectPath}/appcenter.xml" target="upload.AllApps">
& a6 H5 ^8 P* D7 G; S6 H                 <property name="server.path"
! m8 C3 q3 d1 G; i- x                  value="http://${appCenterHost}:${appCenterPort}"/>
6 ~& J( m$ p& v4 ]1 c; d1 h' {                 <property name="context.path" value="${appCenterContext}"/>
5 x1 x  }4 g7 N- y. }5 n+ j                 <property name="install.dir" value="D:/workLight/Worklight"/> 0 t* X2 \' l, v
                 <property name="workspace.root" value="${outputPath}"/> / L: K6 c8 Q( B& \0 q; L/ }
                 <property name="login.user" value="demo" /> / f" U+ S0 B* d" O# `& M
                 <property name="login.pass" value="demo" />
' O$ B% y- z) K! w2 s' d         </ant> ' P) \; M: v" }
</target>

. ~' \& H9 y+ V( p; a8 P' u& V7 P9 Y/ e, {/ k; L
表 7. 调用 appcenter.xml 属性说明
) ?7 Z# r$ _( R  n) Z
属性描述默认值
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需要发布的本地应用父目录

  Q6 S8 r6 T* u. W/ y

" o; [) z8 n% n8 Y& e  N+ K, d
结束语+ j! b9 P6 ]; A9 A8 ]
关于 IBM Worklight 自动化构建和部署的介绍到此就结束了,希望本篇文章能够对使用 IBM Worklight 在开发中进行自动化构建、部署有所帮助和启发。
/ ?: l' p' C3 ~# n1 n$ ?7 \$ _4 u

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2018-6-23 18:11 , Processed in 0.081084 second(s), 6 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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