bingoogolapple.github.io icon indicating copy to clipboard operation
bingoogolapple.github.io copied to clipboard

Gradle

Open bingoogolapple opened this issue 9 years ago • 8 comments

执行流程

  • Initialization 初始化阶段
    • 解析整个工程中所有的 Project 对应的 Project 对象
  • Configuration 配置阶段
    • 解析所有的 Project 对象中的 Task,构建好所有 Task 的拓扑图(有向无环图)
  • Execution 执行阶段
    • 执行具体的 Task 及其依赖 Task

bingoogolapple avatar Feb 15 '16 03:02 bingoogolapple

生命周期监听

  • settings.gradle
log "①初始化阶段 START"
rootProject.name = 'dsl-note'

include ':groovy', ':kotlin'
include ':app'
include ':dirone', ':dirone:moduleone'
include ':moduletwo'
project(':moduletwo').projectDir = new File(settingsDir, 'dirtwo/moduletwo')

gradle.addBuildListener(new BuildListener() {
    @Override
    void buildStarted(Gradle gradle) {
        log "执行阶段开始 BuildListener buildStarted"
    }

    @Override
    void settingsEvaluated(Settings settings) {
        log "①初始化阶段「1」BuildListener settingsEvaluated"
    }

    @Override
    void projectsLoaded(Gradle gradle) {
        log "①初始化阶段「3」BuildListener projectsLoaded"
        log "①初始化阶段 END"
    }

    @Override
    void projectsEvaluated(Gradle gradle) {
        log "③配置阶段结束后「4」BuildListener projectsEvaluated 所有模块的配置阶段都结束了"
    }

    @Override
    void buildFinished(BuildResult result) {
        log "⑨执行阶段完毕「1」BuildListener buildFinished ${result} ${result.action}"
    }
})
gradle.settingsEvaluated { Settings settings ->
    log "①初始化阶段「2」gradle.settingsEvaluated"
}
gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
    @Override
    void beforeEvaluate(Project project) {
        log "②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate ${project.name}"
    }

    @Override
    void afterEvaluate(Project project, ProjectState state) {
        log "③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate ${project.name} ${state}"
    }
})
gradle.beforeProject { Project targetProject ->
    log "②配置阶段开始前「2」gradle.beforeProject ${targetProject.name}"
}
gradle.afterProject { Project targetProject ->
    log "③配置阶段结束后「2」gradle.afterProject ${targetProject.name} =====> ③配置阶段结束后「3」project.afterEvaluate"
}
gradle.projectsEvaluated { Gradle gradle ->
    log "③配置阶段结束后「5」gradle.projectsEvaluated 所有模块的配置阶段都结束了"
}
gradle.buildStarted { Gradle gradle ->
    log "执行阶段开始 buildStarted"
}
gradle.buildFinished { BuildResult buildResult ->
    log "⑨执行阶段完毕「2」buildFinished ${buildResult} ${buildResult.action}"
}
def log(String msg) {
    println "lifecycle ====> settings.gradle ====> ${msg}"
}
  • build.gradle -> lifecycle.gradle
/**
 * doFirst 越后添加的越先执行
 * doLast 越后添加的越后执行
 */
