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ù):
引用
#!/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
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