為何要掛接到生命周期
有時候當(dāng)一個特定的生命周期事件發(fā)生時,可能需要執(zhí)行代碼;一個生命周期事件可能發(fā)生在某個構(gòu)建階段之前、期間或之后;
如想在開發(fā)周期中盡可能早的獲得失敗構(gòu)建的反饋信息,就可以編寫回調(diào)生命周期事件,監(jiān)聽構(gòu)建生命周期事件,比如:構(gòu)建失敗,發(fā)送郵件等內(nèi)容;

構(gòu)建生命周期鉤子示例
許多生命周期回調(diào)放在定義在Project和Gradle接口中;
Task執(zhí)行圖的內(nèi)部展示
在配置時,gradle決定在執(zhí)行階段要運(yùn)行的task順序,表示依賴關(guān)系的內(nèi)部結(jié)構(gòu)被建模為一個有向無環(huán)圖(DAG);圖中的每一個task被稱為一個節(jié)點(diǎn),并且每個節(jié)點(diǎn)通過有向邊連接起來;

task依賴關(guān)系通過DAG表示出來
掛接到生命周期
編寫task可改變項目版本,如之前的一些例子,也可以通過編寫生命周期鉤子實現(xiàn)同樣的目標(biāo);
當(dāng)task圖生成完成后,TaskExecutionGraph提供的whenReady方法會被調(diào)用

關(guān)系
在生命周期的方法中,添加鉤子(task生成好之后,立即執(zhí)行閉包代碼):
通過生命周期鉤子實現(xiàn)發(fā)布版本功能:
// 添加鉤子,設(shè)置配置文件
gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
if (taskGraph.hasTask(makeReleaseVersion)) {
if (!version.release) {
version.release = true
ant.propertyfile(file: versionFile) {
entry(key: 'release', type: 'string', operation: '=', value: 'true')
}
}
}
}
實現(xiàn)task執(zhí)行圖監(jiān)聽器
通過監(jiān)聽器掛接到構(gòu)建生命周期有2個步驟:通過在構(gòu)建腳本中編寫類來實現(xiàn)特定的監(jiān)聽器接口 與 注冊監(jiān)聽器實現(xiàn);
監(jiān)聽 task 執(zhí)行圖事件的接口由 TaskExecutionGraphListener 接口提供;
// 實現(xiàn)發(fā)布版本,并且次要版本 + 1
class ReleaseVersionPlusListener implements TaskExecutionGraphListener {
// task路徑需要為 :模塊名:task名
final static String releaseTaskPath = ":common:makeReleaseVersion"
@Override
void graphPopulated(TaskExecutionGraph taskGraph) {
// 是否包含在執(zhí)行圖中
if (taskGraph.hasTask(releaseTaskPath)) {
List<Task> allTasks = taskGraph.getAllTasks();
Task releaseTask = allTasks.find { it.path == releaseTaskPath }
Project project = releaseTask.project // task 對應(yīng)的 project
// 注意這里需要添加 project,因為這里是單獨(dú)的類,
// 需要由task拿其對應(yīng)的project實例
if (!project.version.release) {
project.version.release = true
project.ant.propertyfile(file: project.versionFile) {
entry(key: 'release', type: 'string', operation: '=', value: 'true')
}
project.ant.propertyfile(file: project.versionFile) {
entry(key: 'minor', type: 'int', operation: '+', value: 1)
}
}
}
}
}
添加監(jiān)聽
// --------------------------- 監(jiān)聽生命周期,實現(xiàn)發(fā)布版本,并+1 ---------------------------
// 注冊監(jiān)聽器到task執(zhí)行圖
def releaseListener = new ReleaseVersionPlusListener()
gradle.taskGraph.addTaskExecutionGraphListener(releaseListener)