web-dev-qa-db-fra.com

Impossible de copier les dépendances de configuration après la mise à niveau du plug-in Gradle pour Android Studio vers 3.0.1 et Gradle vers 4.1

J'avais l'habitude de copier les dépendances de "compilation" dans un dossier spécifique en utilisant cette tâche gradle simple:

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

Mais il a cessé de fonctionner juste après la mise à niveau de mon projet Android utilisant le plugin gradle 3.0.1 pour Android Studio et outil Gradle vers 4.1. Comme la configuration des dépendances "compile") est désormais déconseillé par https://developer.Android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations Je l'ai changé en "implémentation". Cependant, Je ne suis pas en mesure d'utiliser ma tâche copyLibs car la résolution de la mise en œuvre de la configuration directement n'est pas autorisée selon la sortie d'erreur de construction Gradle:

$ ./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

Voir ci-dessous mon fichier build.gradle actuel pour le module d'application: appliquez le 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

Si j'utilise "compiler", cela fonctionne, mais je voudrais être conforme à la dernière recommandation sur ce plugin l'utilisation.

J'ai besoin d'aide pour mettre à niveau ma tâche copyLibs afin de fonctionner comme avant la mise à niveau de mon environnement. J'utilisais le plugin gradle 2.2.3 pour Android Studio et outil Gradle 2.14.1.

22
Rafael

au lieu d'utiliser configurations.implementation, la meilleure option est d'utiliser: configurations.runtimeClasspath

vous pouvez également penser à: compileClasspath default

15
the anonymous user

Cela n'aidera probablement pas ou n'aura pas une meilleure façon de résoudre mais ...

Vous pouvez mettre vos dépendances d'une manière qu'il est possible de copier en procédant comme suit:

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/"
}

Cela aide également si vous avez une tâche Jar qui arrête de placer les dépendances dans le fichier jar car vous êtes passé de compile à implementation.

Vous pouvez utiliser:

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

Au lieu de:

from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
7
ViníciusPJ

Je fais la configuration peut être résolue, donc aucune exception ne récupère le fichier de dependcenies

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

println configurations.implementation.resolve()
println configurations.api.resolve()
6
act262

Une autre suggestion.

J'ai créé ma configuration personnalisée, puis je l'ai utilisée comme configurations.customConfig:

configurations {
  customConfig.extendsFrom implementation
}
5
mortalis

Je voulais faire un commentaire, mais je manque toujours de la réputation requise pour le faire (à un point !!>. <). Il ne semble pas qu'il existe un moyen d'acquérir la liste des dépendances implementation et les compileClasspath mentionnés à le ticket Gradle Rafael publié ne fonctionnera pas si vous travaille avec Android directement, comme dans mon cas où j'ai besoin que les dépendances soient exportées pour que nity3D puisse les empaqueter pour publication.

Donc .. il semble que la seule solution dans ce cas est d'utiliser le type compile obsolète.

5
Cornelia Xaos

J'ai commencé à obtenir cette erreur après la mise à niveau de Gradle 5.5 vers 5.6, et cela se produit lorsque j'essaie de synchroniser le projet dans IntelliJ.

Grâce à cela réponse sur une autre question, je l'ai résolu en appliquant le ideaplugin à tous les projets, puis en exécutant gradle cleanIdea et après, tout a recommencé à fonctionner.

Un autre jour, une autre solution #inexplicable à un problème.

0
smac89