将Android Studio的Gradle插件升级到3.0.1并将Gradle升级到4.1后,无法复制配置依赖项

Raf*_*ael 26 android android-studio build.gradle android-gradle-plugin gradle-plugin

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

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

但是在使用gradle plugin 3.0.1 for Android Studio和Gradle工具升级到4.1后,它刚刚升级我的Android项目后停止工作.由于https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations现在弃用了依赖配置'compile',我将其更改为'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
Run Code Online (Sandbox Code Playgroud)

请参阅以下我对app模块的当前build.gradle文件:apply plugin:'com.android.application'

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

如果我使用'compile'它可以工作,但我希望符合这个插件的最新推荐用法.

我需要帮助来升级我的copyLibs任务,以便在升级我的环境之前工作.我正在使用gradle插件2.2.3 for Android Studio和Gradle工具2.14.1.

小智 18

而不是使用configurations.implementation,最好的选择是使用:configurations.runtimeClasspath

你也可以考虑:compileClasspath默认

  • 实际上,这是一个更优雅的解决方案.只需用`configurations.compileClasspath`替换`configurations.compile`它就可以了(至少对我而言). (7认同)
  • 它说:“无法获得类型为org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer的配置容器的未知属性'runtimeClasspath'。”。我错过了什么?对于compileClasspath来说也是一样。我的代码看起来一样,只是它是一个库而不是一个应用程序。 (6认同)

act*_*262 9

我使配置可以解决,所以没有异常获取依赖项的文件

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

println configurations.implementation.resolve()
println configurations.api.resolve()
Run Code Online (Sandbox Code Playgroud)

  • 您会将此代码放在“build.gradle”中的什么位置?当尝试添加它时,我不断收到错误“> 解决后无法更改配置 ':app:api' 的策略。”。 (5认同)

Vin*_*sPJ 7

这可能无济于事或有更好的解决方法,但......

您可以以可以复制的方式放置依赖项,执行以下操作:

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

如果您有一个Jar任务停止将依赖项放入jar文件,因为您已更改为compile,这也会有所帮助implementation.

您可以使用:

from {configurations.myConfig.collect { it.isDirectory() ? it : zipTree(it) }}
Run Code Online (Sandbox Code Playgroud)

代替:

from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
Run Code Online (Sandbox Code Playgroud)


Cor*_*aos 6

我想发表评论,但我仍然缺乏这样做的声誉(一分!!>。<)。似乎没有办法获取implementation依赖项列表,并且如果直接使用Android,Rafael compileClasspathGradle票证上提到的内容将无法正常工作,例如我需要导出依赖项的情况该Unity3D可以把它们打包发布。

因此,在这种情况下,似乎唯一的解决方案是使用不推荐使用的compile类型。


mor*_*lis 6

另一个建议。

我创建了自定义配置,然后将其用作configurations.customConfig

configurations {
  customConfig.extendsFrom implementation
}
Run Code Online (Sandbox Code Playgroud)