2016-09-07 43 views
7

在Maven中,發佈過程沒有問題。由於我不得不在Gradle中使用Android Studio,因此我想實現與Eclipse和Maven一樣的行爲。我發現了一些相當不錯的Maven-like發佈插件(https://github.com/researchgate/gradle-release),它幾乎按預期工作,但它沒有上傳發布apk,雖然它正確地創建了在/app/build/outputs/apk中的apk以及在我的SVN存儲庫中帶有源代碼的標籤。發佈文件夾仍然是空的。我甚至不確定這個插件是否可以做到這一點,因爲它沒有很好的文檔記錄,但我想我需要告訴這個插件上傳什麼以及在哪裏找到它。只有一個afterReleaseBuild.dependsOn uploadArchives。這是什麼意思,我不得不重寫這個uploadArchives方法,或者這在Gradle中意味着什麼?它似乎是內置的東西,因爲如果我在腳本中編寫並運行gradlew release,Gradle構建不會投訴。很顯然,插件已經知道存儲庫並且可以通過ssh連接,否則它不能創建標籤,但似乎它不知道要上傳什麼,發佈文件夾保持空白。同時我試圖通過很多其他Gradle嘗試來解決這個問題,例如,使用Maven插件,但是之後我遇到了SSH證書問題而沒有解決方案,即使它可以工作,也不是一個好的解決方案,因爲我不想創建pom.xml文件等等,它會只是一種解決方法。Android Studio,Gradle:如何自動發佈release.apk到svn倉庫?

目標是釋放過程應自動創建在名爲像目前版本的svn庫的版本文件夾的文件夾(因爲它已經在標籤的文件夾,例如1.0.0工程),並釋放APK複製到它已經被Gradle重命名爲myapp-app-1.0.0-release.apk,因爲這是本地輸出文件夾中包的名稱。

這裏是我的gradle當前腳本可以生成輸出文件夾釋放APK,但不把它上傳到SVN:

apply plugin: 'com.android.application' 
apply plugin: 'net.researchgate.release' 

def keystorePropertiesFile = rootProject.file("/home/myuser/.android/keystore.properties") 
def keystoreProperties = new Properties() 
keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 

android { 
    lintOptions { 
     //TODO remove this or set to true 
     abortOnError false 
    } 

    signingConfigs { 
     myapp_release_config { 
      keyAlias keystoreProperties['keyAlias'] 
      keyPassword keystoreProperties['keyPassword'] 
      storeFile file(keystoreProperties['storeFile']) 
      storePassword keystoreProperties['storePassword'] 
     } 
    } 
    compileSdkVersion 24 
    buildToolsVersion "24.0.1" 

    packagingOptions { 
     exclude 'META-INF/ASL2.0' 
    } 

    defaultConfig { 
     applicationId "com.mydomain.myapp" 
     minSdkVersion 9 
     targetSdkVersion 24 
     versionCode 1 
     versionName '1.0.0' 
     archivesBaseName = "myapp-app-$versionName" 
    } 
    buildTypes { 
     debug { 
      debuggable true 
      zipAlignEnabled false 
     } 
     release { 
      minifyEnabled true 
      proguardFiles 'proguard-rules.pro' 
      signingConfig signingConfigs.myapp_release_config 
      afterReleaseBuild.dependsOn uploadArchives 
     } 
    } 
} 

release { 
    failOnUnversionedFiles = false 

    svn { 
     username = 'myuser' 
     password = 'mypassword' 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.mydomain.myapp:model:1.0' 
    //support-v4 
    compile 'com.android.support:support-core-utils:24.2.0' 
    compile 'com.android.support:support-fragment:24.2.0' 
    //compile 'com.android.support:multidex:1.0.0' 
    //support-design 
    compile 'com.android.support:design:24.2.0' 
    //support-v7 
    compile 'com.android.support:appcompat-v7:24.2.0' 
    //FlowLayout 
    compile 'com.wefika:flowlayout:0.4.1' 
    compile 'javax.validation:validation-api:1.1.0.Final' 
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13' 

    testCompile 'junit:junit:4.12' 
    testCompile 'org.hamcrest:hamcrest-all:1.3' 
} 

回答

1

您可以將任務添加到您的build.gradle

這是出版的樣本任務和bash腳本:

task publishit (type: Exec) { 
 
    commandLine './publish.sh', android.defaultConfig.versionName 
 
} 
 
assembleRelease.finalizedBy(publishit)

,並把publish.sh在您的應用程序路徑(並使其可執行文件)

#!/bin/bash 
 
    
 
### Settings 
 
svn_path='/path/to/repo/' 
 
svn_user='user' 
 
svn_password='password' 
 
app_prefix='myapp-app-' 
 
app_suffix='-release.apk' 
 
release_name='app-release.apk' 
 
dir='/' 
 

 
current_path=`pwd` 
 
release_path=$current_path$dir$release_name 
 
code_name=$1 
 
app_path=$svn_path$code_name$dir$app_prefix$code_name$app_suffix 
 

 
cd $svn_path 
 
mkdir $code_name 
 
cp $release_path $app_path 
 

 
# check and fix these: 
 
svn add $code_name 
 
svn update 
 
svn commit -m "new version" --username $svn_user --password $svn_passwd > publish_log

你可以用gradle這個語法做到這一點,以獲得更多信息讀取here

+0

我沒現在還沒有測試,但由於顯然沒有其他解決方案,我會接受你的。 – Bevor