89 строки
2.4 KiB
Groovy
89 строки
2.4 KiB
Groovy
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
|
|
def codegenDir = "$rootDir/packages/react-native-codegen";
|
|
def codegenGenerateSchemaCli = "$codegenDir/lib/cli/combine/combine-js-to-schema-cli.js";
|
|
def codegenGenerateNativeModuleSpecsCli = "$rootDir/scripts/generate-native-modules-specs-cli.js";
|
|
def schemaFile = "schema.json";
|
|
|
|
// TODO: Consider building Gradle plugin instead.
|
|
|
|
/**
|
|
* The config is derived from app-level `project.react`.
|
|
*/
|
|
ext.generateNativeArtifactsFromJavaScript = { Map config ->
|
|
def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"];
|
|
def jsRootDir = config.jsRootDir ?: config.root;
|
|
|
|
if (!config.enableCodegen) {
|
|
return;
|
|
}
|
|
|
|
// 1. Create build dir
|
|
def generatedSrcDir = file("$buildDir/generated/source/codegen");
|
|
|
|
// 2. Produce schema from JS files.
|
|
task generateCodegenSchemaFromJavaScript(type: Exec) {
|
|
doFirst {
|
|
generatedSrcDir.deleteDir()
|
|
generatedSrcDir.mkdirs()
|
|
}
|
|
|
|
def schemaOutputFile = file("$generatedSrcDir/$schemaFile");
|
|
|
|
inputs.files fileTree(dir: codegenDir)
|
|
inputs.files fileTree(dir: jsRootDir)
|
|
outputs.file(schemaOutputFile)
|
|
|
|
def execCommands = ["yarn"] + nodeExecutableAndArgs + [
|
|
codegenGenerateSchemaCli,
|
|
"$schemaOutputFile",
|
|
jsRootDir,
|
|
];
|
|
commandLine execCommands
|
|
|
|
ext.schema = {
|
|
schemaOutputFile
|
|
}
|
|
}
|
|
|
|
// 3. Generate Java code from schema
|
|
task generateCodegenArtifactsFromSchema(dependsOn: 'generateCodegenSchemaFromJavaScript', type: Exec) {
|
|
|
|
def generatedSchema = tasks.generateCodegenSchemaFromJavaScript.schema();
|
|
def javaPackageName = config.codegenJavaPackageName ?: "com.facebook.fbreact.specs.beta";
|
|
def javaPackageDir = javaPackageName.replace(".", "/");
|
|
def outputDir = file("$generatedSrcDir/java/$javaPackageDir");
|
|
|
|
inputs.files fileTree(dir: codegenDir)
|
|
inputs.files generatedSchema
|
|
outputs.dir(outputDir)
|
|
|
|
def execCommands = ["yarn"] + nodeExecutableAndArgs + [
|
|
codegenGenerateNativeModuleSpecsCli,
|
|
"android",
|
|
"$generatedSchema",
|
|
"$outputDir",
|
|
];
|
|
commandLine execCommands
|
|
}
|
|
|
|
// 4. add deps + srcs
|
|
preBuild.dependsOn generateCodegenArtifactsFromSchema
|
|
|
|
android {
|
|
sourceSets {
|
|
main {
|
|
java {
|
|
srcDirs += "$generatedSrcDir/java"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|