build(gradle): fix lint task dep names for 8.6
Resolves #1631
The build process fails due to an issue with the configuration of the :app:generateDebugLintReportModel task in Gradle. The error occurs because the task uses the output of :app:copyReactNativeVectorIconFonts without declaring an explicit or implicit dependency, leading to potential incorrect results depending on the task execution order.
To resolve this issue for React Native 0.74.x, the following patch needs to be applied to fonts.gradle in react-native-vector-icons:
@@ -26,18 +26,28 @@ afterEvaluate {
android.applicationVariants.all { def variant ->
def targetName = variant.name.capitalize()
- def lintVitalAnalyzeTask = tasks.findByName("lintVitalAnalyze${targetName}")
+ def lintVitalAnalyzeTask = tasks.findByName("lintVitalAnalyze${targetName}")
if (lintVitalAnalyzeTask) {
- lintVitalAnalyzeTask.dependsOn(fontCopyTask)
+ lintVitalAnalyzeTask.dependsOn(fontCopyTask)
+ }
+
+ def lintAnalyzeTask = tasks.findByName("lintAnalyze${targetName}")
+ if (lintAnalyzeTask) {
+ lintAnalyzeTask.dependsOn(fontCopyTask)
}
- def generateReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
+ def generateVitalReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
+ if (generateVitalReportTask) {
+ generateVitalReportTask.dependsOn(fontCopyTask)
+ }
+
+ def generateReportTask = tasks.findByName("generate${targetName}LintReportModel")
if (generateReportTask) {
generateReportTask.dependsOn(fontCopyTask)
}
def generateAssetsTask = tasks.findByName("generate${targetName}Assets")
generateAssetsTask.dependsOn(fontCopyTask)
- }
+ }
}
This patch ensures that the necessary dependencies are explicitly declared, preventing the build failure caused by the changes in task names from Gradle 8.3 to 8.6.
That would be helpful if you could apply this patch soon. It's been 4 months since the react native 0.74 was released. I always need to add it manually while developing my app.
Upgrading to 10.1.0 fixed it for me. See PR #1585
Hi @david-gettins
I created the patch and it does not work. My android build is continusoly failing.
Here is the below error FAILURE: Build failed with an exception.
- What went wrong:
A problem was found with the configuration of task ':app:generateReleaseLintReportModel' (type 'LintModelWriterTask').
-
Gradle detected a problem with the following location: '/Users/runner/work/1/s/android/app/build/intermediates/ReactNativeVectorIcons'.
Reason: Task ':app:generateReleaseLintReportModel' uses this output of task ':app:copyReactNativeVectorIconFonts' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.
Possible solutions:
- Declare task ':app:copyReactNativeVectorIconFonts' as an input of ':app:generateReleaseLintReportModel'.
- Declare an explicit dependency on ':app:copyReactNativeVectorIconFonts' from ':app:generateReleaseLintReportModel' using Task#dependsOn.
- Declare an explicit dependency on ':app:copyReactNativeVectorIconFonts' from ':app:generateReleaseLintReportModel' using Task#mustRunAfter.
For more information, please refer to https://docs.gradle.org/8.6/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.
-
here is the patch that i create it diff --git a/node_modules/react-native-vector-icons/fonts.gradle b/node_modules/react-native-vector-icons/fonts.gradle index ad15ebd..47d4af9 100644 --- a/node_modules/react-native-vector-icons/fonts.gradle +++ b/node_modules/react-native-vector-icons/fonts.gradle @@ -32,6 +32,15 @@ afterEvaluate { lintVitalAnalyzeTask.dependsOn(fontCopyTask) }
-
def lintAnalyzeTask = tasks.findByName("lintAnalyze${targetName}") -
if (lintAnalyzeTask) { -
lintAnalyzeTask.dependsOn(fontCopyTask) -
} -
def generateVitalReportTask = tasks.findByName("generate${targetName}LintVitalReportModel") -
if (generateVitalReportTask) { -
generateVitalReportTask.dependsOn(fontCopyTask) -
} def generateReportTask = tasks.findByName("generate${targetName}LintVitalReportModel") if (generateReportTask) { generateReportTask.dependsOn(fontCopyTask)
@djindal61, from your error message, it appears you are missing the generate${targetName}LintReportModel task.
The patch I created keeps both new and old task names.
Perhaps try copying the patch I have included in the PR description, replacing yours.
From the code you have pasted, I can only see the generate${targetName}LintVitalReportModel task.
To make it easier for me to help, please wrap your patch with three back ticks and the diff type. See here.
Hi @david-gettins
Let me post you the final fonts.gradle.
I did not remove the old one. I am pasting you the final gradle after patch. In your patch , You added
android.applicationVariants.all { def variant ->
def targetName = variant.name.capitalize()
def lintVitalAnalyzeTask = tasks.findByName("lintVitalAnalyze${targetName}")
if (lintVitalAnalyzeTask) {
lintVitalAnalyzeTask.dependsOn(fontCopyTask)
}
def lintAnalyzeTask = tasks.findByName("lintAnalyze${targetName}")
if (lintAnalyzeTask) {
lintAnalyzeTask.dependsOn(fontCopyTask)
}
def generateVitalReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
if (generateVitalReportTask) {
generateVitalReportTask.dependsOn(fontCopyTask)
}
def generateReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
if (generateReportTask) {
generateReportTask.dependsOn(fontCopyTask)
}
def generateAssetsTask = tasks.findByName("generate${targetName}Assets")
generateAssetsTask.dependsOn(fontCopyTask)
}
Upgrading to 10.1.0 fixed it for me. See PR #1585
That will work when you are on RN 0.73.x, which uses grade 8.3. But, when you upgrade to RN 0.74.x and grade 8.6, the other changes are required too.
hi @david-gettins I am trying to upgrade to 0.74. and only this library failing to make the signed APK.
Is there anything else required apart from patch . ALl 0.74 changes are done and i am able to run the code but i am facing issues while generating build..
Hi @david-gettins Could you please help me to fix that issue
@djindal61 it looks like you have accidentally repeated one of the tasks.
def generateVitalReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
if (generateVitalReportTask) {
generateVitalReportTask.dependsOn(fontCopyTask)
}
def generateReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
if (generateReportTask) {
generateReportTask.dependsOn(fontCopyTask)
}
Change the second one from generate${targetName}LintVitalReportModel to generate${targetName}LintReportModel.
Can folks give this a try https://github.com/oblador/react-native-vector-icons/pull/1648/files
I'm want to try a different direction for this since we've had to keep changing it the last few releases
I had the same problem. Solved using as C:\pathToYourProject\node_modules\react-native-vector-icons\fonts.gradle this one:
/**
* Register font asset source folder
*/
android.sourceSets.main.assets.srcDirs += file("$buildDir/intermediates/ReactNativeVectorIcons")
/**
* Task to copy icon font files
*/
afterEvaluate {
def config = project.hasProperty("vectoricons") ? project.vectoricons : [];
def iconFontsDir = config.iconFontsDir ?: "../../node_modules/react-native-vector-icons/Fonts";
def iconFontNames = config.iconFontNames ?: [ "*.ttf" ];
def fontCopyTask = tasks.create(
name: "copyReactNativeVectorIconFonts",
type: Copy) {
description = "copy vector icon fonts."
into "$buildDir/intermediates/ReactNativeVectorIcons/fonts"
iconFontNames.each { fontName ->
from(iconFontsDir) {
include(fontName)
}
}
}
android.applicationVariants.all { def variant ->
def targetName = variant.name.capitalize()
def lintVitalAnalyzeTask = tasks.findByName("lintVitalAnalyze${targetName}")
if (lintVitalAnalyzeTask) {
lintVitalAnalyzeTask.dependsOn(fontCopyTask)
}
def lintAnalyzeTask = tasks.findByName("lintAnalyze${targetName}")
if (lintAnalyzeTask) {
lintAnalyzeTask.dependsOn(fontCopyTask)
}
def generateVitalReportTask = tasks.findByName("generate${targetName}LintVitalReportModel")
if (generateVitalReportTask) {
generateVitalReportTask.dependsOn(fontCopyTask)
}
def generateReportTask = tasks.findByName("generate${targetName}LintReportModel")
if (generateReportTask) {
generateReportTask.dependsOn(fontCopyTask)
}
def generateAssetsTask = tasks.findByName("generate${targetName}Assets")
generateAssetsTask.dependsOn(fontCopyTask)
}
}
Closing in favour of #1648