SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3514|回复: 1

[推荐] Worklight 自动化构建

[复制链接]
发表于 2013-2-17 10:29:38 | 显示全部楼层 |阅读模式
本帖最后由 技术狂人 于 2013-2-17 10:37 编辑 - b5 y, {+ f$ `# {1 J

, \2 D) c' i6 j! {2 fWorklight 简介3 x  D' u. |) P/ W0 r+ ^' v
IBM® Worklight® V5 是一种领先的移动企业应用程序平台 (Mobile Enterprise Application Platform, MEAP),利用该平台,IBM 可以跨其产品组合扩展其整体移动能力。如何写 Worklight 应用程序请参考文章 使用 Worklight,第 1 部分 : 开始使用您的第一个 Worklight 应用程序
. t5 _6 C# Z* M2 n/ W4 A; h
) \% d  G& O  g" h' g7 z

. q; ^0 l1 z* ?8 Z& q$ HApache Ant 基础知识6 {. {+ G, s& N5 B: w  g. w
Apache ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。更多关于 Apache Ant 的内容请参考 Apache Ant 手册
" ~* ~3 l! t4 B" G+ k" I

& \- f4 N: v# ?: j/ _
9 |  \4 q: t- I  R1 mWorklight Ant tasks 介绍1 D  s/ Q$ `: L. L& Q
Worklight 为了方便开发者自动构建个部署 Worklight 适配器和应用程序,创建了几个 Apache ANT 任务,app-builder、 app-deployer、adapter-builder、adapter-deployer、war-builder。
! M; c: L1 ^0 Z3 G" _声明 worklight ant 任务
+ n$ U! v% F; I9 Y) JWorklight Ant 构建工具包中定义了用了执行构建和部署的 Ant 任务,在使用这些任务前,我们需要将 worklight-ant.jar 文件加载到 classpath,并引用 com/workight/ant/defaults.properties 声明 Ant 任务。
: `! _  H+ k; V/ S0 A; R$ [- F3 q
清单 1. 声明 Worklight Ant tasks, a& F# K  l4 _. f8 @( E& ^
<taskdef resource="com/worklight/ant/defaults.properties">
  U% j/ `) A  ~) {, U    <classpath> 1 }. C* @* S# d8 D( W, H5 F7 E3 T9 O
        <pathelement location="${buildToolDir}/worklight-ant.jar"/>
- N: u) V! H8 x  ~, j    </classpath>
3 m/ o4 G7 o) I# ?% N </taskdef>

, L. S! i$ Q$ Q3 A& X) e& H5 q6 P构建 Worklight 应用, d6 k. Y9 k1 z
Worklight Ant 构建工具包中定义 app-builder 任务用于构建 Worklight 应用。  r2 P" n. C& f( O

6 n' N3 j$ t3 Y  X* N. u清单 2. 构建 Worklight 应用
- V) R" P8 l0 p0 \9 k& \0 P& }
<target name="build_wl_apps" depends="change_Server_IP">
3 K0 q$ V. G' ]; @    <echo>build_wl_apps ${projectName}</echo>
! m; x9 ]) ^" x    <delete dir="${outputPath}"/> 9 n* d& t9 |- U+ y9 L
    <mkdir dir="${outputPath}"/> ! e8 ]6 M" e3 S
    <record name="${outputPath}/build.log" loglevel="verbose"   append="false"/>
