gradle 找不到XXX的匹配变量,使用者配置为查找值为“platform”和“version-catalog”的属性

o2gm4chl  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(139)

versionCatalogs导出为库后,被其他应用程序使用,错误状态

> No matching variant of io.github.elye:plugin-dependencies:1.0.0 was found. The consumer was configured to find attribute 'org.gradle.category' with value 'platform', attribute 'org.gradle.usage' with value 'version-catalog' but:
       - Variant 'apiElements' capability io.github.elye:plugin-dependencies:1.0.0:
           - Incompatible because this component declares attribute 'org.gradle.category' with value 'library', attribute 'org.gradle.usage' with value 'java-api' and the consumer needed attribute 'org.gradle.category' with value 'platform', attribute 'org.gradle.usage' with value 'version-catalog'
       - Variant 'runtimeElements' capability io.github.elye:plugin-dependencies:1.0.0:
           - Incompatible because this component declares attribute 'org.gradle.category' with value 'library', attribute 'org.gradle.usage' with value 'java-runtime' and the consumer needed attribute 'org.gradle.category' with value 'platform', attribute 'org.gradle.usage' with value 'version-catalog'

我的版本目录库编写如下

plugins {
    id 'java-library'
    id 'kotlin'
    id 'version-catalog'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

catalog {
    // declare the aliases, bundles and versions in this block
    versionCatalog {
        alias('androidx-core').to('androidx.core:core-ktx:1.6.0')
        alias('androidx-appcompat').to('androidx.appcompat:appcompat:1.3.1')
        alias('androidx-constraintlayout').to('androidx.constraintlayout:constraintlayout:2.1.0')
        alias('android-material').to('com.google.android.material:material:1.4.0')
        bundle('androidx', ['androidx-core',
                            'androidx-appcompat',
                            'androidx-constraintlayout'])
    }
}

ext {
    PUBLISH_GROUP_ID = 'io.github.elye'
    PUBLISH_VERSION = '1.0.0'
    PUBLISH_ARTIFACT_ID = 'plugin-dependencies'
}

apply from: "./publish-module.gradle"

当我尝试访问versionCatalog库时,情况如下

dependencyResolutionManagement {

    // Some other codes

    versionCatalogs {
        xlibs {
            from("io.github.elye:plugin-dependencies:1.0.0")
        }
    }
}

如何修复错误?

nxagd54h

nxagd54h1#

看起来我只需要从库的build.gradle文件中删除以下内容。

plugins {
    id 'java-library'
    id 'kotlin'
}

因此代码如下所示

plugins {
    id 'version-catalog'
}

catalog {
    // declare the aliases, bundles and versions in this block
    versionCatalog {
        alias('androidx-core').to('androidx.core:core-ktx:1.6.0')
        alias('androidx-appcompat').to('androidx.appcompat:appcompat:1.3.1')
        alias('androidx-constraintlayout').to('androidx.constraintlayout:constraintlayout:2.1.0')
        alias('android-material').to('com.google.android.material:material:1.4.0')
        bundle('androidx', ['androidx-core',
                            'androidx-appcompat',
                            'androidx-constraintlayout'])
    }
}

ext {
    PUBLISH_GROUP_ID = 'io.github.elye'
    PUBLISH_VERSION = '1.0.0'
    PUBLISH_ARTIFACT_ID = 'plugin-dependencies'
}

apply from: "./publish-module.gradle"
mznpcxlj

mznpcxlj2#

我没有完全理解Elye的回答,因此我将解释我在build.gradle.kts文件中进行了哪些更改以解决该问题。
我有一个单独的项目包含了TomL版本目录,那个项目只负责将版本目录发布到我的Nexus存储库,在我的例子中,我不仅发布了TomL版本目录,而且还发布了4个属性文件,那些属性文件对应于版本,库,toml版本目录的bundle和plugin部分,这样我的运行时应用程序就可以访问包含在toml文件中的信息,通常toml版本目录只对构建组件可用。这使我能够将这些数据提供给运行时组件或外部构建的自定义gradle插件。
以下是我的settings.gradle.kts文件包含的内容:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven {
            url = uri(System.getenv()["MyReleaseRepoUrl"].toString())
            credentials {
            username = System.getenv().get("MyRepoUser").toString()
            password = System.getenv().get("MyRepoUserPW").toString()
        }
    }
    google()
    mavenCentral()
}

versionCatalogs {
    create("libs") {
        from(files("src/main/resources/libs.versions.toml"))
    }
}

因此,设置文件为toml文件创建了一个版本目录,我将其存储在“src/main/resoures”目录中
以下是我的build.gradle.kts文件包含的内容:

plugins {
    id ("version-catalog")
    id ("maven-publish")
    kotlin("jvm")
    id ("com.xyz.versions.plugin")
}

publishing {
    publications {
    create<MavenPublication>("VersionCatalog") {
        groupId = "com.xyz"
        artifactId = "com.xyz.version.catalog"
        version = libs.versions.toml.get()

        //artifact("src/main/resources/libs.versions.toml")
        from(components["versionCatalog"])
    }
    create<MavenPublication>("VersionsProperties") {
        groupId = "com.xyze"
        artifactId = "com.xyz.version.versions"
        version = libs.versions.toml.get()
        artifact("src/main/resources/versions.properties")
    }
    ...

插件“version-catalog”使“components[“versionCatalog”]”可用。Maven-publish是我用来发布的插件。“com.xyz. verses.plugin”是用Kotlin编写的buildSrc插件。该插件迭代版本目录的每一部分,并生成相应的属性文件。
最后你会看到我对发布内容的定义,我展示了我如何发布toml版本目录,我展示了我如何发布versions.properties我生成的www.example.com文件,你应该注意到我在toml文件的发布描述中注解掉了“artifact”行,如果我使用“artifact”行发布文件,我会得到“no matching variant...”尝试在其他项目中使用已发布的版本目录时出现问题。如果改用“from components”行,则在其他项目中导入版本目录时不会出现“no matching variant...”问题。

gmol1639

gmol16393#

正如我在之前的解决方案的注解中所解释的,它实际上并不工作,我发布的代码的问题是它最终发布了一个空的版本目录;并使用一个空的已发布版本目录来避免错误。但当然,这不是你想要发生的事情。发布版本目录的解决方案是我使用“artifact”行而不是“components”行来发布版本目录。我不完全理解导致发布空版本目录的情况,但是将其作为工件而不是组件发布可以解决这个问题。很多人都发现了同样的问题,我认为这是Gradle的一个bug。
也就是说,当我尝试使用发布的版本目录时,“没有匹配的变体...”的问题就会出现。我发现我发布的版本目录重用了以前的版本号,我已经设置了我的maven存储库来允许我这样做,我所做的是运行“gradlew build --refresh-dependencies”来解决这个问题在项目中,我导入了版本目录工件。当我观察构建时,通过观察构建输出屏幕,我清楚地感觉到版本目录被重新加载。我让该任务运行了一会儿,但该任务似乎挂起了。在等待10分钟后,我只是继续并控制C 'ed退出任务,然后运行任务“gradlew build”,不使用刷新依赖项选项。它运行时没有产生“没有匹配的变量..."。我还让构建脚本打印出其中一个版本和库别名的值。它打印出包含在导入的版本目录中的值。

相关问题