{"id":4673,"date":"2024-11-06T11:30:26","date_gmt":"2024-11-06T03:30:26","guid":{"rendered":"https:\/\/qaqaq.top\/?p=4673"},"modified":"2024-11-06T14:46:52","modified_gmt":"2024-11-06T06:46:52","slug":"gradle-%e8%bf%9b%e9%98%b6%e8%af%b4%e6%98%8e-%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f%e4%b8%adhook","status":"publish","type":"post","link":"https:\/\/qaqaq.top\/?p=4673","title":{"rendered":"Gradle \u8fdb\u9636\u8bf4\u660e-\u751f\u547d\u5468\u671f\u4e2dHook"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">9\u3001\u751f\u547d\u5468\u671f\u4e2dHook<\/h2>\n\n\n\n<p>\u751f\u547d\u5468\u671f\u4e2d\u7684\u8fd9\u4e9b\u94a9\u5b50\u51fd\u6570\u90fd\u662f\u7531 gradle \u81ea\u52a8\u56de\u8c03\u5b8c\u6210\u7684,\u5229\u7528\u8fd9\u4e9b\u94a9\u5b50\u51fd\u6570\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5b9e\u73b0\u4e00\u4e9b\u6211\u4eec\u60f3\u8981\u7684\u529f\u80fd\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qaqaq.top\/wp-content\/uploads\/2024\/11\/image-2.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"898\" height=\"405\" data-original=\"https:\/\/qaqaq.top\/wp-content\/uploads\/2024\/11\/image-2.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-4678\"  sizes=\"(max-width: 898px) 100vw, 898px\" \/><\/div><\/figure>\n\n\n\n<p id=\"220baaef8046a96c911c3d799b6b3de9\">Gradle \u5728\u751f\u547d\u5468\u671f\u5404\u4e2a\u9636\u6bb5\u90fd\u63d0\u4f9b\u4e86\u7528\u4e8e\u56de\u8c03\u7684\u94a9\u5b50\u51fd\u6570:<\/p>\n\n\n\n<p id=\"178f2a6f25c186c5e95d1373a61c9f46\">Gradle \u521d\u59cb\u5316\u9636\u6bb5:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728 settings.gradle \u6267\u884c\u5b8c\u540e,\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 settingsEvaluated \u65b9\u6cd5<\/li>\n\n\n\n<li>\u5728\u6784\u5efa\u6240\u6709\u5de5\u7a0b build.gradle \u5bf9\u5e94\u7684 Project \u5bf9\u8c61\u540e,\u4e5f\u65e2\u521d\u59cb\u5316\u9636\u6bb5\u5b8c\u6bd5,\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684projectsLoaded \u65b9\u6cd5<\/li>\n<\/ul>\n\n\n\n<p id=\"c64df2f9ae3446ce4b7af5df9f08660c\">Gradle \u914d\u7f6e\u9636\u6bb5:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gradle \u4f1a\u5faa\u73af\u6267\u884c\u6bcf\u4e2a\u5de5\u7a0b\u7684 build.gradle \u811a\u672c\u6587\u4ef6<\/li>\n\n\n\n<li>\u5728\u6267\u884c\u5f53\u524d\u5de5\u7a0b build.gradle \u524d,\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 beforeProject \u65b9\u6cd5\u548c\u5f53\u524d Project \u5bf9\u8c61\u7684beforeEvaluate \u65b9\u6cd5, \u867d\u7136 beforeEvalute \u5c5e\u4e8e project \u7684\u751f\u547d\u5468\u671f, \u4f46\u662f\u6b64\u65f6 build script \u5c1a\u672a\u88ab\u52a0\u8f7d,\u6240\u4ee5 beforeEvaluate \u7684\u8bbe\u7f6e\u4f9d\u7136\u8981\u5728 init script \u6216 setting script \u4e2d\u8fdb\u884c,\u4e0d\u8981\u5728 build script \u4e2d\u4f7f\u7528project.beforeEvaluate \u65b9\u6cd5\u3002<\/li>\n\n\n\n<li>\u5728\u6267\u884c\u5f53\u524d\u5de5\u7a0b build.gradle \u540e,\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 afterProject \u65b9\u6cd5\u548c\u5f53\u524d Project \u5bf9\u8c61\u7684afterEvaluate \u65b9\u6cd5<\/li>\n\n\n\n<li>\u5728\u6240\u6709\u5de5\u7a0b\u7684 build.gradle \u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 projectsEvaluated \u65b9\u6cd5<\/li>\n\n\n\n<li>\u5728\u6784\u5efa Task \u4f9d\u8d56\u6709\u5411\u65e0\u73af\u56fe\u540e,\u4e5f\u5c31\u662f\u914d\u7f6e\u9636\u6bb5\u5b8c\u6bd5,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 whenReady \u65b9\u6cd5<\/li>\n<\/ul>\n\n\n\n<p id=\"d757d746427e86f91c8301fcba9de4d6\">Gradle \u6267\u884c\u9636\u6bb5:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gradle \u4f1a\u5faa\u73af\u6267\u884c Task \u53ca\u5176\u4f9d\u8d56\u7684 Task<\/li>\n\n\n\n<li>\u5728\u5f53\u524d Task \u6267\u884c\u4e4b\u524d,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 beforeTask \u65b9\u6cd5<\/li>\n\n\n\n<li>\u5728\u5f53\u524d Task \u6267\u884c\u4e4b\u540e,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 afterTask \u65b9\u6cd5<\/li>\n<\/ul>\n\n\n\n<p>\u5f53\u6240\u6709\u7684 Task \u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 buildFinish \u65b9\u6cd5\u3002<\/p>\n\n\n\n<p id=\"0ae923641ae09b48c50894d5f7da4903\"><strong>\u63d0\u793a\uff1a<\/strong>Gradle \u6267\u884c\u811a\u672c\u6587\u4ef6\u7684\u65f6\u5019\u4f1a\u751f\u6210\u5bf9\u5e94\u7684\u5b9e\u4f8b\uff0c\u4e3b\u8981\u6709\u5982\u4e0b\u51e0\u79cd\u5bf9\u8c61\uff1a<\/p>\n\n\n\n<p id=\"96f2edc85751daabd4a9244d01422fa9\">1\u3001Gradle \u5bf9\u8c61\uff1a\u5728\u9879\u76ee\u521d\u59cb\u5316\u65f6\u6784\u5efa\uff0c\u5168\u5c40\u5355\u4f8b\u5b58\u5728\uff0c\u53ea\u6709\u8fd9\u4e00\u4e2a\u5bf9\u8c61<br>2\u3001Project \u5bf9\u8c61\uff1a<strong>\u6bcf\u4e00\u4e2a build.gradle \u6587\u4ef6 <\/strong>\u90fd\u4f1a\u8f6c\u6362\u6210\u4e00\u4e2a Project \u5bf9\u8c61,\u7c7b\u4f3c\u4e8e maven \u4e2d\u7684 pom.xml \u6587\u4ef6<br>3\u3001Settings \u5bf9\u8c61\uff1asettings.gradle \u4f1a\u8f6c\u53d8\u6210\u4e00\u4e2a settings \u5bf9\u8c61,\u548c\u6574\u4e2a\u9879\u76ee\u662f\u4e00\u5bf9\u4e00\u7684\u5173\u7cfb,\u4e00\u822c\u53ea\u7528\u5230include \u65b9\u6cd5<br>4.\u3001Task \u5bf9\u8c61: \u4ece\u524d\u9762\u7684\u6709\u5411\u65e0\u73af\u56fe\u4e2d\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u770b\u51fa\uff0cgradle \u6700\u7ec8\u662f\u57fa\u4e8e Task \u7684,\u4e00\u4e2a\u9879\u76ee\u53ef\u4ee5\u6709\u4e00\u4e2a\u6216\u8005\u591a\u4e2a Task<\/p>\n\n\n\n<p id=\"8b4db535fd52b365758eb7c84c044c34\">\u94a9\u5b50\u51fd\u6570\u4ee3\u7801\u6f14\u793a\uff1a\u9879\u76ee\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qaqaq.top\/wp-content\/uploads\/2024\/11\/image-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"298\" height=\"312\" data-original=\"https:\/\/qaqaq.top\/wp-content\/uploads\/2024\/11\/image-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-4688\"  sizes=\"(max-width: 298px) 100vw, 298px\" \/><\/div><\/figure>\n\n\n\n<p>\u5728root project \u7684 settings.gradle \u6587\u4ef6\u4e2d\u6dfb\u52a0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gradle.settingsEvaluated { \/\/1.settingsEvaluated\u94a9\u5b50\u51fd\u6570,\u5728\u521d\u59cb\u5316\u9636\u6bb5\u5b8c\u6210\n    println \"settingsEvaluated\"\n}\ngradle.projectsLoaded { \/\/2.projectsLoaded\u94a9\u5b50\u51fd\u6570,\u5728\u521d\u59cb\u5316\u9636\u6bb5\u5b8c\u6210\n    println \"projectsLoaded\"\n}\n\/\/\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf\uff1a\u8868\u793a\u5f53\u524d\u9879\u76ee\u540d,\u5728\u6bcf\u6b21\u6267\u884c\u67d0\u4e2a\u9879\u76ee\u7684beforeEvaluate\u65b9\u6cd5\u65f6\u5148\u7ed9projectName\u53d8\u91cf\u8d4b\u503c\n\/\/\u8fd9\u6837\u65b9\u4fbf\u5728\uff1agradle.beforeProject\u548cafterProject\u4e24\u4e2a\u94a9\u5b50\u51fd\u6570\u4f7f\u7528\u3002\ndef projectName=\"\"\ngradle.addProjectEvaluationListener( new ProjectEvaluationListener(){\n    \/\/3.\u6267\u884c\u5404\u4e2aproject\u7684beforeEvaluate\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\n    @Override\n    void beforeEvaluate(Project project) {\n        projectName=project.name\n        println \"${project.name} Project beforeEvaluate\"\n    }\n    \/\/5.\u6267\u884c\u5404\u4e2aproject\u7684afterEvaluate\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210@Override\n    void afterEvaluate(Project project, ProjectState projectState) {\n        println \"${project.name} Project afterEvaluate\"\n    }\n});\ngradle.beforeProject {\/\/4.\u6267\u884c\u5404\u4e2aproject\u7684beforeProject\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\n    println \"${projectName} beforeProject...\"\n}\ngradle.afterProject {\/\/6.\u6267\u884c\u5404\u4e2aproject\u7684afterProject\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\n    println \"${projectName} afterProject...\"\n}\n\/\/7.\u6240\u6709\u5de5\u7a0b\u7684 build.gradle \u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 projectsEvaluated \u65b9\u6cd5\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\ndef rootProjectName=rootProject.getName()\ngradle.projectsEvaluated {\n    println \"${rootProjectName} projectsEvaluated...\"\n}\n\/\/8.\u914d\u7f6e\u9636\u6bb5\u5b8c\u6bd5\u540e\uff0c\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 whenReady \u65b9\u6cd5\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\ngradle.taskGraph.whenReady {\n    println \"${rootProjectName} taskGraph whenReady...\"\n}\n\n\/\/9.\u5728\u5f53\u524dTask\u6267\u884c\u4e4b\u524d,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 beforeTask\u65b9\u6cd5\uff1a\u5728\u6267\u884c\u9636\u6bb5\u5b8c\u6210\ngradle.taskGraph.beforeTask {task ->\n    println \"this is the task ${task.name} of the project ${task.getProject().name} beforeTask..\"\n}\n\/\/10.\u5728\u5f53\u524dTask\u6267\u884c\u4e4b\u540e,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 afterTask\u65b9\u6cd5\uff1a\u5728\u6267\u884c\u9636\u6bb5\u5b8c\u6210\ngradle.taskGraph.afterTask {task ->\n    println \"this is the task ${task.name} of the project ${task.getProject().name}  afterTask..\"\n}\n\/\/11.\u5f53\u6240\u6709\u7684 Task \u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 buildFinish \u65b9\u6cd5\uff1a\u5728\u6267\u884c\u9636\u6bb5\u5b8c\u6210\ngradle.buildFinished {\n    println \"${rootProjectName} buildFinished...\"\n}<\/code><\/pre>\n\n\n\n<p>\u5728 root \u7684 build.gradle \u6587\u4ef6\u4e2d\u6dfb\u52a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>task A {\n    println \"root taskA\"\n    doFirst(){\n        println \"root taskA doFirst\"\n    }\n    doLast(){\n        println \"root taskA doLast\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5728 subject01 \u7684 build.gradle \u6587\u4ef6\u4e2d\u6dfb\u52a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>task B {\n    println \"SubProject01 taskB\"\n    doFirst(){\n        println \"SubProject01 taskB doFirst\"\n    }\n    doLast(){\n        println \"SubProject01 taskB doLast\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5728 subject02 \u7684 build.gradle \u6587\u4ef6\u4e2d\u6dfb\u52a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/task C \u5728\u4e0a\u9762\ntask C{\n    \/\/ \u4f9d\u8d56task D\n    dependsOn 'D'\n    println \"SubProject02 taskC\"\n    doFirst(){\n        println \"SubProject02 taskC doFirst\"\n    }\n    doLast(){\n        println \"SubProject02 taskC doLast\"\n    }\n}\n\/\/task D \u5728\u4e0b\u9762\ntask D {\n    println \"SubProject02 taskD\"\n    doFirst(){\n        println \"SubProject02 taskD doFirst\"\n    }\n    doLast(){\n        println \"SubProject02 taskD doLast\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\uff1a\u5728 root \u5de5\u7a0b\u7684\u6839\u76ee\u5f55\u6267\u884c\uff1agradle C .\u5c31\u80fd\u770b\u5230 gradle \u751f\u547d\u5468\u671f\u7684\u4e09\u4e2a\u9636\u6bb5\uff0c\u53ca\u6bcf\u4e2a\u9636\u6bb5\u6267\u884c\u7684\u94a9\u5b50\u51fd\u6570\u3001\u8fd8\u6709\u5728\u6267\u884c\u9636\u6bb5\u6709\u4f9d\u8d56\u5173\u7cfb\u7684\u4efb\u52a1\u7684\u6267\u884c\u987a\u5e8f\u95ee\u9898\u3002<\/p>\n\n\n\n<p>\u62d3\u5c55 1\uff1a\u5728 settings.gradle \u4e2d\u6dfb\u52a0\u76d1\u542c\u5668\uff0c<strong>\u67e5\u770b task \u6709\u5411\u65e0\u73af\u56fe<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gradle.taskGraph.addTaskExecutionGraphListener(new TaskExecutionGraphListener() { \n    @Override \/\/ \u751f\u6210\u6709\u5411\u65e0\u73af\u56fe\n    void graphPopulated(TaskExecutionGraph taskExecutionGraph) { \n        taskExecutionGraph.allTasks.forEach(task->{\/\/\u6838\u5fc3\u903b\u8f91:\u901a\u8fc7taskExecutionGraph\u83b7\u5f97\u6240\u6709\u7684task\n            taskExecutionGraph.allTasks.forEach(releaseTask->{\n                println \"\u5c1a\u7845\u8c37:\" + releaseTask.getProject().name + \":\" + releaseTask.name\n            })\n        })\n    }\n})<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\uff1a\u5728 root \u5de5\u7a0b\u6839\u76ee\u5f55\u4e0b\u6267\u884c\uff1agradle C\u3002\u67e5\u770b\u6d4b\u8bd5\u7ed3\u679c\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/qaqaq.top\/wp-content\/uploads\/2024\/11\/image-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"129\" data-original=\"https:\/\/qaqaq.top\/wp-content\/uploads\/2024\/11\/image-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-4691\"\/><\/div><\/figure>\n\n\n\n<p id=\"e74916aa08987032b1ea583b9d80813e\">\u62d3\u5c55 2: \u8ba1\u7b97 Gradle \u6784\u5efa\u8fc7\u7a0b\u4e2d\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6:\u9700\u8981\u6ce8\u610f\uff0c\u8fd9\u91cc\u53ea\u662f\u8ba1\u7b97\u4e86\u521d\u59cb\u5316\u9636\u6bb5\u7684 settings \u6587\u4ef6\uff0c\u5e76\u6ca1\u6709\u8ba1\u7b97<\/p>\n\n\n\n<p id=\"12f30572c8854dd777367d72fc07d3f0\">init.gradle \u521d\u59cb\u5316\u7684\u65f6\u95f4\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def projectName=rootProject.getName() \/\/\u5b9a\u4e49\u9879\u76ee\u540d\nlong beginOfSetting = System.currentTimeMillis() \/\/\u521d\u59cb\u5316\u9636\u6bb5\u5f00\u59cb\u65f6\u95f4\ndef beginOfConfig \/\/ \u914d\u7f6e\u9636\u6bb5\u5f00\u59cb\u65f6\u95f4\ndef configHasBegin = false \/\/\u914d\u7f6e\u9636\u6bb5\u662f\u5426\u5f00\u59cb\u4e86\uff0c\u53ea\u6267\u884c\u4e00\u6b21\ndef beginOfProjectConfig = new HashMap() \/\/\u5b58\u653e\u6bcf\u4e2abuild.gradle \u6267\u884c\u4e4b\u524d\u7684\u65f6\u95f4\ndef beginOfTaskExecute \/\/ \u6267\u884c\u9636\u6bb5\u5f00\u59cb\u65f6\u95f4\ngradle.projectsLoaded { \/\/ \u521d\u59cb\u5316\u9636\u6bb5\u6267\u884c\u5b8c\u6bd5\n    println \"${projectName}\u5de5\u7a0b \u521d\u59cb\u5316\u603b\u8017\u65f6  ${System.currentTimeMillis() - beginOfSetting} ms\"\n}\n\/\/build.gradle \u6267\u884c\u524d\ngradle.beforeProject {Project project ->\n    if(!configHasBegin){\n        configHasBegin = true\n        beginOfConfig = System.currentTimeMillis()\n    }\n    beginOfProjectConfig.put(project,System.currentTimeMillis())\n}\n\/\/build.gradle \u6267\u884c\u540e\ngradle.afterProject {Project project ->\n    def begin = beginOfProjectConfig.get(project)\n    if(project.name == projectName) {\n        println \"\u6839\u5de5\u7a0b${projectName} \u914d\u7f6e\u9636\u6bb5\u8017\u65f6\uff1a${System.currentTimeMillis() - begin} ms\"\n    }else{\n        println \"\u5b50\u5de5\u7a0b${project.name} \u914d\u7f6e\u9636\u6bb5\u8017\u65f6\uff1a${System.currentTimeMillis() - begin} ms\"\n    }\n}\ngradle.taskGraph.whenReady {\/\/\u914d\u7f6e\u9636\u6bb5\u5b8c\u6bd5\n    println \"\u6574\u4e2a${projectName}\u9879\u76ee\u5728\u914d\u7f6e\u9636\u6bb5\u603b\u8017\u65f6\uff1a${System.currentTimeMillis() - beginOfConfig} ms\"\n    beginOfTaskExecute = System.currentTimeMillis()\n}\n\/\/\u6267\u884c\u9636\u6bb5\u5f00\u59cb\ngradle.taskGraph.beforeTask {Task task ->\n    task.doFirst {\n        task.ext.beginOfTask = System.currentTimeMillis()\n    }\n    task.doLast {\n        println \"${task.name}\u5728\u6267\u884c\u9636\u6bb5\u8017\u65f6\uff1a${System.currentTimeMillis() - task.ext.beginOfTask} ms\"\n    }\n}\ngradle.buildFinished {\/\/\u6267\u884c\u9636\u6bb5\u5b8c\u6bd5\n    println \" \u6267\u884c\u9636\u6bb5\u603b\u8017\u65f6\uff1a${System.currentTimeMillis() - beginOfTaskExecute} ms\"\n    println \" \u6574\u4e2a\u6784\u5efa\u8fc7\u7a0b\u8017\u65f6\uff1a${System.currentTimeMillis() - beginOfSetting} ms\"\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u6211\u7684\u4ee3\u7801<\/p>\n\n\n\n<p>settings.gradle<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/9\u3001\u751f\u547d\u5468\u671f\u4e2dHook\n\/\/Initialization\ngradle.settingsEvaluated { \/\/1.settingsEvaluated\u94a9\u5b50\u51fd\u6570,\u5728\u521d\u59cb\u5316\u9636\u6bb5\u5b8c\u6210\n    println \"settingsEvaluated\"\n}\ngradle.projectsLoaded { \/\/2.projectsLoaded\u94a9\u5b50\u51fd\u6570,\u5728\u521d\u59cb\u5316\u9636\u6bb5\u5b8c\u6210\n    println \"projectsLoaded\"\n}\n\n\/\/Configuration\n\/\/\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf\uff1a\u8868\u793a\u5f53\u524d\u9879\u76ee\u540d,\u5728\u6bcf\u6b21\u6267\u884c\u67d0\u4e2a\u9879\u76ee\u7684beforeEvaluate\u65b9\u6cd5\u65f6\u5148\u7ed9projectName\u53d8\u91cf\u8d4b\u503c\n\/\/\u8fd9\u6837\u65b9\u4fbf\u5728\uff1agradle.beforeProject\u548cafterProject\u4e24\u4e2a\u94a9\u5b50\u51fd\u6570\u4f7f\u7528\u3002\ndef projectName=\"\"\ngradle.addProjectEvaluationListener( new ProjectEvaluationListener(){\n    \/\/3.\u6267\u884c\u5404\u4e2aproject\u7684beforeEvaluate\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\n    @Override\n    void beforeEvaluate(Project project) {\n        projectName=project.name\n        println \"${project.name} Project beforeEvaluate\"\n    }\n    \/\/5.\u6267\u884c\u5404\u4e2aproject\u7684afterEvaluate\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210@Override\n    void afterEvaluate(Project project, ProjectState projectState) {\n        println \"${project.name} Project afterEvaluate\"\n    }\n});\n\ngradle.beforeProject {\/\/4.\u6267\u884c\u5404\u4e2aproject\u7684beforeProject\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\n    println \"${projectName} beforeProject...\"\n}\ngradle.afterProject {\/\/6.\u6267\u884c\u5404\u4e2aproject\u7684afterProject\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\n    println \"${projectName} afterProject...\"\n}\n\n\/\/7.\u6240\u6709\u5de5\u7a0b\u7684 build.gradle \u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 projectsEvaluated \u65b9\u6cd5\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\ndef rootProjectName=rootProject.getName()\ngradle.projectsEvaluated {\n    println \"${rootProjectName} projectsEvaluated...\"\n}\n\n\/\/8.\u914d\u7f6e\u9636\u6bb5\u5b8c\u6bd5\u540e\uff0c\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 whenReady \u65b9\u6cd5\uff1a\u5728\u914d\u7f6e\u9636\u6bb5\u5b8c\u6210\ngradle.taskGraph.whenReady {\n    println \"${rootProjectName} taskGraph whenReady...\"\n}\n\n\/\/execution\n\/\/9.\u5728\u5f53\u524dTask\u6267\u884c\u4e4b\u524d,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 beforeTask\u65b9\u6cd5\uff1a\u5728\u6267\u884c\u9636\u6bb5\u5b8c\u6210\ngradle.taskGraph.beforeTask {task ->\n    println \"this is the task ${task.name} of the project ${task.getProject().name} beforeTask..\"\n}\n\n\/\/10.\u5728\u5f53\u524dTask\u6267\u884c\u4e4b\u540e,\u4f1a\u56de\u8c03 TaskExecutionGraph \u5bf9\u8c61\u7684 afterTask\u65b9\u6cd5\uff1a\u5728\u6267\u884c\u9636\u6bb5\u5b8c\u6210\ngradle.taskGraph.afterTask {task ->\n    println \"this is the task ${task.name} of the project ${task.getProject().name}  afterTask..\"\n}\n\n\/\/11.\u5f53\u6240\u6709\u7684 Task \u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u4f1a\u56de\u8c03 Gradle \u5bf9\u8c61\u7684 buildFinish \u65b9\u6cd5\uff1a\u5728\u6267\u884c\u9636\u6bb5\u5b8c\u6210\ngradle.buildFinished {\n    println \"${rootProjectName} buildFinished...\"\n}<\/code><\/pre>\n\n\n\n<p>build.gradle<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/9\u3001\u751f\u547d\u5468\u671f\u4e2dHook\ntask A {\n    println \"root taskA\"\n    doFirst(){\n        println \"root taskA doFirst\"\n    }\n    doLast(){\n        println \"root taskA doLast\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>groovy-subproject01 \u7684 build.gradle<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/9\u3001\u751f\u547d\u5468\u671f\u4e2dHook\ntask B {\n    println \"SubProject01 taskB\"\n    doFirst(){\n        println \"SubProject01 taskB doFirst\"\n    }\n    doLast(){\n        println \"SubProject01 taskB doLast\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>groovy-subproject02 \u7684 build.gradle<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/9\u3001\u751f\u547d\u5468\u671f\u4e2dHook\n\/\/task C \u5728\u4e0a\u9762\ntask C{\n    \/\/ \u4f9d\u8d56task D\n    dependsOn 'D'\n    println \"SubProject02 taskC\"\n    doFirst(){\n        println \"SubProject02 taskC doFirst\"\n    }\n    doLast(){\n        println \"SubProject02 taskC doLast\"\n    }\n}\n\/\/task D \u5728\u4e0b\u9762\ntask D {\n    println \"SubProject02 taskD\"\n    doFirst(){\n        println \"SubProject02 taskD doFirst\"\n    }\n    doLast(){\n        println \"SubProject02 taskD doLast\"\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u62d3\u5c552\uff0csettings.gradle<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u62d3\u5c552\ndef projectName=rootProject.getName() \/\/\u5b9a\u4e49\u9879\u76ee\u540d\nlong beginOfSetting = System.currentTimeMillis() \/\/\u521d\u59cb\u5316\u9636\u6bb5\u5f00\u59cb\u65f6\u95f4\ndef beginOfConfig \/\/ \u914d\u7f6e\u9636\u6bb5\u5f00\u59cb\u65f6\u95f4\ndef configHasBegin = false \/\/\u914d\u7f6e\u9636\u6bb5\u662f\u5426\u5f00\u59cb\u4e86\uff0c\u53ea\u6267\u884c\u4e00\u6b21\ndef beginOfProjectConfig = new HashMap() \/\/\u5b58\u653e\u6bcf\u4e2abuild.gradle \u6267\u884c\u4e4b\u524d\u7684\u65f6\u95f4\ndef beginOfTaskExecute \/\/ \u6267\u884c\u9636\u6bb5\u5f00\u59cb\u65f6\u95f4\ngradle.projectsLoaded { \/\/ \u521d\u59cb\u5316\u9636\u6bb5\u6267\u884c\u5b8c\u6bd5\n    println \"${projectName}\u5de5\u7a0b \u521d\u59cb\u5316\u603b\u8017\u65f6  ${System.currentTimeMillis() - beginOfSetting} ms\"\n}\n\/\/build.gradle \u6267\u884c\u524d\ngradle.beforeProject {Project project ->\n    if(!configHasBegin){\n        configHasBegin = true\n        beginOfConfig = System.currentTimeMillis()\n    }\n    beginOfProjectConfig.put(project,System.currentTimeMillis())\n}\n\/\/build.gradle \u6267\u884c\u540e\ngradle.afterProject {Project project ->\n    def begin = beginOfProjectConfig.get(project)\n    if(project.name == projectName) {\n        println \"\u6839\u5de5\u7a0b${projectName} \u914d\u7f6e\u9636\u6bb5\u8017\u65f6\uff1a${System.currentTimeMillis() - begin} ms\"\n    }else{\n        println \"\u5b50\u5de5\u7a0b${project.name} \u914d\u7f6e\u9636\u6bb5\u8017\u65f6\uff1a${System.currentTimeMillis() - begin} ms\"\n    }\n}\ngradle.taskGraph.whenReady {\/\/\u914d\u7f6e\u9636\u6bb5\u5b8c\u6bd5\n    println \"\u6574\u4e2a${projectName}\u9879\u76ee\u5728\u914d\u7f6e\u9636\u6bb5\u603b\u8017\u65f6\uff1a${System.currentTimeMillis() - beginOfConfig} ms\"\n    beginOfTaskExecute = System.currentTimeMillis()\n}\n\/\/\u6267\u884c\u9636\u6bb5\u5f00\u59cb\ngradle.taskGraph.beforeTask {Task task ->\n    task.doFirst {\n        task.ext.beginOfTask = System.currentTimeMillis()\n    }\n    task.doLast {\n        println \"${task.name}\u5728\u6267\u884c\u9636\u6bb5\u8017\u65f6\uff1a${System.currentTimeMillis() - task.ext.beginOfTask} ms\"\n    }\n}\ngradle.buildFinished {\/\/\u6267\u884c\u9636\u6bb5\u5b8c\u6bd5\n    println \" \u6267\u884c\u9636\u6bb5\u603b\u8017\u65f6\uff1a${System.currentTimeMillis() - beginOfTaskExecute} ms\"\n    println \" \u6574\u4e2a\u6784\u5efa\u8fc7\u7a0b\u8017\u65f6\uff1a${System.currentTimeMillis() - beginOfSetting} ms\"\n}<\/code><\/pre>\n\n\n\n<p>\u62d3\u5c552\uff0cgroovy-subproject02 \u7684 build.gradle<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/9\u3001\u751f\u547d\u5468\u671f\u4e2dHook\n\/\/task C \u5728\u4e0a\u9762\ntask C{\n    \/\/ \u4f9d\u8d56task D\n    dependsOn 'D'\n    println \"SubProject02 taskC\"\n    doFirst(){\n        println \"SubProject02 taskC doFirst\"\n    }\n    doLast(){\n        println \"SubProject02 taskC doLast\"\n    }\n}\n\/\/task D \u5728\u4e0b\u9762\ntask D {\n    println \"SubProject02 taskD\"\n    doFirst(){\n        println \"SubProject02 taskD doFirst\"\n    }\n    doLast(){\n        println \"SubProject02 taskD doLast\"\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>9\u3001\u751f\u547d\u5468\u671f\u4e2dHook \u751f\u547d\u5468\u671f\u4e2d\u7684\u8fd9\u4e9b\u94a9\u5b50\u51fd\u6570\u90fd\u662f\u7531 gradle \u81ea\u52a8\u56de\u8c03\u5b8c\u6210\u7684,\u5229\u7528\u8fd9\u4e9b\u94a9\u5b50\u51fd\u6570\u53ef\u4ee5\u5e2e\u52a9 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[175],"tags":[181],"class_list":["post-4673","post","type-post","status-publish","format-standard","hentry","category-gradle-","tag-gradle"],"_links":{"self":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts\/4673"}],"collection":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4673"}],"version-history":[{"count":18,"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts\/4673\/revisions"}],"predecessor-version":[{"id":4697,"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts\/4673\/revisions\/4697"}],"wp:attachment":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}