¿Por qué Gradle grita "Deprecated features" y qué hacer al respecto?
\n\n¿Alguna vez ha ejecutado la compilación de un proyecto Kotlin y ha visto el mensaje aterrador: Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0? Si es así, no está solo. Esta pregunta ha acumulado miles de visitas en Stack Overflow, y hoy la analizaremos en detalle.
Imagínese: escribe en Kotlin, todo funciona, pero Gradle de repente se vuelve caprichoso. Dice: "Oye, estás usando funciones antiguas que eliminaré en la versión 5.0". Es como si su máquina de café favorita le dijera que mañana dejará de aceptar tazas viejas. Es molesto, pero tiene solución.
\n\nEn este artículo, no solo mostraremos cómo eliminar el error. Compararemos tres enfoques de solución: desde el rápido "parche" hasta la refactorización profesional. Descubrirá por qué Gradle considera su código obsoleto y cómo reescribirlo de manera moderna.
\n\n¿Qué son las funciones obsoletas en Gradle?
\n\nLas funciones obsoletas son aquellas partes de la API que los desarrolladores de Gradle planean eliminar en el futuro. Se mantienen por compatibilidad inversa, pero ya no se recomienda usarlas. Cuando ve esta advertencia, Gradle literalmente dice: "Tu proyecto se compilará ahora, pero después de actualizar a la versión 5.0, no".
\n\nLa mayoría de las veces, el problema radica en:
\n- \n
- Plugins obsoletos (por ejemplo, versiones antiguas de
kotlin-gradle-plugin) \n - Dependencias implícitas (usar
compileen lugar deimplementation) \n - Scripts en Groovy que no están adaptados a Kotlin DSL \n
- Llamadas directas a métodos obsoletos en
build.gradle\n
Enfoque 1: Solución rápida: suprimir las advertencias
\n\nLa forma más sencilla (pero no la más correcta) es simplemente decirle a Gradle: "Cállate y trabaja". Es como tapar la luz de Check Engine con cinta adhesiva. El coche funcionará, pero los problemas persistirán.
\n\nAgregue el siguiente bloque en build.gradle.kts (Kotlin DSL):
tasks.withType<Wrapper> {\n gradleVersion = "4.10.3" // congelar la versión\n}\n\n// O suprimir la advertencia\nallprojects {\n tasks.withType<AbstractCompile> {\n options.isDeprecation = false\n }\n}\n\nVentajas: rápido, no requiere cambios de código, la compilación se realiza.
\nDesventajas: no resuelve el problema, solo lo pospone. Al migrar a Gradle 5.0+, el proyecto se romperá. Además, se pierden importantes mejoras de rendimiento y seguridad.
\n\nCuándo usarlo: solo si necesita compilar el proyecto urgentemente y no hay tiempo para refactorizar. Pero asegúrese de planificar una solución adecuada.
\n\nEnfoque 2: Migración a configuraciones modernas
\n\nEste es el "término medio". No solo tapa el error, sino que pone el proyecto en orden. Analicemos los problemas típicos con un ejemplo de proyecto Kotlin.
\n\nReemplazar compile por implementation/api
\n\nLa forma antigua de declarar dependencias, compile, quedó obsoleta en Gradle 3.0. En su lugar, use implementation y api.
Antes (Groovy):
\ndependencies {\n compile 'org.jetbrains.kotlin:kotlin-stdlib:1.3.72'\n compile 'com.squareup.retrofit2:retrofit:2.9.0'\n}\n\nAhora (Kotlin DSL):
\ndependencies {\n implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0")\n implementation("com.squareup.retrofit2:retrofit:2.9.0")\n}\n\nLa diferencia es simple: implementation oculta la dependencia de los consumidores del módulo, acelerando la compilación. api la hace visible, como el antiguo compile.
Actualizar el plugin de Kotlin
\n\nLas versiones antiguas de kotlin-gradle-plugin suelen usar API obsoletas de Gradle. Verifique la versión actual en kotlinlang.org y act