task testLifecycle(group: 'bga') {
    log 'testLifecycle 配置阶段 1'
    doFirst {
        log 'doFirst 1'
    }
    doFirst {
        log 'doFirst 2'
    }
    doLast {
        log 'doLast 1'
    }
    doLast {
        log 'doLast 2'
    }
    log 'testLifecycle 配置阶段 2'
}
testLifecycle.doFirst {
    log 'doFirst 3'
}
testLifecycle.doLast {
    log 'doLast 3'
}
// 配置阶段开始前
project.beforeEvaluate { Project targetProject ->
    log "project.beforeEvaluate ${project.name}"
}
// 配置阶段完毕后。afterProject 之后
project.afterEvaluate { Project targetProject ->
    log "③配置阶段结束后「3」project.afterEvaluate ${project.name}"
    testLifecycle.doFirst {
        log 'doFirst 4'
    }
    testLifecycle.doLast {
        log 'doLast 4'
    }
}
gradle.addListener(new TaskExecutionGraphListener() {
    @Override
    void graphPopulated(TaskExecutionGraph graph) {
        log "④构建好 Task 拓扑图「1」TaskExecutionGraphListener graphPopulated1 ${graph}"
    }
})
gradle.addListener(new TaskExecutionListener() {
    @Override
    void beforeExecute(Task task) {
        if (task.name == 'testLifecycle') {
            // beforeExecute 中可以设置是否可用
//            task.enabled = false
            task.doFirst {
                log 'doFirst 5'
            }
            task.doLast {
                log 'doLast 5'
            }
        }
        log "⑤执行 Task 之前「1」TaskExecutionListener beforeExecute1 ${task}"
    }

    @Override
    void afterExecute(Task task, TaskState state) {
        log "⑧执行 Task 之后「1」TaskExecutionListener afterExecute1 ${task} ${state}"
    }
})
gradle.addListener(new TaskActionListener() {
    @Override
    void beforeActions(Task task) {
        if (task.name == 'testLifecycle') {
            // beforeActions 中不可以设置是否可用
            task.doFirst {
                log 'doFirst 8'
            }
            task.doLast {
                log 'doLast 8'
            }
        }
        log "⑥执行 Task Action 之前,还能添加 Action,但不能修改 Task 是否可用 ==> TaskActionListener beforeActions ${task}"
    }

    @Override
    void afterActions(Task task) {
        log "⑦执行 Task Action 之后 ==> TaskActionListener afterActions ${task}"
    }
})
gradle.taskGraph.whenReady { TaskExecutionGraph graph ->
    log "④构建好 Task 拓扑图「2」whenReady ${graph}"
}
gradle.taskGraph.addTaskExecutionGraphListener(new TaskExecutionGraphListener() {
    @Override
    void graphPopulated(TaskExecutionGraph graph) {
        log "④构建好 Task 拓扑图「3」TaskExecutionGraphListener graphPopulated2 ${graph}"
    }
})
gradle.taskGraph.addTaskExecutionListener(new TaskExecutionListener() {
    @Override
    void beforeExecute(Task task) {
        if (task.name == 'testLifecycle') {
//            task.enabled = false
            task.doFirst {
                log 'doFirst 6'
            }
            task.doLast {
                log 'doLast 6'
            }
        }
        log "⑤执行 Task 之前「2」TaskExecutionListener beforeExecute2 ${task}"
    }

    @Override
    void afterExecute(Task task, TaskState state) {
        log "⑧执行 Task 之后「2」TaskExecutionListener afterExecute2 ${task} ${state}"
    }
})
gradle.taskGraph.beforeTask { Task task ->
    if (task.name == 'testLifecycle') {
//        task.enabled = false
        task.doFirst {
            log 'doFirst 7'
        }
        task.doLast {
            log 'doLast 7'
        }
    }
    log "⑤执行 Task 之前「3」beforeTask ${task}"
}
gradle.taskGraph.afterTask { Task task, TaskState state ->
    log "⑧执行 Task 之后「3」afterTask ${task} ${state}"
}
def log(String msg) {
    println "lifecycle ====> ${project.name} ====> ${msg}"
}
  • 输出
