Android 如何在工件组装后运行shell脚本?

Android 如何在工件组装后运行shell脚本?,android,gradle,Android,Gradle,我想运行taskwsUpload,它在assembleminapi16prodelease完成工件装配后运行shell脚本将工件上传到公司服务器 从这一点出发: afterEvaluate{ 任务wsUpload(类型:Exec,dependsOn:assembleMinAPI16ProdRelease){ def localPropertiesFile=rootProject.file(“local.properties”); def localProperties=新属性() load(新文

我想运行task
wsUpload
,它在
assembleminapi16prodelease
完成工件装配后运行shell脚本将工件上传到公司服务器

从这一点出发:

afterEvaluate{
任务wsUpload(类型:Exec,dependsOn:assembleMinAPI16ProdRelease){
def localPropertiesFile=rootProject.file(“local.properties”);
def localProperties=新属性()
load(新文件输入流(localPropertiesFile))
def WORK_EMAIL=localProperties['WORK_EMAIL']
命令行“../scripts/ws_upload.sh”
args=[rootProject.ext.VERSION\u代码,工作\u电子邮件]
println(“wsUpload启动”)
命令行“../scripts/ws_upload.sh”
//args=[rootProject.ext.VERSION\u代码,工作\u电子邮件]
println(“wsUpload end”)
}
AssembleMiniAPI16ProdRelease.doLast{
println(“-----------------------------------------”)
println(“--------------最后做--------------------”)
println(“-----------------------------------------”)
crashlyticsUploadDistributionMinAPI16ProdRelease.execute()
}
}
但它在组装完成之前运行。 然后我试着像这样

任务wsUpload(类型:Exec){
def localPropertiesFile=rootProject.file(“local.properties”);
def localProperties=新属性()
load(新文件输入流(localPropertiesFile))
def WORK_EMAIL=localProperties['WORK_EMAIL']
命令行“../scripts/ws_upload.sh”
args=[rootProject.ext.VERSION\u代码,工作\u电子邮件]
println(“wsUpload启动”)
多拉斯特{
执行官{
命令行“../scripts/ws_upload.sh”
args=[rootProject.ext.VERSION\u代码,工作\u电子邮件]
println(“wsUpload end”)
}
}
}
后评价{
AssembleMiniAPI16ProdRelease.doLast{
println(“-----------------------------------------”)
println(“--------------最后做--------------------”)
println(“-----------------------------------------”)
crashlyticsUploadDistributionMinAPI16ProdRelease.execute()
}
AssembleMiniAPI16ProdRelease.doLast{
wsUpload.execute()
}
}
这给我留下了
>java.lang.NullPointerException(无错误消息)
然后我试着把整个sw上传成doLast

task wsUpload(type:Exec)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()

我假设
AssembleMiniAPI16ProdRelease
crashlyticsUploadDistributionMinAPI16ProdRelease
都是动态任务(在评估项目后创建),因此在
afterEvaluate
块中定义依赖项是明智的:

afterEvaluate {
  crashlyticsUploadDistributionMinAPI16ProdRelease.dependsOn assembleMinAPI16ProdRelease
  crashlyticsUploadDistributionMinAPI16ProdRelease.mustRunAfter assembleMinAPI16ProdRelease
  wsUpload.dependsOn crashlyticsUploadDistributionMinAPI16ProdRelease
  wsUpload.mustRunAfter crashlyticsUploadDistributionMinAPI16ProdRelease
}
为什么
必须在
之后运行和
dependsOn
?不仅要定义依赖项,还要定义正确的执行顺序。 现在,您应该能够运行
gradlewsupload
,并且一切正常

如果要运行
AssembleMiniAPI16ProdRelease
并上载工件,则应使用
finalizedBy

afterEvaluate {
   assembleMinAPI16ProdRelease.finalizedBy crashlyticsUploadDistributionMinAPI16ProdRelease
   crashlyticsUploadDistributionMinAPI16ProdRelease.finalizedBy wsUpload
}

请注意,由于我不是android开发人员,我无法正确测试它——因此,如果它不起作用,请在投票前告诉我;)

我认为这个问题目前正受到争议。你到底想做什么?Gradle组装工件(
AssembleMapi16ProdRelease
)后运行shell脚本(
ws_upload.sh
)?您试图从命令行执行什么?@mkobit我想在组装工件后运行脚本。脚本将工件上传到公司服务器,我可以识别任务
AssembleMiniAPI16ProdRelease
wsUpload
crashlyticsUploadDistributionMinAPI16ProdRelease
。这些任务应该以什么顺序和条件运行?@lu.koerfer assembleMinAPI16ProdRelease-first,crashlyticsUploadDistributionMinAPI16ProdRelease-second,wsUpload-lastwsUpload和crashlyticsUploadDistributionMinAPI16ProdRelease不运行run@Yarh,这些任务何时不运行?您运行的gradle命令是什么?我运行了'gradle assembleMinAPI16ProdRelease--stacktrace'。未上载工件。如果我单独运行上载任务,我将失败(gradle wsUpload或gradle Crashlytics UploadDistributionMinapi16ProdRelease,然后上载工件,因此它们都是works@Yarh您应该运行
gradle wsUpload
并生成和上载工件-这就是它现在的配置方式。如果您只想运行
AssembleMapi16ProdRelease
-
finalizedBy
sh将被使用-将编辑我的答案。