鍍金池/ 教程/ 嵌入式/ 使用 Hooks 自定義 build 過程
云端 Cordova
UI 框架 jQuery Mobile
配置文件 config.xml
UI 框架 Ionic Framework
Plugin 開發(fā)
slides & books
應(yīng)用圖標 icon 和啟動頁面 SplashScreen
Sample 工程解析
使用 Hooks 自定義 build 過程
JS 是如何調(diào)用本地 API 的?
deviceready 事件
為 Android APK 簽名
調(diào)試工具 Debug
幾個不可或缺的 lib
環(huán)境搭建(Windows / Android)
Native API 的使用

使用 Hooks 自定義 build 過程

Hooks 本身是一些腳本代碼,可以使用任何語言(比如:nodejs、shell 等),用來自定義 Cordova CLI 命令,位于 Cordova 項目的根目錄 hooks 文件夾下。主要目的是擴展 Cordova CLI 框架,在應(yīng)用的 build 生命周期中插入自定義的 build 構(gòu)建內(nèi)容。

(1)Hooks的種類

①Module-level Hooks

面向的是擴展 Cordova 平臺的,這個是相對比較大的項目的,所以一般都很少用到,有興趣可以去 Google 一下“Cordova EventEmitter method”。
https://www.npmjs.org/package/cordova

②Project-specific Hooks

所有的腳本文件必須放在 Cordova CLI 命令對應(yīng)的 before 或 after 文件夾中。
hooks/before_xxx
hooks/after_xxx
其中 xxx 就是 Cordova CLI 對應(yīng)的命令,比如:prepare、build 等。

(2)腳本執(zhí)行順序

before_xxx 或 after_xxx 文件夾中的腳本文件是按字母的順序排序后依次執(zhí)行的。這里的字母順序還跟使用的平臺有關(guān),比如:Windows 下 ae.js 在 aG.js 之前, 而 Linux 下 aG.js 在 ae.js 之前。所以最好是在你的腳本文件名前添加3到4位的數(shù)字來標示它的順序。 比如:

引用

001_copy_files.js 
010_copy_resources.js 
020_modify_config_files.sh 
120_delete_modified_files.js

(3)Hook 腳本文件

腳本文件被執(zhí)行時,默認會把根目錄路徑作為第一個參數(shù)傳遞給腳本文件。

Node.js

引用

#!/usr/bin/env node 
var fs = require('fs'); 

var rootdir = process.argv[2]; 

// ... using rootdir

Shell Script

引用

#!/bin/sh 

ROOTDIR=$1 

# ... using $ROOTDIR

腳本文件中可以通過環(huán)境變量來獲取其他參數(shù):

  • CORDOVA_VERSION:Cordova CLI 的版本
  • CORDOVA_PLATFORMS:逗號隔開的 platforms 一覽
  • CORDOVA_PLUGINS:逗號隔開的 plugin IDs 一覽
  • CORDOVA_HOOK:執(zhí)行中 hook 的路徑
  • CORDOVA_CMDLINE:Cordova CLI 命令后的參數(shù)

引用

#!/usr/bin/env node 

console.log("process.env.CORDOVA_VERSION: "+process.env.CORDOVA_VERSION); 
console.log("process.env.CORDOVA_PLATFORMS: "+process.env.CORDOVA_PLATFORMS); 
console.log("process.env.CORDOVA_PLUGINS: "+process.env.CORDOVA_PLUGINS); 
console.log("process.env.CORDOVA_HOOK: "+process.env.CORDOVA_HOOK); 
console.log("process.env.CORDOVA_CMDLINE: "+process.env.CORDOVA_CMDLINE);

http://wiki.jikexueyuan.com/project/cordova-3.x-primer-foundation/images/14.1.png" alt="picture14.1" />

在腳本文件中你可以使用腳本語言的所有功能。但是在 build 之前首先要確保你的腳本文件能夠正常執(zhí)行。

(4)停止 build

在 hook 腳本中,我們有時候需要停止整個 build,比如:在 before_prepare 做單元測試的時候,如果測試失敗,就應(yīng)該停止 build。hook 腳本中如果返回值不是0,就會停止 build。

引用

#!/usr/bin/env node 

console.log("unable to complete the hook"); 
process.exit(1);

http://wiki.jikexueyuan.com/project/cordova-3.x-primer-foundation/images/14.2.png" alt="picture14.2" />

(5)常用 Hook

  • 添加工程所需的 plugins(after_platform_add)
  • 拷貝 icons、splash screens 等 resource 到各個平臺(after_prepare)
  • 運行單元測試(before_build)
  • 替換一些配置信息,比如:api 服務(wù)器地址(after_prepare)

Cordova 在 build 的時候是把 www 文件夾原封不動的 Copy 到了 platform 的 www 文件夾中,如果有人反編譯你的 app 文件就能夠獲得你的所有源碼。所以有必要創(chuàng)建一個 hook 來對你的代碼進行安全處理。

根據(jù) JSON 串的定義在 Build 之前生成 menu.xml 來支持 Android 的原生菜單
https://github.com/ktty1220/cordova-native-menu/blob/master/hooks/before_build/native-menu.js

參考:

https://github.com/apache/cordova-cli/blob/master/templates/hooks-README.md
https://leanpub.com/developingwithcordovacli/read
https://gist.github.com/dpogue/4100866
http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/
http://www.mooreds.com/wordpress/cordova-cli