Could not get unknown property 'release' for SoftwareComponentInternal - Maven publish plugin project gradle

ghhaqwfi  于 2023-08-06  发布在  Maven
关注(0)|答案(8)|浏览(454)

我有一个包含多个模块的Android项目,我想将它们发布到自托管的maven repo。我之前已经在各个模块中提供了发布代码,并且工作得很好。我现在尝试将发布代码移动到项目build.gradle中,以便可以重用这些代码。我的各个模块中的代码是:

afterEvaluate {
        // To avoid publishing the applications inside the project...
        if (!plugins.hasPlugin("android")) {
            publishing {
                publications {
                    mavenAar(MavenPublication) {
                        artifactId "$project.name"
                        from components.release
                    }
                }
                repositories {
                    .... My repo details and credentials .......
                }
            }
        }
    }

字符串
一切都很顺利当我将代码移动到项目build.gradle时,如下所示:

subprojects {
    apply plugin: 'maven-publish'

    afterEvaluate {
        // To avoid publishing of the applications inside the project ..
        if (!plugins.hasPlugin("android")) {
            publishing {
                publications {
                    mavenAar(MavenPublication) {
                        artifactId "$project.name"
                        from components.release
                    }
                }
                repositories {
                    .... My reop details and creddentials  .....
                }
            }
        }
    }
}


我在运行publish任务时开始收到以下错误:

A problem occurred configuring project ':mymodule'.
> Could not get unknown property 'release' for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.


有人能指出这里的问题吗?

h5qlskok

h5qlskok1#

检查你的项目级build.gradle并确保gradle类路径是

classpath "com.android.tools.build:gradle:4.1.2" or above.

字符串
这对我很有效。
正如其他人提到的,您还可以通过以下方式检查组件名称:

task comps {
    afterEvaluate {
        println("Components: " + components*.name)
    }
}

h9vpoimq

h9vpoimq2#

我在更新Jitpack的AGP后遇到了这个问题。MavenPublication块和components.release行似乎都使用了构建变体名称。因此,如果你有一个标准的调试和发布变体,它看起来会像这样:

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                groupId = 'com.my.group'
                artifactId = 'id'
                version = Config.libraryVersion
            }
        }
    }
}

字符串
但是如果你有一个非release的构建变体,你需要使用它:

afterEvaluate {
    publishing {
        publications {
            productionRelease(MavenPublication) {
                from components.productionRelease
                groupId = 'com.my.group'
                artifactId = 'id'
                version = Config.libraryVersion
            }
        }
    }
}

gudnpqoy

gudnpqoy3#

这对我很有效,我在评估后添加了另一个***。

subprojects {
  apply plugin: 'maven-publish'

  afterEvaluate {
    // To avoid publishing of the applications inside the project ..
    if (!plugins.hasPlugin("android")) {
        publishing {
            publications {
                mavenAar(MavenPublication) {
                    afterEvaluate {
                       artifactId "$project.name"
                       from components.release
                    }
                }
            }
            repositories {
                .... My reop details and creddentials  .....
            }
        }
     }
   }
}

字符串

1zmg4dgp

1zmg4dgp4#

这两个答案对我都不起作用。如果我不尝试反向工程,而不是阅读文档,我就不会是我自己:)
事实证明,当我们构建com.android.library时,这个components.release工作得很好,但当使用com.android.application插件构建时就不那么好了。如果gradle说它没有release组件,那么让我们看看它有哪些组件:

task comps {
    afterEvaluate {
        println("Components: " + components*.name)
    }
}

字符串
执行./gradlew :app:comps将打印以下内容:

Components: [debug_aab, debug_apk, release_aab, release_apk]


如果在android.buildTypes {}闭包中我定义了另一个类型,比如freebie./gradlew :app:comps将打印以下内容:

Components: [debug_aab, debug_apk, release_aab, release_apk, freebie_aab, freebie_apk]


看起来gradle插件使用了你的构建变体的名称,并从中创建了两个变体:${variant}_apk${variant}_aab
现在要解决最初的问题,替换

publications {
    mavenAar(MavenPublication) {
        artifactId "$project.name"
        from components.release
    }
}


publications {
    mavenAar(MavenPublication) {
        artifactId "$project.name"
        from components.release_apk
    }
}


或者使用_aab。如果您使用的是release以外的其他变体,请相应地替换from components.release_apk部件。
等级:7.3
AndroidStudio:2021.2.1金丝雀4(花栗鼠)

zf2sa74q

zf2sa74q5#

确保在root/build.gradleroot/<library_name>/build.gradle中使用的是com.android.tools.build:gradle:4.1.2或更高版本3.6。然后确保这两个插件都在root/<library_name>/build.gradle中声明如下:

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'

字符串
然后你可以使用组件。释放
您可以阅读此文档https://developer.android.com/studio/build/maven-publish-plugin#groovy了解更多信息

jobtbby3

jobtbby36#

我犯了同样的错误。用下面的代码解决:

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId = 'mygroup'
                artifactId = 'common'
                version = '1.0.0'
                artifact(bundleReleaseAar)
            }
        }
    }
}

字符串
似乎您必须指定AAR文件的确切路径。你可以在这个答案中找到更多细节:https://stackoverflow.com/a/60936807/971355

pengsaosao

pengsaosao7#

遇到了类似的错误,并通过在afterEvaluate之前应用android插件来解决,所以看起来像这样:

apply plugin: 'com.android.library'

afterEvaluate {
    publishing {
        publications {
        ...
}

字符串

lnxxn5zx

lnxxn5zx8#

我得到了同样的错误,解决了它与下面的代码.
实际的更改是将from components.release行 Package 在一个附加的afterEvaluate块中。

subprojects {
    apply plugin: 'maven-publish'

    afterEvaluate {
        // To avoid publishing of the applications inside the project ..
        if (!plugins.hasPlugin("android")) {
            publishing {
                publications {
                    mavenAar(MavenPublication) {
                        artifactId "$project.name"
                        //add afterEvaluate block
                        afterEvaluate {
                            from components.release
                        }
                    }
                }
                repositories {
                    .... My reop details and creddentials  .....
                }
            }
        }
    }
}

字符串

相关问题