lifecycle ====> settings.gradle ====> ①初始化阶段 START
lifecycle ====> settings.gradle ====> ①初始化阶段「1」BuildListener settingsEvaluated
lifecycle ====> settings.gradle ====> ①初始化阶段「2」gradle.settingsEvaluated
lifecycle ====> settings.gradle ====> ①初始化阶段「3」BuildListener projectsLoaded
lifecycle ====> settings.gradle ====> ①初始化阶段 END
Configuration on demand is an incubating feature.
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate dsl-note
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject dsl-note
lifecycle ====> dsl-note ====> testLifecycle 配置阶段 1
lifecycle ====> dsl-note ====> testLifecycle 配置阶段 2
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate dsl-note project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject dsl-note =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> dsl-note ====> ③配置阶段结束后「3」project.afterEvaluate dsl-note
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate app
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject app
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate app project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject app =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate dirone
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject dirone
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate dirone project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject dirone =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate groovy
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject groovy
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate groovy project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject groovy =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate kotlin
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject kotlin
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate kotlin project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject kotlin =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate moduletwo
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject moduletwo
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate moduletwo project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject moduletwo =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ②配置阶段开始前「1」ProjectEvaluationListener beforeEvaluate moduleone
lifecycle ====> settings.gradle ====> ②配置阶段开始前「2」gradle.beforeProject moduleone
lifecycle ====> settings.gradle ====> ③配置阶段结束后「1」ProjectEvaluationListener afterEvaluate moduleone project state 'EXECUTED'
lifecycle ====> settings.gradle ====> ③配置阶段结束后「2」gradle.afterProject moduleone =====> ③配置阶段结束后「3」project.afterEvaluate
lifecycle ====> settings.gradle ====> ③配置阶段结束后「4」BuildListener projectsEvaluated 所有模块的配置阶段都结束了
lifecycle ====> settings.gradle ====> ③配置阶段结束后「5」gradle.projectsEvaluated 所有模块的配置阶段都结束了
lifecycle ====> dsl-note ====> ④构建好 Task 拓扑图「1」TaskExecutionGraphListener graphPopulated1 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@6ad263e8
lifecycle ====> dsl-note ====> ④构建好 Task 拓扑图「2」whenReady org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@6ad263e8
lifecycle ====> dsl-note ====> ④构建好 Task 拓扑图「3」TaskExecutionGraphListener graphPopulated2 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@6ad263e8
:testLifecycle
lifecycle ====> dsl-note ====> ⑤执行 Task 之前「1」TaskExecutionListener beforeExecute1 task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑤执行 Task 之前「2」TaskExecutionListener beforeExecute2 task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑤执行 Task 之前「3」beforeTask task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑥执行 Task Action 之前,还能添加 Action,但不能修改 Task 是否可用 ==> TaskActionListener beforeActions task ':testLifecycle'
lifecycle ====> dsl-note ====> doFirst 8
lifecycle ====> dsl-note ====> doFirst 7
lifecycle ====> dsl-note ====> doFirst 6
lifecycle ====> dsl-note ====> doFirst 5
lifecycle ====> dsl-note ====> doFirst 4
lifecycle ====> dsl-note ====> doFirst 3
lifecycle ====> dsl-note ====> doFirst 2
lifecycle ====> dsl-note ====> doFirst 1
lifecycle ====> dsl-note ====> doLast 1
lifecycle ====> dsl-note ====> doLast 2
lifecycle ====> dsl-note ====> doLast 3
lifecycle ====> dsl-note ====> doLast 4
lifecycle ====> dsl-note ====> doLast 5
lifecycle ====> dsl-note ====> doLast 6
lifecycle ====> dsl-note ====> doLast 7
lifecycle ====> dsl-note ====> doLast 8
lifecycle ====> dsl-note ====> ⑦执行 Task Action 之后 ==> TaskActionListener afterActions task ':testLifecycle'
lifecycle ====> dsl-note ====> ⑧执行 Task 之后「1」TaskExecutionListener afterExecute1 task ':testLifecycle' org.gradle.api.internal.tasks.TaskStateInternal@6a52d742
lifecycle ====> dsl-note ====> ⑧执行 Task 之后「2」TaskExecutionListener afterExecute2 task ':testLifecycle' org.gradle.api.internal.tasks.TaskStateInternal@6a52d742
lifecycle ====> dsl-note ====> ⑧执行 Task 之后「3」afterTask task ':testLifecycle' org.gradle.api.internal.tasks.TaskStateInternal@6a52d742

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
lifecycle ====> settings.gradle ====> ⑨执行阶段完毕「1」BuildListener buildFinished org.gradle.BuildResult@32bc9db9 Build
lifecycle ====> settings.gradle ====> ⑨执行阶段完毕「2」buildFinished org.gradle.BuildResult@32bc9db9 Build

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

