react-native-vector-icons icon indicating copy to clipboard operation
react-native-vector-icons copied to clipboard

build(gradle): fix lint task dep names for 8.6

Open david-gettins opened this issue 1 year ago • 11 comments

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.

david-gettins avatar Jul 08 '24 10:07 david-gettins

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.

Masahito-I avatar Aug 02 '24 17:08 Masahito-I

Upgrading to 10.1.0 fixed it for me. See PR #1585

mzanini avatar Aug 11 '24 04:08 mzanini

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:

      1. Declare task ':app:copyReactNativeVectorIconFonts' as an input of ':app:generateReleaseLintReportModel'.
      2. Declare an explicit dependency on ':app:copyReactNativeVectorIconFonts' from ':app:generateReleaseLintReportModel' using Task#dependsOn.
      3. 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 avatar Aug 19 '24 14:08 djindal61

@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.

david-gettins avatar Aug 19 '24 15:08 david-gettins

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)
      }
image

djindal61 avatar Aug 19 '24 16:08 djindal61

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.

david-gettins avatar Aug 19 '24 16:08 david-gettins

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

djindal61 avatar Aug 19 '24 16:08 djindal61

Hi @david-gettins Could you please help me to fix that issue

djindal61 avatar Aug 19 '24 18:08 djindal61

@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.

david-gettins avatar Aug 20 '24 06:08 david-gettins

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

johnf avatar Aug 25 '24 08:08 johnf

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)
      }
}

volpima avatar Aug 26 '24 14:08 volpima

Closing in favour of #1648

johnf avatar Sep 15 '24 05:09 johnf