使用Gradle(v 1.7)作为构建工具处理Android库时,我使用了maven插件并配置了任务uploadArchives,以将lib的发布和调试版本发布到本地maven存储库。
以下代码可以正常使用:
// [...]
apply plugin: 'android-library'
// [...] nothing unusual
/*
* Define name of the apk output file (build/apk/<outputFile>)
*/
android.libraryVariants.all
{
variant ->
def outputName = "MyModule-${android.defaultConfig.versionName}-${variant.baseName}.aar"
variant.outputFile = new File("$buildDir/libs", outputName)
}
/*
* Publish to maven local repo (older style maven plugin)
* Used while android plugin is not fixed regarding maven-publish plugin
*
* type command "gradle uploadArchives" to publish the module into the
* local .m2 repository
*/
apply plugin: 'maven'
android.libraryVariants.all
{
variant ->
// add final apk to the 'archives' configuration
project.artifacts
{
archives variant.outputFile
}
}
def localRepoPath = "file://" + new File(
System.getProperty("user.home"), ".m2/repository").absolutePath
uploadArchives
{
repositories.mavenDeployer
{
repository(url: localRepoPath)
addFilter('debug') { artifact, file ->
artifact.name.contains("debug")
}
addFilter('release') { artifact, file ->
artifact.name.contains("release")
}
pom('debug').groupId = 'com.company'
pom('release').groupId = 'com.company'
pom('debug').artifactId = 'id'
pom('release').artifactId = 'id'
pom('debug').version = android.defaultConfig.versionName + "d"
pom('release').version = android.defaultConfig.versionName
pom.packaging = 'aar'
}
}
uploadArchives.dependsOn(assemble)
但是,在尝试重构pom配置时:
uploadArchives
{
repositories.mavenDeployer
{
repository(url: localRepoPath)
addFilter('debug') { artifact, file ->
artifact.name.contains("debug")
}
addFilter('release') { artifact, file ->
artifact.name.contains("release")
}
pom.groupId = 'com.company'
pom.artifactId = 'id'
pom('debug').version = android.defaultConfig.versionName + "d"
pom('release').version = android.defaultConfig.versionName
pom.packaging = 'aar'
}
}
artifactId 扩展为输出文件的名称, groupId 作为根目录的名称扩展;因此在maven回购中给出了不好的路径。
我想知道为什么会这样,也许如果有更清洁的方法来实现我的需要。
答案 0 :(得分:5)
作为参考,这是我们上传多个APK的方式。它可能不是您所需要的,因为我们在APK拆分后上传多个APK,而您尝试从不同的构建类型上传多个APK(调试和发布)。但从理论上讲,它们应该是一样的。
//declare some Variables for later use
def projectName = "ProjectName"
def versionString = "1.0.0"
def baseVersionCode = 1
// Values based on https://developer.android.com/ndk/guides/abis.html#sa
ext.abiCodes = ['armeabi-v7a': 1,
'arm64-v8a' : 2,
'x86' : 3,
'x86_64' : 4]
// collect artifacts, important for the `uploadArchives` to work
artifacts {
if (new File('app/build/outputs/apk').exists()) {
new File('app/build/outputs/apk').eachFile() { file ->
if (file.toString().contains("productionRelease")) {
archives file: file
}
}
}
}
uploadArchives {
repositories {
mavenDeployer {
repository(url: "http://...")
project.ext.abiCodes.values().each{ abiVersionCode ->
def version = "${versionString}.${baseVersionCode + abiVersionCode}"
addFilter(version) { artifact, file -> artifact.name.contains(version) }
pom(version).artifactId = projectName.toLowerCase()
pom(version).groupId = 'com.yourcompanyname'
pom(version).version = version
}
}
}
}
android {
defaultPublishConfig "productionRelease"
buildTypes {
productionRelease {
minifyEnabled false
zipAlignEnabled true
//...more Config like proguard or signing
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
def abiVersionCode = project.ext.abiCodes.get(abiName)
output.versionCodeOverride = variant.versionCode + abiVersionCode
output.versionNameOverride = "$versionString (${output.versionCodeOverride})"
def apkName = "$projectName-${variant.name}-v${versionString}.${output.versionCodeOverride}.apk"
output.outputFile = new File(output.outputFile.parent, apkName)
}
}
答案 1 :(得分:0)
您需要(ed)为groupId
和artifactId
设置与version
相同的过滤器名称
pom('debug').groupId = 'com.company'
pom('release').groupId = 'com.company'
pom('debug').artifactId = 'id'
pom('release').artifactId = 'id'
pom('debug').version = android.defaultConfig.versionName + "d"
pom('release').version = android.defaultConfig.versionName
我很惊讶你没有使用版本名称后缀,因为它不是semver。