在特定时间点在gradle中运行curl命令

时间:2016-01-28 16:05:38

标签: android curl android-gradle android-proguard bugsnag

我使用bugsnag来监控Android应用中的崩溃。 编译发行版时我也使用ProGuard。 我需要上传在我的项目的build / outputs / mapping / prod / release文件夹中生成的mapping.txt文件。

在(Windows)命令行中运行此命令时:

curl https://upload.bugsnag.com -F proguard=@C:/mapping.txt -F apiKey=1111111111111111111111 -F versionCode=11111111 -F appId=com.my.package -F versionNumber=1.0.0

文件已上传,一切正常。

我需要的是将任务添加到gradle中,以便在文件准备好后上传文件。 因此,一旦我编译了要发布的项目,就会生成mapping.txt文件,一旦准备好,就使用这个curl命令(which is taken from bugsnag's web site by the way)上传文件。

我尝试了很多变化。当前的编译,但我不认为该文件正在上传...我无法看到它实际发生的任何迹象。 这是我目前使用的代码:

task uploadPro(type: Exec) {
    logger.error("inside upload task")
    commandLine 'cmd', '/c', 'curl', 'https://upload.bugsnag.com', '-F','proguard=@build/outputs/mapping/prod/release/mapping.txt', '-F', 'apiKey=1111111111111111111111', '-F', 'versionCode=111111', '-F', 'appId=com.my.package', '-F', 'versionNumber=1.0.0'
    standardOutput = new ByteArrayOutputStream()
    doLast {
        String output = standardOutput.toString()
        logger.info(output);
    }
}

我也试过用这个:

def p = ['cmd', '/c', 'curl', 'https://upload.bugsnag.com', '-F', 'proguard=@build/outputs/mapping/prod/release/mapping.txt', '-F', 'apiKey=11111111111111111111111', '-F', 'versionCode=1111111', '-F', 'appId=com.my.package', '-F', 'versionNumber=1.0.0'].execute()

我调用此任务的方法是使用此命令:

tasks.getByName("assembleRelease").finalizedBy(uploadPro)

我真的不知道该怎么做。任何帮助表示赞赏!!谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了一个解决我自己问题的方法......主要是。这是我在构建过程结束时用来运行curl命令的代码:

task uploadPro << {
    logger.error("Uploading mapping.txt file to bugsnag")
    def myCommand = "cmd /c curl https://upload.bugsnag.com -F proguard=@path\\to\mappingFile\\mapping.txt -F " +
        "apiKey=111111111111111111111111 -F versionCode=" + versionCodeId + " -F " +
        "appId=com.xxxx.yyy.zzz -F versionNumber=" + versionId
    ProcessBuilder builder = new ProcessBuilder(myCommand.split(' '));
    Process process = builder.start();
    process.waitFor()
    println process.err.text
    println process.text
}

然后我使用它在构建过程结束时运行它:

gradle.buildFinished {
    tasks.uploadPro.execute()
}

不能确定这是最佳做法,但它确实有效。

我本来希望在发布buildType期间只运行uploadPro任务......但事实证明这也很困难。