将适用于Android Studio的Gradle插件升级到3.0.1以及将Gradle升级到4.1后,无法复制配置依赖项

dnph8jn4  于 2022-11-16  发布在  Android
关注(0)|答案(7)|浏览(237)

我曾经使用这个简单的gradle任务将'compile'依赖项复制到特定文件夹:

task copyLibs(type: Copy) {
    from configurations.compile
    into "$project.rootDir/reports/libs/"
}

但在我使用适用于Android Studio和Gradle工具的gradle插件3.0.1将Android项目升级到4.1后,它就停止工作了。由于依赖项配置“compile”现在已被www.example.com弃https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations,我将其更改为“implementation”。但是,我无法使用我的copyLibs任务,因为根据Gradle构建错误输出,不允许直接解析配置“implementation”:

$ ./gradlew.bat clean build

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':app:copyLibs'.
> Resolving configuration 'implementation' directly is not allowed

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s

请参见以下我当前的build.gradle文件,用于应用模块:应用插件:'com.android.应用程序'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "newgradle.com.testingnewgradle"
        minSdkVersion 21
        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'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

task copyLibs(type: Copy) {
    from configurations.implementation
    into "$project.rootDir/reports/libs/"
}
build.dependsOn copyLibs

如果我使用“编译”它的工作,但我想符合最新的建议,对这个插件的使用。
我需要帮助来升级我的copyLibs任务,以便像升级环境之前一样工作。我使用的是适用于Android Studio的Gradle插件2.2.3和Gradle工具2.14.1。

cigdeys3

cigdeys31#

最好的选择是使用configurations.runtimeClasspath,而不是使用configurations.implementation
你还可以考虑一下:编译类路径缺省值

kqlmhetl

kqlmhetl2#

我使配置可解析,因此在获取依赖项时不会出现异常

configurations.implementation.setCanBeResolved(true)
configurations.api.setCanBeResolved(true)

println configurations.implementation.resolve()
println configurations.api.resolve()
w3nuxt5m

w3nuxt5m3#

另一个建议。
我创建了自定义配置,然后将其用作configurations.customConfig

configurations {
  customConfig.extendsFrom implementation
}

拷贝任务必须进行相应的编辑:

task copyLibs(type: Copy) {
    from configurations.customConfig
    into "$project.rootDir/reports/libs/"
}
cx6n0qe3

cx6n0qe34#

看起来好像没有一种方法可以获得implementation依赖项的列表,如果你直接使用Android,拉斐尔发布的the Gradle ticket中提到的compileClasspath将不起作用,就像我的情况一样,我需要导出依赖项,以便Unity3D可以将它们打包发布。
因此,在这种情况下,唯一的解决方案似乎是使用已弃用的compile类型。

iqxoj9l9

iqxoj9l95#

这可能不会帮助或有更好的方法来解决,但...
您可以通过执行以下操作,以一种可以复制的方式放置依赖项:

android { ... }

// Add a new configuration to hold your dependencies
configurations {
    myConfig
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

    // Now you have to repeat adding the dependencies you want to copy in the 'myConfig'
    myConfig fileTree(dir: 'libs', include: ['*.jar'])
    myConfig 'com.android.support:appcompat-v7:26.1.0'
    myConfig 'com.android.support:support-v4:26.1.0'
    ...
}

task copyLibs(type: Copy) {
    // Now you can use 'myConfig' instead of 'implementation' or 'compile' 
    from configurations.myConfig 
    into "$project.rootDir/reports/libs/"
}

如果有一个Jar任务因为从compile更改为implementation而停止将依赖关系放入jar文件,这也会很有帮助。
您可以用途:

from {configurations.myConfig.collect { it.isDirectory() ? it : zipTree(it) }}

而不是:

from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
n7taea2i

n7taea2i6#

从Gradle 5.5升级到5.6后,我开始收到这个错误,当我尝试在IntelliJ中同步项目时,它就会发生。
由于这个answer在另一个问题上,我解决了它,通过应用ideaplugin到所有项目,然后运行gradle cleanIdea,之后一切又开始工作了。
又是一天,又是一个令人费解的问题解决方案。

sq1bmfud

sq1bmfud7#

有一些文档是关于这个的,至少现在是这样。你不能直接使用'implementation'配置,而只能使用一个扩展它的配置。现在你可以创建一个自定义配置,但是已经有预配置的扩展了,比如'compileClasspath'。
compileClasspath扩展了compileOnly,编译类路径实现,在编译源代码时使用由compileJava任务使用
文档位于:https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management

相关问题