/ H( v  U* e1 s" F    <app-builder nativeProjectPrefix="${projectName}_" . h+ b! s$ y0 b: C, A
    applicationFolder="${projectPath}/apps/${appName}" outputFolder="${outputPath}">
2 k, U! u& M$ C; a8 \' ~    </app-builder>
! j0 ~' Z" D. F! K4 | </target>
  h' B" \7 H! c" r; y, i& m, z( ?
表 1.app-builder 属性说明& ^$ A" i! v6 w
属性描述默认值
applicationFolderWorklight 应用程序的目录build.xml 父目录 . 如果失败在根目录下寻找包含 application-descriptor.xml 文件的目录作为默认值
environments用逗号隔开的应用环境如:common, android,iphone所有在应用程序里的环境
appsBackupsFolder指定备份应用程序的目录Worklight 应用程序的目录的父目录
concatenate是否连接 web 资源
minifyResources是否最小化 web 资源
nativeProjectPrefix本地应用的前缀
- f3 G" E+ u* `$ M  当使用 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让设备在应用中可以单点登录 ( h* z& \& H* h9 j  ]3 i
false
( C& Y& C7 P! N# v- D( I# @8 \4 _
部署 Worklight 应用
3 @, ^/ S9 n  c% qWorklight Ant 构建工具包中定义 app-deployer 任务用于部署 Worklight 应用到 Worklight Server。7 |" O, D9 n: Q+ B7 T+ u' I

$ i  P* a7 K7 b7 q7 c+ O清单 3. 部署 Worklight 应用* E; o- i  O1 ]6 z
<app-deployer deployable="${outputPath}/${appName}-all.wlapp"7 a! }( H# W; ^: _# \6 ~- q
worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>

1 ^# @/ n$ o# J/ W  _+ \$ H1 B* K- Z, c
- d0 n# t1 r& J. c% t/ i! w表 2.app- deployer 属性说明
/ C% Z: r( f+ K4 ^1 m& p
属性描述默认值
worklightServerHostWorklight 服务端的 URLapplication-descriptor.xml 里 worklightServerRootURL 的值
deployable.wlapp 文件的路径

7 `" ]' p% M% W2 Y. g- y构建 Worklight 适配器
6 S# K, \) a! Q5 ]% f6 V6 B, fWorklight Ant 构建工具包中定义 adapter-builder 任务用于构建 Worklight 适配器。7 }7 l0 ?5 X3 V. s2 L1 w  c# i/ e

$ [; g) `* @8 i清单 4. 构建 Worklight 适配器
. S/ D  W- i2 _. i: R( P: Z
<target name="build_wl_adapter">
7 _- k/ F2 G- f4 I5 e    <echo>build_wl_adapter ${projectPath}</echo> 5 d5 o1 a! {2 w/ \2 N
    <record name="${outputPath}/build.log" loglevel="verbose" append="true"/> / d' u  q+ n. c
    <adapter-builder folder="${projectPath}/adapters/${YouAdapterName}"
8 c1 N3 {$ C! y3 V+ }* c2 j    destinationFolder="${outputPath}">
. P8 O6 a! X6 u2 t/ Z) F& R    </adapter-builder>
* Q. r9 r+ N! g( P2 o* @* K; S7 u </target>

5 ~8 S4 ^$ x$ D( O
" p- V6 W! p3 K$ y- i- e7 t; k表 3. adapter-builder 属性说明! r8 ]/ |' H' p) O, P7 A
属性描述默认值
folder适配器源代码所在的目录
destinationfolder指定适配器输出目录
: P' J1 J, I2 e& g3 ?
部署 Worklight 适配器5 W. E" x6 l# W8 v. T1 P
Worklight Ant 构建工具包中定义 adapter-deployer 任务用于部署 Worklight 适配器到 Worklight Server。) F$ q0 r+ h7 N% v  {6 F

4 m1 U1 }  ~# m9 g1 \9 X  ]7 [清单 5. 部署 Worklight 适配器
! N2 @9 x" B4 b, f
<adapter-deployer + ~0 e1 c7 O, a6 m, y* S3 a
deployable="${outputPath}/WorklightStarterAdapter.adapter"
# n  O! e: `7 E$ v/ `   worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>
0 Y% ^5 p# o' `' g! n+ a
+ t" P; Y2 \- x
表 4. adapter-deployer 属性说明' x7 `9 K- [- A) i+ e5 U
属性描述默认值
worklightServerHostWorklight 服务端的 URL application-descriptor.xml 里 worklightServerRootURL 的值
deployable.adapter 文件路径或者他的父目录
7 W: y& @+ h& F' ]/ z1 c( }* t( n
构建 Worklight 控制台服务
' c9 \4 |( S# p, D+ ~, V每个 Worklight 应用可以构建出一个 .war 文件用于提供 Worklight 控制台服务,构建出的 .war 文件能够部署到 Web 服务器上,比如 Jetty,tomcat 和 Websphere Application Server 等。Worklight Ant 构建工具包中定义 war-builder 任务用于构建 Worklight 服务。+ ]+ H& y; ~  z% o1 c' p2 U
8 L2 o: ]- B; Q- I1 P) a
清单 6. 构建 Worklight 控制台服务; \! O7 I7 l  Z; l) x7 k
<target name="build-wl-war" depends="clean, compile-JavaSources"> # y+ P' h8 Z2 B1 V3 ~6 U+ M' M
    <war-builder projectfolder="${project.path}"  1 p' \% b, U6 B
    webxml="resources/war/web.xml"
' h# W9 A5 w. z! K( G! g) E classesfolder="${java-classes-dir}" destinationfolder="${artifacts.dir}"> 5 h- I2 l7 q& z- e7 i! M
<fileset dir="resources/jsp"/>
" }( A; {) e: |9 y3 c. L8 _" m& F    </war-builder> + A% p) ^+ @' V, J
</target>

