Android Studio,Gradle:如何自动发布release.apk到svn仓库?
Android Studio, Gradle: How to automatically publish release.apk to svn repository?
在 Maven 中,发布过程没有问题。由于我被迫将 Android Studio 与 Gradle 一起使用,因此我想实现与使用 Eclipse 和 Maven 时相同的行为。我发现了一些非常好的类似 Maven 的发布插件(https://github.com/researchgate/gradle-release),它几乎按预期工作,但它没有上传发布 apk,尽管它在 /app/build/outputs/apk
中正确创建了 apk 并且带有我的 SVN 存储库中的源代码。发布文件夹仍然是空的。我什至不确定这个插件是否可以做到这一点,因为它没有很好的记录,但我想我需要告诉这个插件上传什么以及在哪里找到它。只有一个afterReleaseBuild.dependsOn uploadArchives
。这是什么意思,我必须覆盖此 uploadArchives
方法或在 Gradle 中的任何含义?它似乎是内置的东西,因为 Gradle 如果我在我的脚本中写这个并且 运行 gradlew release
build 不会抱怨。显然插件已经知道存储库并且可以通过 ssh 连接,否则它无法创建标签,但它似乎不知道要上传什么,发布文件夹保持为空。
与此同时,我尝试通过许多其他 Gradle 尝试来解决这个问题,例如使用 Maven 插件,但后来我 运行 遇到没有解决方案的 SSH 证书问题,即使它有效,也不是一个好的解决方案,因为我不想创建 pom.xml 文件等等,这只是一种解决方法。
目标是发布过程应该在 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'
}
您可以向 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=
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
在 Maven 中,发布过程没有问题。由于我被迫将 Android Studio 与 Gradle 一起使用,因此我想实现与使用 Eclipse 和 Maven 时相同的行为。我发现了一些非常好的类似 Maven 的发布插件(https://github.com/researchgate/gradle-release),它几乎按预期工作,但它没有上传发布 apk,尽管它在 /app/build/outputs/apk
中正确创建了 apk 并且带有我的 SVN 存储库中的源代码。发布文件夹仍然是空的。我什至不确定这个插件是否可以做到这一点,因为它没有很好的记录,但我想我需要告诉这个插件上传什么以及在哪里找到它。只有一个afterReleaseBuild.dependsOn uploadArchives
。这是什么意思,我必须覆盖此 uploadArchives
方法或在 Gradle 中的任何含义?它似乎是内置的东西,因为 Gradle 如果我在我的脚本中写这个并且 运行 gradlew release
build 不会抱怨。显然插件已经知道存储库并且可以通过 ssh 连接,否则它无法创建标签,但它似乎不知道要上传什么,发布文件夹保持为空。
与此同时,我尝试通过许多其他 Gradle 尝试来解决这个问题,例如使用 Maven 插件,但后来我 运行 遇到没有解决方案的 SSH 证书问题,即使它有效,也不是一个好的解决方案,因为我不想创建 pom.xml 文件等等,这只是一种解决方法。
目标是发布过程应该在 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'
}
您可以向 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=
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