无法获得 SoftwareComponentInternal 的未知属性“release” - Maven 发布插件项目 gradle

Swa*_*nil 8 android gradle maven-publish

我有一个包含多个模块的 Android 项目,我想将它们发布到自托管的 maven 存储库。我早些时候将发布代码存在于各个模块中,并且一切正常。我现在正在尝试将发布代码移动到项目中,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 .......
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

一切都很好。当我将代码移至项目时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  .....
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

A problem occurred configuring project ':mymodule'.
> Could not get unknown property 'release' for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.
Run Code Online (Sandbox Code Playgroud)

有人可以指出这里的问题吗?

Nob*_*dy8 9

我使用这一行解决了我的问题:

from components.findByName('release')
Run Code Online (Sandbox Code Playgroud)

你应该把它放在这里:

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.findByName('release')

                //...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,谢谢。在 Android Studio Flamingo 中使用 Gradle 8.0(2022.2.1 补丁 2) (2认同)

Bal*_*ngh 8

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

classpath "com.android.tools.build:gradle:4.1.2" or above.
Run Code Online (Sandbox Code Playgroud)

这对我有用。

正如其他人提到的,您还可以通过以下方式检查组件名称:

task comps {
    afterEvaluate {
        println("Components: " + components*.name)
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*son 7

我在更新 Jitpack 的 AGP 后遇到了这个问题。MavenPublication 块和components.release行似乎都使用您的构建变体名称。因此,如果您有标准的调试和发布变体,它将如下所示:

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

但是,如果您有一个名称不是release的构建变体,则需要使用它:

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


Bac*_*ker 6

这对我有用,我添加了另一个afterEvaluate

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  .....
            }
        }
     }
   }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这两个答案都不适合我。如果我不尝试对其进行逆向工程而不是阅读文档,我就不是我自己了:)

事实证明,components.release当我们构建 时,这工作得很好com.android.library,但在使用插件构建时则不太好com.android.application。如果 gradle 说它没有组件release,那么让我们看看它有哪些组件:

task comps {
    afterEvaluate {
        println("Components: " + components*.name)
    }
}
Run Code Online (Sandbox Code Playgroud)

打印./gradlew :app:comps以下内容:

Components: [debug_aab, debug_apk, release_aab, release_apk]
Run Code Online (Sandbox Code Playgroud)

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

Components: [debug_aab, debug_apk, release_aab, release_apk, freebie_aab, freebie_apk]
Run Code Online (Sandbox Code Playgroud)

看来 gradle 插件会获取您的构建变体的名称并从中创建两个变体:${variant}_apk${variant}_aab

现在要解决最初的问题,替换

publications {
    mavenAar(MavenPublication) {
        artifactId "$project.name"
        from components.release
    }
}
Run Code Online (Sandbox Code Playgroud)

publications {
    mavenAar(MavenPublication) {
        artifactId "$project.name"
        from components.release_apk
    }
}
Run Code Online (Sandbox Code Playgroud)

或使用其中_aab之一。如果您使用的不是 的其他变体release,请from components.release_apk相应地更换该部件。

等级:7.3

AndroidStudio:2021.2.1 金丝雀 4(花栗鼠)


ka3*_*3ak -2

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

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId = 'mygroup'
                artifactId = 'common'
                version = '1.0.0'
                artifact(bundleReleaseAar)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

看来您必须指定 AAR 文件的确切路径。您可以在此答案中找到更多详细信息: /sf/answers/4265576521/