gpt4 book ai didi

android - Artifact 组装后如何运行shell脚本?

转载 作者:行者123 更新时间:2023-11-29 16:51:40 27 4
gpt4 key购买 nike

我想运行任务 wsUpload,在 assembleMinAPI16ProdRelease 完成 Artifact 组装后运行 shell 脚本将 Artifact 上传到公司服务器。

从此开始:

afterEvaluate {
task wsUpload(type: Exec, dependsOn: assembleMinAPI16ProdRelease) {
def localPropertiesFile = rootProject.file("local.properties");
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))
def WORK_EMAIL = localProperties['WORK_EMAIL']
commandLine '../scripts/ws_upload.sh'
args = [rootProject.ext.VERSION_CODE, WORK_EMAIL]
println("wsUpload start ")
commandLine '../scripts/ws_upload.sh'
// args = [rootProject.ext.VERSION_CODE, WORK_EMAIL]
println("wsUpload end")
}

assembleMinAPI16ProdRelease.doLast {
println("-------------------------------------")
println("---------------DO LAST---------------")
println("-------------------------------------")
crashlyticsUploadDistributionMinAPI16ProdRelease.execute()
}

}

但它在 assembleRelease 完成之前运行。然后我尝试了这个 answer

task wsUpload(type: Exec) {
def localPropertiesFile = rootProject.file("local.properties");
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))
def WORK_EMAIL = localProperties['WORK_EMAIL']
commandLine '../scripts/ws_upload.sh'
args = [rootProject.ext.VERSION_CODE, WORK_EMAIL]
println("wsUpload start ")
doLast {
exec {
commandLine '../scripts/ws_upload.sh'
args = [rootProject.ext.VERSION_CODE, WORK_EMAIL]
println("wsUpload end")
}
}
}

afterEvaluate {

assembleMinAPI16ProdRelease.doLast {
println("-------------------------------------")
println("---------------DO LAST---------------")
println("-------------------------------------")
crashlyticsUploadDistributionMinAPI16ProdRelease.execute()
}
assembleMinAPI16ProdRelease.doLast {
wsUpload.execute()
}
}

给我留下了 > java.lang.NullPointerException(没有错误信息)
然后我尝试将整个 swUpload 设置为 doLast

task wsUpload(type: Exec) << {
def localPropertiesFile = rootProject.file("local.properties");
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))
def WORK_EMAIL = localProperties['WORK_EMAIL']
commandLine '../scripts/ws_upload.sh'
args = [rootProject.ext.VERSION_CODE, WORK_EMAIL]
println("wsUpload start ")
commandLine '../scripts/ws_upload.sh'
args = [rootProject.ext.VERSION_CODE, WORK_EMAIL]
println("wsUpload end")
}

出现错误:

Execution failed for task ':app:wsUpload'.
> execCommand == null!

最佳答案

首先,您需要以正确的方式定义一个任务(阅读关于 配置执行 在 gradle 中),这将是:

task wsUpload(type: Exec) {
def localPropertiesFile = rootProject.file("local.properties");
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))
def WORK_EMAIL = localProperties['WORK_EMAIL']
commandLine '../scripts/ws_upload.sh'
args [rootProject.ext.VERSION_CODE, WORK_EMAIL]
}

现在您需要定义任务之间的执行顺序依赖关系 - 切记永远不要直接在任务实例上调用 execute()!

我想 assembleMinAPI16ProdReleasecrashlyticsUploadDistributionMinAPI16ProdRelease 都是动态任务(在项目评估后创建)所以在 afterEvaluate 中定义依赖关系是明智的> 阻止:

afterEvaluate {
crashlyticsUploadDistributionMinAPI16ProdRelease.dependsOn assembleMinAPI16ProdRelease
crashlyticsUploadDistributionMinAPI16ProdRelease.mustRunAfter assembleMinAPI16ProdRelease
wsUpload.dependsOn crashlyticsUploadDistributionMinAPI16ProdRelease
wsUpload.mustRunAfter crashlyticsUploadDistributionMinAPI16ProdRelease
}

为什么 mustRunAfterdependsOn 都有?不仅要定义依赖关系,还要定义正确的执行顺序。现在您应该能够运行 gradle wsUpload 并且一切正常。

如果您想运行 assembleMinAPI16ProdRelease 并上传 Artifact ,则应使用 finalizedBy:

afterEvaluate {
assembleMinAPI16ProdRelease.finalizedBy crashlyticsUploadDistributionMinAPI16ProdRelease
crashlyticsUploadDistributionMinAPI16ProdRelease.finalizedBy wsUpload
}

请注意,由于我不是 Android 开发人员,我无法正确测试它 - 所以如果它不起作用,请在投反对票之前告诉我 ;)

关于android - Artifact 组装后如何运行shell脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46283371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com