. ]. ^8 l' F) e7 F% _, B0 {9 g7 W  w& @) `! H5 f8 Q7 }/ U7 k
表 5. war-builder 属性说明
1 H/ g% g% D% T9 s$ S
属性描述默认值
projectfolderWorklight 项目的目录
classesfolder.adapter 文件路径或者他的父目录
destinationfolderWorklight 项目 war 文件放置的目录
webxml设置 Worklight 项目的 web.xml 文件/war/web.xml

9 N3 ^/ E  c! z' j+ F. M: I部署 Worklight 服务端到 Websphere Application Server
! {+ V+ y4 u: N4 }% n采用 websphere 提供的 ant 任务来实现部署 worklight 服务端的 war 文件到 websphere,通过 python 来自动配置 worklight jee jar, 在 sample 里提供了一个 python 文件 changeConfig.py, 通过这个脚步文件会创建一个共享类,然后把这个共享类添加到 worklight server,设置类的加载顺序为 PARENT_LAST。
2 t$ E5 m. c) x0 N7 l# E1 j1 G( ]4 m9 o2 u5 x- {; Z) E) M5 o
清单 7. 设置共享类和类加载顺序的程序清单如下( Q$ P" z4 ^8 h; o
<target name="saveConfig" description="save Config"> 6 ~1 ~3 Q2 b3 ]. c
    <taskdef classname="com.ibm.websphere.ant.tasks.WsAdmin" name="wsAdmin" />
