// Gradle script for generating serialized public app config (from app.config.js/ts or app.json) and bundling it into the APK import org.apache.tools.ant.taskdefs.condition.Os def expoConstantsDir = project.providers.exec { workingDir(projectDir) commandLine("node", "-e", "console.log(require('path').dirname(require.resolve('expo-constants/package.json')));") }.standardOutput.asText.get().trim() def config = project.hasProperty("react") ? project.react : []; def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"] afterEvaluate { def expoGradleExtension = gradle.extensions.findByName("expoGradle") def customProjectRoot = expoGradleExtension?.projectRoot def projectRoot = file("${customProjectRoot ?: rootProject.projectDir}") def assetsDir = file("$buildDir/generated/assets/expo-constants") def currentCreateConfigTask = tasks.register('createExpoConfig', Exec) { description = 'expo-constants: Create app.config.' doFirst { assetsDir.deleteDir() assetsDir.mkdirs() } // Mark the task as always out-of-date so it always runs - ie. regenerate app.config on every build outputs.upToDateWhen { false } // Add generated assetsDir into assets.srcDirs project.android.sourceSets.main.assets.srcDirs += assetsDir // Set up outputs so gradle can cache the result outputs.dir assetsDir // Switch to project root and generate the app config workingDir projectRoot if (Os.isFamily(Os.FAMILY_WINDOWS)) { commandLine("cmd", "/c", *nodeExecutableAndArgs, "$expoConstantsDir/scripts/getAppConfig.js", projectRoot, assetsDir) } else { commandLine(*nodeExecutableAndArgs, "$expoConstantsDir/scripts/getAppConfig.js", projectRoot, assetsDir) } } // Generate app.config at preBuild tasks.getByName('preBuild').dependsOn(currentCreateConfigTask) }