Gradle實戰(zhàn)讀書筆記之二 構(gòu)建塊-掛接到生命周期

為何要掛接到生命周期

有時候當(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容