1 v: N4 x7 {. m1 L, k( s. \) y3 ?        <wsAdmin host="${was.hostname}" conntype="${was.conntype}"
$ J- l4 q; B- a* A( D- a( e% w                 lang="${language}" port="${was.hostport}" washome="${was.home}"3 c" t+ k8 {. J! w6 K: ]6 @4 [
                  user="${was.username}"
# w: x' B, v/ Q2 s  i                 password="${was.userpassword}" script="changeConfig.py">
6 S+ ~+ S0 _. t1 L3 ~7 u                 <!-- worklight shared lib name -->
$ ]. c2 |$ f5 Y0 S                 <arg value="${config.websphere.sharedlib}"/> 4 n) @6 t5 I* J& X1 E
                 <!-- worklight shared lib path --> 0 p" W2 r3 Y% h" M" j3 W1 D
                 <arg value="${config.worklight.jee}"/> ' [9 k9 _5 k& t2 V, y# G6 u# [  Z
                  <!-- worklight server 的名字 -->   @  a6 O" x$ y9 x
                 <arg value="${projectName}"/>
  V1 f& S1 s# d, g7 j                  <!-- Websphere 节点的名字 --> 1 M2 y' j1 r) \+ ]$ S( R
                 <arg value="${config.websphere.node}"/> 9 D# X" h% p; r/ [6 @
                  <!-- Websphere 服务器的名字 -->
6 D9 m# L! v) A- }/ p                 <arg value="${config.websphere.server}"/>
- y& h# g9 B3 ]2 l/ r5 R! \ </wsAdmin> " q- ?' n! O  ?; b+ r/ p5 w
</target>

/ d  c  R& z' @7 B3 t* H在 build.xml 文件里还提供了 uninstallapp, installapp, startApp, stopApp 等任务,这些任务在 Windows 上需要使用 ${WAS_HOME}/bin/ws_ant.bat 来运行,在 Linux 上需要使用 sudo ${WAS_HOME}/bin/ws_ant.sh 来运行。) ~7 R/ a$ U# a6 ~
比如你可以使用下面的命令来运行 saveConfig:/ h; h' z0 Z) Q& c, r
  • 把附件中的文件解压到到你的 worklight 项目的根目录下面
  • 修改 application.xml, 用你的项目的名字替代 WorklightStarter_jQueryMobile
  • 修改 build.properties 里和 Websphere 相关的项目,根据你自己的环境
  • 打开 cmd,把当前目录设置为你的项目的目录,然后在命令行里输入 ${WAS_HOME}/bin/ws_ant.bat saveConfig
    / d( L( Y# ]. O, C- E* |

( J+ m/ P# f+ G& T5 x: s

* M7 ]  s- i% r+ F( I# k& FWorklight App 本地应用构建& A) U) r  @6 A  K' u6 J; t, R
完成 Worklight 应用构建后,在 Worklight 环境文件夹中会生成对应的本地应用目录,对应文件夹名称为 native。本节以 Android 和 iPhone 环境为例展示如何通过 Ant 脚本构建生成 Android 上的 apk 安装文件和 iPhone 上的 ipa 安装文件。
) U. |! q( W: ~% y4 v6 m. d7 `- jAndroid 本地应用构建" j( o' s; b# j& M1 x3 |, D
Worklight 的 Android 环境本地应用目录中不包含用于 Ant 构建所需要的 build.xml ( 文件位置是 ${projectPath}/apps/${appName}/android/native/build.xml),需要使用 Android SDK 中的 android 工具更新工程并指定用于编译的 Android 平台。
% g/ ~) b4 d9 M4 f! S. `$ x0 s4 f- F* Z
清单 8. 生成 Android 本地 build.xml 文件' P0 g9 f* B. f$ I. s3 s
<target name="prepare_android_build"> * T0 b3 o- @- l7 p2 s+ D+ U( ?
    <!-- on windows --> 0 r) J/ m+ Z8 ]
    <exec executable="cmd" osfamily="windows">
" P& N8 R! O! r- H( A2 @$ ^        <arg value="/c ${androidSDK}/tools/android.bat update project 2 f9 W9 {, l. q* @6 o; b: L+ L8 W
        --path ${projectPath}/apps/${appName}/android/native --target / u+ N. e9 g: e7 s( {. R7 G  C
         android-8"/> ) t$ D! e/ g, P  [" s! N  ~
    </exec>
3 ]- G/ F2 x2 [9 I1 }0 C/ W# J    <!-- on linux and Mac --> $ O$ Z" e* Z# q" l$ z
    <exec executable="/bin/sh" osfamily="unix"> ) ^+ B+ ?" K0 T  L' M
  <arg value="-c"/>
  x% W& h  b3 ^5 `$ o9 ^        <arg value="${androidSDK}/tools/android update project 4 W2 y+ E1 y+ F
        --path ${projectPath}/apps/${appName}/android/native
3 h6 I+ h! H4 ]        --target android-8"/>
( r+ N0 O/ M$ a& t# b6 I4 e8 M+ v    </exec> 1 i0 C1 h: N& e
</target>

; f8 _6 G* N) j3 f/ _
( e& A" z* ~' r1 z1 c; [5 i表 5. android 属性说明, ^, ~: W' m& f" G! I
属性描述默认值
pathAndroid 本地工程位置
target构建 APK 的 SDK 平台,例如 android-8

+ @6 k- i7 Q) L5 y0 a6 W. M9 i需要注意的是在 windows 平台下运行”cmd”命令并执行 android.bat 进行更新,而在 linux 平台和 Mac 平台下运行”/bin/sh”并执行 android 进行更新,更新后的 Android 工程文件夹中将产生用于 Android apk 文件构建的 build.xml 文件。如图 1 所示。: I8 O! l6 Y, Z$ U8 r0 q1 t

% Y; O8 c; `/ X图 1. 使用 Ant 更新 Worklight Android 本地应用工程4 g' W$ v* ]" @; G& C+ @  C
! g7 Y/ B" m0 u# T! M4 U
检查更新后的文件夹结构,确保 Android 工程目录中产生 build.xml 文件,如图 2 所示。
$ {( _( k8 D8 K" h. ^) y  _; D3 p# G6 S# m% Q& S* {
图 2.Worklight Android 本地应用工程构建文件:3 Q# W" e& L6 u# q" c( \

4 m: [# E+ S( U/ p% [然后通过生成的 build.xml 进行 Android 本地 apk 文件构建。0 v8 [) z. g( `. |2 H, ~" i

+ o+ h' \* `% G% w' }清单 9. 构建 Android apk 应用
/ Z5 \! s* ^7 ^# r! \- I
<target name="build_android"
, h0 O; C  r: N% j  depends="build_wl_apps, prepare_android_build">
. e& Z: F* ~1 K2 W8 c    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"0 J- W0 n( s+ j+ @6 d3 x/ u( l
     target="debug" useNativeBasedir="true"/> $ H& A; t, E8 J( Z/ D
    <copy todir="${outputPath}">
$ K4 K$ `( s! k4 X' z        <fileset dir="${projectPath}/apps/${appName}/android/native/bin"> ( q" M$ R$ y5 N% J/ G
            <include name="${appName}-debug.apk"/>
2 F8 q' p. Z0 D( l( H+ L! o/ d# g" y        </fileset>
! e5 t% g9 x' h( w* d- Q    </copy> 0 v7 g. O4 K4 P" P
</target>
+ l' Y/ M# K) `7 k$ ~- F

  z% J! S& s3 C" R3 F表 6. 构建 apk 属性说明
5 g+ n+ i* E2 p
属性描述默认值
antfile取值为更新 Android 工程后产生的 build.xml 文件路径
target Apk 文件构建类型,取值为 debug 或 release( H' n/ P* I2 l3 t
  debug:Debug 版本 APK
/ a) H( j/ W7 V2 H& `6 G) i  release:Release 版本 APK,需指定签名文件。
useNativeBasedir使用 Android 本地工程文件夹作为 build.xml 的 basedir
0 ]+ p9 g5 c& R% F. `# ?0 l 取值为 true 或 false
false

1 q% L) D' {! I构建完成后 apk 文件保存在 Android 工程的 bin 文件夹下,可以通过 ANT 的 copy 命令将其复制到统一的输出文件夹中。% w1 W" O' y- I8 z1 a* _
如果需要构建出 Release 版本的 APK 文件,请修改 target 参数值为 release,并在 Android 环境 native 文件夹中添加 build.properties 文件指定签名文件路径和对应的密码。
4 `8 N3 r$ O% @  e
. c& T/ t8 Y9 M2 m+ Y清单 10. 构建 Android apk Release 应用
8 Q  R* M! O9 h/ ~- E. t" f& M
<target name="build_android" depends="build_wl_apps, prepare_android_build"> + W" z5 {6 [6 d1 K+ u5 L, ^
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"
  y8 y$ t% ?7 z( i2 c     target="release" useNativeBasedir="true"/> ) _! O# O! ~0 s2 ~. l
    <copy todir="${outputPath}"> / h7 r+ _4 Y0 @: L3 X
        <fileset dir="${projectPath}/apps/${appName}/android/native/bin">
& ], w2 H9 D$ g8 ?7 s            <include name="${appName}-release.apk"/>
6 H' M( ^3 ?4 B) \6 n        </fileset>
9 L) X1 c4 Y. z6 K1 U    </copy> ( n" V& y3 ?' ^3 t+ z
</target>

& e- f1 e* n* y$ K5 U添加 build.properties 文件到 Android 环境的 native 文件夹 , 如图 3 所示。, Q  G0 N5 j) p* ?
  `7 A& z! s2 q% x% m' O% O
图 3. 添加 build.properties 到 android 环境 native 文件夹
2 `3 o7 C8 c! S3 ^: Q% d5 M) a9 _2 W$ c6 Z% V
使用在 Eclipse 中使用“导出 Android 应用”功能创建您的签名文件并设置密码,然后在 build.properties 文件中指定签名文件路径和对应的密码。  J: R1 a! m: c) X6 |$ t9 \4 @# J
. b. g5 `3 Q2 \6 h: t# A
清单 11. 设置签名文件信息
8 m$ ^" N. s# Q
#Android 签名文件路径 , 例如 D:\\workLight\\AndroidKey\\key.keystore " g4 c. k4 r1 D5 f% n- u) j& Z+ Q
key.store=YouKeystore ! x% p% \1 e6 u
#Android 签名文件别名 , 例如 export
* k- I9 M8 |1 y3 l! X+ W; _ key.alias=YouAlias
" D; P8 ^! h/ W/ }' e7 ]- @ #Android 签名文件密码  Q0 k7 [3 @3 K( p. v; y. {
key.store.password=YouPassword
$ ~2 p- j6 a# @. E  y" o' k #Android 签名文件密码4 @/ v2 m( n2 @
key.alias.password=YouPassword

( Z. {# D$ `6 T+ hiOS 本地应用构建2 e% X: u  p0 u4 w/ t6 z
构建 iOS 本地应用需要有一台 Mac 并安装 Xcode,本文使用 Mac OS x 10.7 和 Xcode4.3.3 进行 iPhone 应用构建。为了确保 Ant iOS 构建任务是运行在 Mac 平台上,您可以使用 Ant 来检查运行平台是否符合条件。本节添加一个 Ant target 来检查当前运行平台。" Q8 g6 @: U% i1 I2 C& A8 A4 O$ s
( e5 E$ i8 ^# G; l3 ]$ F2 c
清单 12. 检查 Ant 运行平台信息
) Q( [' T/ w* S
<target name="init">
3 V% F4 S! |5 a! h: |' d3 _         <condition property="isWindows"> 5 W' U; z+ R" {% W& ]! S
                 <os family="windows"/> 1 N/ L( d% ?. q, z. |4 g/ p. O
         </condition>
+ q' w. J3 E; K/ I         <condition property="isMac"> 7 D3 b8 G+ x6 S. h; A2 w# H
                 <os family="mac"/>   E% s3 d! \7 }6 v8 a, r/ m
         </condition> : t3 A) H" Z- l1 m! o
         <condition property="isLinux">
4 c! S6 E( H" W$ N; q0 Q3 u                 <os family="unix"/>
& @$ F! s+ ^& D+ A- }         </condition> / Z/ M- w9 h* u/ m
</target>
; Z; U; Q8 O3 f$ i( i
执行 ant init,当前的运行平台信息会保存在对应的变量中,检查平台是 Mac OS 后就可以进行 iOS 本地应用构建。iOS 目标任务构建包含两部分,构建本地应用和打包本地应用为 ipa 文件。完整的 iOS 构建程序清单如下。
* S9 z5 T& N7 h# @% ]7 w' @! j7 N) `' F' [. c1 P3 |1 P
清单 13. 构建 iOS 本地应用5 u! G+ U/ ~9 N" X& @9 ~+ U- W% K
<target name="build_iOS" if="isMac"
  c) ?8 H# \/ w* Y2 o0 P  depends="init, build_wl_apps, prepare_iOS_build"> ( @8 O, Q# s2 X2 B7 v
         <property name="wlappdir" value="${projectPath}/apps/${appName}" />
" W5 k" s3 S0 v  w4 i* s         <property name="xcodebuildCMD" value="/usr/bin/xcodebuild" />
( s: W7 C0 {/ x9 s2 n: K! i+ A* n         <property name="iosPackageCMD" value="xcrun" /> 5 j; ?( M, `% P/ M+ e+ `
         <property name="xcodebuildCMDlog" value="${outputPath}/xcodebuildCMD.log" /> 2 N5 E# E! q* h1 `2 J
         <property name="iosPackageCMDlog" value="${outputPath}/iosPackageCMD.log" />
- q% `3 Z+ Q1 D$ ~" p         <property name="configuration" value="Ad Hoc" /> 3 }+ @9 _0 @% n9 j$ n

  Q9 b7 @9 `% `% @: X+ R$ I <!-- 构建 iPhone native app -->
) K" ~- }1 `, P! V         <exec 9 w( ]: |* t6 y8 n+ y
                 dir="${wlappdir}/iphone/native"
3 |  O6 [9 w0 d0 U                 executable="${xcodebuildCMD}"' M1 l/ l* s" \4 `4 e( l
                 failonerror="false"9 V1 r2 C+ `" D6 _" s' J
                 output="${xcodebuildCMDlog}"
+ u4 }( C0 c9 E, T0 @                 resultproperty="xcodebuildCMDResult" >
  T& U1 O/ {9 u; h
& C8 P. l2 c) f- n                 <arg line=" -configuration '${configuration}' -sdk iphoneos5.1" />
: f) Z: C& y' ]; M* v. c         </exec> " X: g. N- k4 }- Y  P1 n. N7 E, R0 S
3 X6 \+ ~' `  U7 G# y
         <!-- Package into IPA --> ! s1 T9 K* h; F+ M/ C# R
         <exec
  V5 E  t  d% }! q7 X( K! K0 O8 P                 dir="${wlappdir}/iphone/native"+ {$ E* X' R* s3 V9 |# ^# U! ]: D
                 executable="${iosPackageCMD}"
' \5 e+ L$ y5 \! p$ `5 A                 failonerror="false", C& C0 H- K" N
                 output="${iosPackageCMDlog}"
* c( b/ ^* Z6 m; b                 resultproperty="iosPackageCMDResult" > 0 O0 |9 H5 Z0 s( ^' B
- |7 @: V7 @: H- J
                 <arg value="-sdk" /> , Y% P/ J# r! `/ J  W( ~
                 <arg value="iphoneos" /> - ?2 W0 p' m4 P9 I5 o' S* C! t
                 <arg value="PackageApplication" />
, D. _1 _( T1 B                 <arg value
6 ]. ^- x! W9 U8 ^     ="${wlappdir}/iphone/native/build/Release-iphoneos/${appName}.app" />
; U  c: t  ^- G2 G( t                 <arg value="-o" />
5 H4 g6 R5 D- e$ L                 <arg value="${outputPath}/${appName}.ipa" />
! U& x- s4 X  Z$ [+ Z" ~2 j6 }                 <arg value="--sign" />
" `' l* p* L0 K% E4 E! k                 <arg value="${certificate}" />
/ W! h! v' C+ m; X. H                 <arg value="--embed" />
* v# f: W: F/ u$ D! u' c2 I                 <arg value="${provisioningProfile}"/> , K5 _$ R' g2 L
                 <arg value="-verbose" /> , T$ Y5 m+ D# Y
         </exec> ) t# c" |# E1 b5 g) Z7 ^
</target>
; o! g5 E* C# S4 q& g' H( ?; T' E
构建 iOS ipa 应用需要指定开发者账号 provisioning profile 和 certificate,你可以在 worklight 工程根目录下的 build.properties 文件中指定开发者 provisioning profile 和 certificate。
# x% b5 b% I9 }- a9 q
8 y! b$ Z: @! u8 a清单 14. 指定 iOS 开发者信息1 Q- @9 B+ C- }# P- Y6 x) b
#iOS provisioning profile. Update this for iOS build
3 T& ~7 K* z& R5 t; q" \+ a provisioningProfile=/Users/YourUser/Library/MobileDevice/Provisioning
, E# U* t! L' Z. z( Z: q Profiles/E26327E9-A055-48A5-92A0-FB4850E335BA.mobileprovision
8 e1 F7 h; ?: l, I3 C1 P #iOS certificate. Update this for iOS build
, ^3 w4 p! c/ e# {( s' H certificate=iPhone Developer: Your Name (XZLU45UFKZ)

7 K) ]  b; c, \( ]Worklight 构建出的 iPhone 本地应用默认使用 Entitlements-Release.plist 作为命令行构建配置文件。如果您使用 Xcode4.3.3 执行 iOS 本地应用构建,需要将 Entitlements-Release.plist 文件中的 get-task-allow 属性值修改为 true, 否则生成的 ipa 文件将不能安装到您的 iOS 设备上。% X- h% @; p, {, G- J3 h
+ \' l7 K7 I' T' C- v2 r
清单 15. 修改 Entitlements-Release.plist
: ^$ E; L' T. a! H
<target name="prepare_iOS_build" if="isMac" depends="init"> ( l) [, m8 ^& @
         <echo> set
1 G$ l6 E) R0 c. }+ X% o1 g, M         iOS Entitlements-Release.plist get-task-allow=true</echo> . K8 s, J) W3 B4 w. U, Y
    <replace file 4 r/ z9 W* @' y6 e$ f. r
    ="${projectPath}/apps/${appName}/iphone/native/Entitlements-Release.plist"
3 f  m! E! T2 {; F3 }% ~            token="false"2 Y  N1 v& M8 @' i* b: ]: C; Z
            value="true"/> 3 \$ e! L/ c$ w8 ?  s0 [
</target>
9 y7 i9 C4 W8 w# L( }" |9 ]
由于 Entitlements-Release.plist 中 get-task-allow 属性值默认为 false,且整个文件中仅有一个值为 false,可以使用 ANT 的 replace 任务按照关键字直接查找 false 替换为 true。
6 n) Y/ i1 a) u# J! i关于 replace 任务详细介绍可以参考 http://ant.apache.org/manual/Tasks/replace.html8 ]3 r! u- w5 L: a) o* s" o' v

! X- Q! w, K( q$ a! c3 V9 r
1 J: s# n% y' {; |& S0 r: y1 r/ c& D
部署本地应用到 Worklight App Center
8 o; H0 w# n" K  t# I, [打包好的 Android apk 程序和 iOS ipa 程序可以通过 Ant 发布到 Worklight App Center 上,用户能够直接访问 Worklight App Center 进行安装。在发布本地应用程序前,需要安装并启动 Worklight App Center server,请参考 Application Center User ’ s Guild 完成 Worklight App Center 安装。( R6 W$ y, R8 t. d
Worklight App Center 没有直接定义部署本地应用文件的 Ant 任务,需要复制并修改位于 tools 目录中的 build.xml 完成通过 Ant 发布应用。该目录位于 Worklight 安装目录下 ${install.dir}/ApplicationCenter/tools。
$ I# R$ F! e/ C, _为方便修改 App Center Ant 部署任务,本文直接复制 tools 目录下的 build.xml 文件并重命名为 appcenter.xml, 放置到 sample 的根目录下,如图 4 所示。
% P& ^" ^2 H. a8 v1 b; y$ o- i, K7 L
图 4. 添加 appcenter.xml6 T/ |) b' p% ~3 S6 b

1 F( c) z# r& A/ e在 build.xml 添加 Ant target 调用 appcenter.xml 进行本地应用发布。3 x7 e( B" ~+ N& r; a+ y9 G2 |9 X4 e
! b2 I. x8 _8 M6 {( O* M
清单 16. 调用 appcenter.xml 部署 Worklight 本地应用
: W. Z' G/ m0 |, b& k$ R, n; q! T
<target name="deploy_to_appcenter">
% B" i) [' j, y& \) r, `         <echo message="deploy to application center"/>
6 M( L# W4 F& a/ ~         <ant antfile="${projectPath}/appcenter.xml" target="upload.AllApps">
; j$ u& U+ u6 B/ @                 <property name="server.path"
5 x: u  N) i/ b: I. K" u1 @. @                  value="http://${appCenterHost}:${appCenterPort}"/> $ C+ ^. c) k1 ^, l6 \  {
                 <property name="context.path" value="${appCenterContext}"/> 5 ~% h8 |# n  y# W. {/ u6 P
                 <property name="install.dir" value="D:/workLight/Worklight"/>
/ d" N, e/ o" F0 h8 y                 <property name="workspace.root" value="${outputPath}"/>
# I8 k9 u, m; C9 e# Z( u                 <property name="login.user" value="demo" /> / u) K8 k; \4 \6 {( N6 [/ ]5 w
                 <property name="login.pass" value="demo" /> 2 h% Q2 _* [5 R' E* o; n
         </ant> " B! L; n8 o/ E1 ?0 p2 e0 e
</target>
* g% {! K# H  N& N: n' d
# O( I# H8 V* |
表 7. 调用 appcenter.xml 属性说明
$ A( F9 Z% `/ 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需要发布的本地应用父目录
/ t3 r! q& @6 m' o% q

9 v+ Z7 @4 x1 H! U
- ~. \% s% N7 j' }, j# _/ I9 Y
结束语
; [8 v6 R  c% L1 Q) J7 M) q5 E关于 IBM Worklight 自动化构建和部署的介绍到此就结束了,希望本篇文章能够对使用 IBM Worklight 在开发中进行自动化构建、部署有所帮助和启发。7 P; O# A, h% g& \; U  d0 Q

3 N  N; R1 n! R: O- [. H! e

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

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

GMT+8, 2018-9-20 07:16 , Processed in 0.067746 second(s), 7 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

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