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.
au lieu d'utiliser configurations.implementation, la meilleure option est d'utiliser: configurations.runtimeClasspath
vous pouvez également penser à: compileClasspath default
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) }}
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()
Une autre suggestion.
J'ai créé ma configuration personnalisée, puis je l'ai utilisée comme configurations.customConfig
:
configurations {
customConfig.extendsFrom implementation
}
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.
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 idea
plugin à 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.