TODO

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

TODO

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

TODO

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

  • Settings
  • Project ✓
    • ScriptHandler ✓
      • RepositoryHandler ✓
      • DependencyHandler ✓
      • ConfigurationContainer ✓
        • Configuration

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

依赖管理

  • 配置冲突解决和缓存策略
configurations.all {
    resolutionStrategy {
        // 强制指定一个版本
        force 'groupId:artifactId:version'
        // 当遇到版本冲突问题时让构建失败
        failOnVersionConflict()
        // 设置缓存动态依赖版本 0 秒超时
        cacheDynamicVersionsFor 0, 'seconds'
        // 配置不缓存 SNAPSHOT 版本
        cacheDynamicVersionsFor 0, 'seconds'
    }
}
configurations.compile.resolutionStrategy {
    // 强制指定一个版本
    force 'groupId:artifactId:version'
    // 当遇到版本冲突问题时让构建失败
    failOnVersionConflict()
    // 设置缓存动态依赖版本 0 秒超时
    cacheDynamicVersionsFor 0, 'seconds'
    // 配置不缓存 SNAPSHOT 版本
    cacheDynamicVersionsFor 0, 'seconds'
}
  • 不编译指定模块
configurations {
    // 设置不编译指定分组下的指定模块
    all*.exclude group: 'groupId', module: 'artifactId'
}
configurations {
    // 设置不编译指定分组下的模块
    all*.exclude group: 'groupId'
}
  • 不编译指定依赖所传递依赖的模块
dependencies {
    // 设置不编译指定分组下的指定模块
    compile('groupId:artifactId:version') {
        exclude group: 'transtiveGroupId', module: 'transtiveArtifactId'
    }
}
dependencies {
    // 设置不编译指定分组下的模块
    compile('groupId:artifactId:version') {
        exclude group: 'transtiveGroupId'
    }
}
  • 排除所有传递依赖
dependencies {
    // 排除所有传递依赖
    compile('groupId:artifactId:version') {
        transitive = false
    }
}
  • 查看依赖关系
gradle dependencies
  • 使用依赖观察报告
gradle -q dependencyInsight --configuration compile --dependency slf4j-api
  • 打印依赖的 jar 文件的存储路径
task printDependencies << {
    configurations.compile.each { dependency ->
        println dependency
    }
}

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

引用本地的 aar

  • 把 aar 文件放在一个或多个文件目录中,比如 meiqiasdk-release.aar 就放在 libs 目录内
  • 在 app 的 build.gradle 文件添加如下内容
repositories {
    flatDir {
        dirs 'libs'
        // 多个目录以逗号分隔,相对路径和绝对路径都可以
        // dirs '../../Meiqia_SDK_For_Android/meiqia/build/outputs/aar', '../../Meiqia_SDK_For_Android/meiqiasdk/build/outputs/aar'
    }
}
  • 之后在其他项目中添加一句 gradle 依赖便方便的引用了该 library
compile(name:'meiqia-release', ext:'aar')
compile(name:'meiqiasdk-release', ext:'aar')

bingoogolapple avatar May 02 '18 14:05 bingoogolapple

解决 Window 系统无法删除 build 目录下 jar 包问题

  • ~/.gradle/init.d/init.gradle
allprojects { project ->
    if (project.path != ':') {
        task unlockBuildDir(type: Exec) {
            String lockhunter = '\"C:\\Program Files\\LockHunter\\LockHunter.exe\"'
            group 'BGA'
            description '解决 Window 系统无法删除 build 目录下 jar 包问题'
            commandLine 'cmd', "$lockhunter", '/delete', '/silent', project.buildDir.getAbsolutePath()
        }
        project.afterEvaluate {
            project.tasks.clean.dependsOn(unlockBuildDir)
        }
    }
}

lockhuntersetup.zip

bingoogolapple avatar Nov 07 '20 13:11 bingoogolapple