kko*_*114 10 android gradle android-gradle-plugin maven-publish
我有 2 个 lib 模块 : library, library2, 并使用android-maven-publish发布具有 multi-productFlavors 的多模块 android 项目
build.gradle 在图书馆:
apply plugin: 'com.android.library'
apply plugin: 'digital.wup.android-maven-publish'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "runner"
productFlavors {
sit {
dimension "runner"
}
dev {
dimension "runner"
}
uat {
dimension "runner"
}
prd {
dimension "runner"
}
}
}
dependencies {
...
implementation project(':android-library2')
}
apply from: '../publish.gradle'
Run Code Online (Sandbox Code Playgroud)
build.gradle 在库 2 中:
apply plugin: 'com.android.library'
apply plugin: 'digital.wup.android-maven-publish'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "runner"
productFlavors {
sit {
dimension "runner"
}
dev {
dimension "runner"
}
uat {
dimension "runner"
}
prd {
dimension "runner"
}
}
}
dependencies {
...
}
apply from: '../publish.gradle'
Run Code Online (Sandbox Code Playgroud)
发布.gradle:
publishing.publications() {
android.libraryVariants.all { variant ->
"maven$project.archivesBaseName${variant.name.capitalize()}Aar"(MavenPublication) {
from components.findByName("android${variant.name.capitalize()}")
groupId 'com.android.saleshelp'
artifactId project.archivesBaseName + "-${variant.name.capitalize()}"
version android.defaultConfig.versionName
}
}
}
publishing.repositories {
mavenLocal()
}
Run Code Online (Sandbox Code Playgroud)
当我publish在库中运行任务时,出现以下错误:
* What went wrong:
Could not determine the dependencies of task ':android-library2:publishMavenandroid-library2SitReleaseAarPublicationToMavenLocalRepository'.
> Publishing is not able to resolve a dependency on a project with multiple publications that have different coordinates.
Found the following publications in project ':android-library':
- Maven publication 'mavenandroid-libraryPrdDebugAar' with coordinates com.cestbon.android.saleshelp:android-library-PrdDebug:1.0
- Maven publication 'mavenandroid-libraryPrdReleaseAar' with coordinates com.cestbon.android.saleshelp:android-library-PrdRelease:1.0
- Maven publication 'mavenandroid-libraryDevDebugAar' with coordinates com.cestbon.android.saleshelp:android-library-DevDebug:1.0
- Maven publication 'mavenandroid-libraryDevReleaseAar' with coordinates com.cestbon.android.saleshelp:android-library-DevRelease:1.0
- Maven publication 'mavenandroid-libraryUatDebugAar' with coordinates com.cestbon.android.saleshelp:android-library-UatDebug:1.0
- Maven publication 'mavenandroid-libraryUatReleaseAar' with coordinates com.cestbon.android.saleshelp:android-library-UatRelease:1.0
- Maven publication 'mavenandroid-librarySitDebugAar' with coordinates com.cestbon.android.saleshelp:android-library-SitDebug:1.0
- Maven publication 'mavenandroid-librarySitReleaseAar' with coordinates com.cestbon.android.saleshelp:android-library-SitRelease:1.0
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Run Code Online (Sandbox Code Playgroud)
如果我apply from: '../publish.gradle'在build.gradlelibrary2 中删除,任务:library:publish可以成功运行。但是因为我要library2独立出版,所以library2必须apply from: '../publish.gradle'
我该怎么办这个错误?谢谢。
环境:gradle 4.4 ~ 4.9-rc1
这是maven-publish插件的一个已知限制。
当一个项目依赖有多个发布时,maven-publish插件无法正确选择它们。在您的情况下,当maven-publish插件尝试解析时implementation project(':android-library2'),它无法决定向 pom 文件写入什么内容,因为该android-library2项目有多个具有不同坐标的发布。
在 Gradle 4.9-rc-1 中引入了别名属性。如果您将所有出版物标记为别名并且您有一个主要出版物,那么这可以解决您的问题。但在我看来,这并不能完全解决您的问题,因为 maven 发布插件会将主要发布的坐标写入 pom 文件中,与产品风格无关。
如果这没有帮助,那么您可以使用原始错误报告中的解决方法。
我遇到了同样的问题,这似乎仍然是maven-publish. 我找到了一个对我来说非常有效的解决方法:
publishing {
repositories {
def repositoryName = 'X'
maven { name = repositoryName /* ... */ }
afterEvaluate {
def targetComponent = System.getProperty("targetComponent")
components.each { component ->
if (component.name != targetComponent) return
def appendage = component.name.replaceAll("[Rr]elease", "")
if (!appendage.isEmpty()) appendage = "-$appendage"
publications {
"${component.name}"(MavenPublication) {
from component
artifactId = project.name + appendage
}
}
publish.doFirst {
if (targetComponent == null)
throw new GradleException("Deployment requires specifying -DtargetComponent option")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用gradle project:publish -DtargetComponent=release或您尝试释放的任何其他组件进行调用。
说明: Gradle 在该级别查看工作空间内的依赖关系project,但它在该级别输出到 Maven 存储库component。Maven 没有相同的项目与组件概念。这也意味着您无法在 Gradledependencies块中指定您正在寻找的 Maven 样式依赖项的哪个组件(因为 Maven 并没有真正理解这个概念)。结果:Gradle 无法弄清楚如何为具有多个publications 的工作区内依赖项编写 POM 文件条目。
最小问题示例:
// a/build.gradle:
publications {
release(MavenPublication) { from components.release }
debug(MavenPublication) { from components.debug; artifactId = 'a-debug' }
}
// b/build.gradle:
dependencies {
project(':a') // ERROR: should this be 'group:b:1.0.0' or 'group:b-debug:1.0.0'?
}
Run Code Online (Sandbox Code Playgroud)
解决方法是让您在配置时间之前指出要在所有项目中部署哪个组件。在配置过程中,Gradle 仅根据您标记的组件为每个项目生成一份发布,并添加 Gradle 将项目内 deps 映射到 Maven 样式 deps 所需的额外信息。部署时只需要指定命令行参数即可;条件绑定到publish任务,因此只有在实际调用该任务时才会发生。
限制:
artifactId;如果你愿意的话你可以改变这个gradle publish --dry-run则不会显示有意义的结果a:release绑定到b:release并a:debug绑定到b:debug)编辑:我已调用我的任务deploy,但在编写此答案时将其重命名为publish。结果自动maven-publish创建了一个任务publish,它完全符合我的要求。我已经更新了代码片段以反映这一点。
EDIT2:改为抛出GradleException;这稍微更惯用一些。
| 归档时间: |
|
| 查看次数: |
2201 次 |
| 最近记录: |