Skip to content

Commit 40e459a

Browse files
authored
fix: build plugins using same gradle config structure as apps (#5671)
1 parent 32d3a0f commit 40e459a

File tree

3 files changed

+177
-122
lines changed

3 files changed

+177
-122
lines changed

lib/services/android-plugin-build-service.ts

-78
Original file line numberDiff line numberDiff line change
@@ -144,40 +144,6 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService {
144144
return promise;
145145
}
146146

147-
private getIncludeGradleCompileDependenciesScope(
148-
includeGradleFileContent: string
149-
): Array<string> {
150-
const indexOfDependenciesScope = includeGradleFileContent.indexOf(
151-
"dependencies"
152-
);
153-
const result: Array<string> = [];
154-
155-
if (indexOfDependenciesScope === -1) {
156-
return result;
157-
}
158-
159-
const indexOfRepositoriesScope = includeGradleFileContent.indexOf(
160-
"repositories"
161-
);
162-
163-
let repositoriesScope = "";
164-
if (indexOfRepositoriesScope >= 0) {
165-
repositoriesScope = this.getScope(
166-
"repositories",
167-
includeGradleFileContent
168-
);
169-
result.push(repositoriesScope);
170-
}
171-
172-
const dependenciesScope = this.getScope(
173-
"dependencies",
174-
includeGradleFileContent
175-
);
176-
result.push(dependenciesScope);
177-
178-
return result;
179-
}
180-
181147
private getScope(scopeName: string, content: string): string {
182148
const indexOfScopeName = content.indexOf(scopeName);
183149
const openingBracket = "{";
@@ -411,18 +377,13 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService {
411377
const settingsGradlePath = path.join(pluginTempDir, "settings.gradle");
412378

413379
this.$fs.copyFile(allGradleTemplateFiles, pluginTempDir);
414-
this.addCompileDependencies(platformsAndroidDirPath, buildGradlePath);
415380
const runtimeGradleVersions = await this.getRuntimeGradleVersions(
416381
projectDir
417382
);
418383
this.replaceGradleVersion(
419384
pluginTempDir,
420385
runtimeGradleVersions.gradleVersion
421386
);
422-
this.replaceGradleAndroidPluginVersion(
423-
buildGradlePath,
424-
runtimeGradleVersions.gradleAndroidPluginVersion
425-
);
426387
this.replaceFileContent(buildGradlePath, "{{pluginName}}", pluginName);
427388
this.replaceFileContent(settingsGradlePath, "{{pluginName}}", pluginName);
428389
}
@@ -642,22 +603,6 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService {
642603
);
643604
}
644605

645-
private replaceGradleAndroidPluginVersion(
646-
buildGradlePath: string,
647-
version: string
648-
): void {
649-
const gradleAndroidPluginVersionPlaceholder =
650-
"{{runtimeAndroidPluginVersion}}";
651-
const gradleAndroidPluginVersion =
652-
version || AndroidBuildDefaults.GradleAndroidPluginVersion;
653-
654-
this.replaceFileContent(
655-
buildGradlePath,
656-
gradleAndroidPluginVersionPlaceholder,
657-
gradleAndroidPluginVersion
658-
);
659-
}
660-
661606
private replaceFileContent(
662607
filePath: string,
663608
content: string,
@@ -669,29 +614,6 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService {
669614
this.$fs.writeFile(filePath, replacedFileContent);
670615
}
671616

672-
private addCompileDependencies(
673-
platformsAndroidDirPath: string,
674-
buildGradlePath: string
675-
): void {
676-
const includeGradlePath = path.join(
677-
platformsAndroidDirPath,
678-
INCLUDE_GRADLE_NAME
679-
);
680-
if (this.$fs.exists(includeGradlePath)) {
681-
const includeGradleContent = this.$fs.readText(includeGradlePath);
682-
const compileDependencies = this.getIncludeGradleCompileDependenciesScope(
683-
includeGradleContent
684-
);
685-
686-
if (compileDependencies.length) {
687-
this.$fs.appendFile(
688-
buildGradlePath,
689-
"\n" + compileDependencies.join("\n")
690-
);
691-
}
692-
}
693-
}
694-
695617
private copyAar(
696618
shortPluginName: string,
697619
pluginTempDir: string,

vendor/gradle-plugin/build.gradle

+176-28
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,72 @@ apply plugin: 'com.android.library'
77
apply plugin: 'kotlin-android'
88
apply plugin: 'kotlin-parcelize'
99

10-
buildscript {
11-
def getDepPlatformDir = { dep ->
12-
file("${project.ext.USER_PROJECT_ROOT}/${project.ext.PLATFORMS_ANDROID}/${dep.directory}/$PLATFORMS_ANDROID")
13-
}
14-
def computeKotlinVersion = { -> project.hasProperty("kotlinVersion") ? kotlinVersion : "1.6.0" }
15-
def kotlinVersion = computeKotlinVersion()
16-
repositories {
17-
google()
18-
jcenter()
10+
def loadPropertyFile = { path ->
11+
try {
12+
if(project.hasProperty("loadedProperties_${path}")) {
13+
logger.info "\t + gradle properties already loaded. SKIPPING"
14+
} else {
15+
logger.info "\t + trying to load gradle properties from \"$path\""
16+
17+
Properties properties = new Properties()
18+
properties.load(new FileInputStream("$path"))
19+
properties.each { prop ->
20+
logger.info "\t + [$path] setting ${prop.key} = ${prop.value}"
21+
project.ext.set(prop.key, prop.value)
22+
}
23+
project.ext.set("loadedProperties_${path}", true)
24+
25+
outLogger.withStyle(Style.SuccessHeader).println "\t + loaded gradle properties from \"$path\""
26+
}
27+
} catch(Exception ex) {
28+
logger.warn "\t + failed to load gradle properties from \"$path\". Error is: ${ex.getMessage()}"
1929
}
20-
dependencies {
21-
classpath 'com.android.tools.build:gradle:{{runtimeAndroidPluginVersion}}'
22-
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
30+
}
31+
32+
buildscript {
33+
def GRADLE_PROPERTIES_FILENAME = "gradle.properties"
2334

24-
// NOTE: Do not place your application dependencies here; they belong
25-
// in the individual module build.gradle files
35+
def getFile = { dir, filename ->
36+
File file = new File("$dir$File.separator$filename")
37+
file?.exists() ? file : null
2638
}
2739

28-
// Set up styled logger
29-
project.ext.getDepPlatformDir = getDepPlatformDir
30-
project.ext.outLogger = services.get(StyledTextOutputFactory).create("colouredOutputLogger")
40+
def getPropertyFile = { dir ->
41+
return getFile(dir, GRADLE_PROPERTIES_FILENAME)
42+
}
43+
def getUserProperties = { dir ->
44+
def file = getPropertyFile(dir)
45+
if (!file) {
46+
return null
47+
}
3148

32-
project.ext.USER_PROJECT_ROOT = "$rootDir/../../.."
33-
project.ext.PLATFORMS_ANDROID = "platforms/android"
34-
project.ext.PLUGIN_NAME = "{{pluginName}}"
49+
Properties properties = new Properties()
50+
properties.load(file.newInputStream())
3551

36-
// the build script will not work with previous versions of the CLI (3.1 or earlier)
37-
def dependenciesJson = file("${project.ext.USER_PROJECT_ROOT}/${project.ext.PLATFORMS_ANDROID}/dependencies.json")
38-
def appDependencies = new JsonSlurper().parseText(dependenciesJson.text)
39-
def pluginData = appDependencies.find { it.name == project.ext.PLUGIN_NAME }
40-
project.ext.nativescriptDependencies = appDependencies.findAll{pluginData.dependencies.contains(it.name)}
41-
project.ext.getAppPath = { ->
52+
return properties
53+
}
54+
def loadPropertyFile = { path ->
55+
try {
56+
if(project.hasProperty("loadedProperties_${path}")) {
57+
logger.info "\t + gradle properties already loaded. SKIPPING"
58+
} else {
59+
logger.info "\t + trying to load gradle properties from \"$path\""
60+
61+
Properties properties = new Properties()
62+
properties.load(new FileInputStream("$path"))
63+
properties.each { prop ->
64+
logger.info "\t + [$path] setting ${prop.key} = ${prop.value}"
65+
project.ext.set(prop.key, prop.value)
66+
}
67+
project.ext.set("loadedProperties_${path}", true)
68+
69+
outLogger.withStyle(Style.SuccessHeader).println "\t + loaded gradle properties from \"$path\""
70+
}
71+
} catch(Exception ex) {
72+
logger.warn "\t + failed to load gradle properties from \"$path\". Error is: ${ex.getMessage()}"
73+
}
74+
}
75+
def getAppPath = { ->
4276
def relativePathToApp = "app"
4377
def nsConfigFile = file("$USER_PROJECT_ROOT/nsconfig.json")
4478
def nsConfig
@@ -59,8 +93,7 @@ buildscript {
5993

6094
return project.ext.appPath
6195
}
62-
63-
project.ext.getAppResourcesPath = { ->
96+
def getAppResourcesPath = { ->
6497
def relativePathToAppResources
6598
def absolutePathToAppResources
6699
def nsConfigFile = file("$USER_PROJECT_ROOT/nsconfig.json")
@@ -87,6 +120,95 @@ buildscript {
87120
return absolutePathToAppResources
88121
}
89122

123+
def initialize = { ->
124+
// set up our logger
125+
project.ext.outLogger = services.get(StyledTextOutputFactory).create("colouredOutputLogger")
126+
outLogger.withStyle(Style.SuccessHeader).println "\t ~initialize"
127+
128+
129+
project.ext.USER_PROJECT_ROOT = "$rootDir/../../.."
130+
project.ext.PLATFORMS_ANDROID = "platforms/android"
131+
project.ext.PLUGIN_NAME = "{{pluginName}}"
132+
133+
def userDir = "$USER_PROJECT_ROOT"
134+
rootProject.ext.userDefinedGradleProperties = getUserProperties("${getAppResourcesPath()}/Android")
135+
136+
loadPropertyFile("$USER_PROJECT_ROOT/${project.ext.PLATFORMS_ANDROID}/gradle.properties")
137+
loadPropertyFile("$USER_PROJECT_ROOT/${project.ext.PLATFORMS_ANDROID}/additional_gradle.properties")
138+
139+
if (rootProject.hasProperty("userDefinedGradleProperties")) {
140+
rootProject.ext.userDefinedGradleProperties.each { entry ->
141+
def propertyName = entry.getKey()
142+
def propertyValue = entry.getValue()
143+
project.ext.set(propertyName, propertyValue)
144+
}
145+
}
146+
147+
def getDepPlatformDir = { dep ->
148+
file("${project.ext.USER_PROJECT_ROOT}/${project.ext.PLATFORMS_ANDROID}/${dep.directory}/$PLATFORMS_ANDROID")
149+
}
150+
151+
// Set up styled logger
152+
project.ext.getDepPlatformDir = getDepPlatformDir
153+
project.ext.outLogger = services.get(StyledTextOutputFactory).create("colouredOutputLogger")
154+
155+
156+
// the build script will not work with previous versions of the CLI (3.1 or earlier)
157+
def dependenciesJson = file("${project.ext.USER_PROJECT_ROOT}/${project.ext.PLATFORMS_ANDROID}/dependencies.json")
158+
def appDependencies = new JsonSlurper().parseText(dependenciesJson.text)
159+
def pluginData = appDependencies.find { it.name == project.ext.PLUGIN_NAME }
160+
project.ext.nativescriptDependencies = appDependencies.findAll{pluginData.dependencies.contains(it.name)}.plus([pluginData])
161+
162+
project.ext.getAppResourcesPath = { ->
163+
def relativePathToAppResources
164+
def absolutePathToAppResources
165+
def nsConfigFile = file("$USER_PROJECT_ROOT/nsconfig.json")
166+
def nsConfig
167+
168+
if (nsConfigFile.exists()) {
169+
nsConfig = new JsonSlurper().parseText(nsConfigFile.getText("UTF-8"))
170+
}
171+
172+
if (project.hasProperty("appResourcesPath")) {
173+
// when appResourcesPath is passed through -PappResourcesPath=/path/to/App_Resources
174+
// the path could be relative or absolute - either case will work
175+
relativePathToAppResources = appResourcesPath
176+
absolutePathToAppResources = Paths.get(USER_PROJECT_ROOT).resolve(relativePathToAppResources).toAbsolutePath()
177+
} else if (nsConfig != null && nsConfig.appResourcesPath != null) {
178+
relativePathToAppResources = nsConfig.appResourcesPath
179+
absolutePathToAppResources = Paths.get(USER_PROJECT_ROOT).resolve(relativePathToAppResources).toAbsolutePath()
180+
} else {
181+
absolutePathToAppResources = "${getAppPath()}/App_Resources"
182+
}
183+
184+
project.ext.appResourcesPath = absolutePathToAppResources
185+
186+
return absolutePathToAppResources
187+
}
188+
189+
190+
project.ext.getAppPath = { ->
191+
def relativePathToApp = "app"
192+
def nsConfigFile = file("$USER_PROJECT_ROOT/nsconfig.json")
193+
def nsConfig
194+
195+
if (nsConfigFile.exists()) {
196+
nsConfig = new JsonSlurper().parseText(nsConfigFile.getText("UTF-8"))
197+
}
198+
199+
if (project.hasProperty("appPath")) {
200+
// when appPath is passed through -PappPath=/path/to/app
201+
// the path could be relative or absolute - either case will work
202+
relativePathToApp = appPath
203+
} else if (nsConfig != null && nsConfig.appPath != null) {
204+
relativePathToApp = nsConfig.appPath
205+
}
206+
207+
project.ext.appPath = Paths.get(USER_PROJECT_ROOT).resolve(relativePathToApp).toAbsolutePath()
208+
209+
return project.ext.appPath
210+
}
211+
}
90212
def applyBuildScriptConfigurations = { ->
91213
def absolutePathToAppResources = getAppResourcesPath()
92214
def pathToBuildScriptGradle = "$absolutePathToAppResources/Android/buildscript.gradle"
@@ -112,8 +234,25 @@ buildscript {
112234
apply from: pathToPluginBuildScriptGradle, to: buildscript
113235
}
114236
}
237+
238+
initialize()
115239
applyBuildScriptConfigurations()
116240

241+
def computeKotlinVersion = { -> project.hasProperty("kotlinVersion") ? kotlinVersion : "${ns_default_kotlin_version}" }
242+
def computeBuildToolsVersion = { -> project.hasProperty("androidBuildToolsVersion") ? androidBuildToolsVersion : "${NS_DEFAULT_ANDROID_BUILD_TOOLS_VERSION}" }
243+
def kotlinVersion = computeKotlinVersion()
244+
def androidBuildToolsVersion = computeBuildToolsVersion()
245+
246+
repositories {
247+
google()
248+
mavenCentral()
249+
}
250+
dependencies {
251+
classpath "com.android.tools.build:gradle:$androidBuildToolsVersion"
252+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
253+
classpath "org.codehaus.groovy:groovy-all:3.0.8"
254+
}
255+
117256
}
118257

119258
def pluginDependencies
@@ -156,6 +295,7 @@ android {
156295
nativescriptDependencies.each { dep ->
157296
def includeGradlePath = "${getDepPlatformDir(dep)}/include.gradle"
158297
if (file(includeGradlePath).exists()) {
298+
outLogger.withStyle(Style.SuccessHeader).println "\t + applying plugin include.gradle from dependency ${includeGradlePath}"
159299
apply from: includeGradlePath
160300
}
161301
}
@@ -171,6 +311,10 @@ android {
171311
versionCode 1
172312
versionName "1.0"
173313
}
314+
lintOptions {
315+
checkReleaseBuilds false
316+
abortOnError false
317+
}
174318
}
175319

176320

@@ -187,9 +331,13 @@ def applyBeforePluginGradleConfiguration() {
187331
task addDependenciesFromNativeScriptPlugins {
188332
nativescriptDependencies.each { dep ->
189333
def aarFiles = fileTree(dir: getDepPlatformDir(dep), include: ["**/*.aar"])
334+
def currentDirname = file(project.buildscript.sourceFile).getParentFile().getName()
190335
aarFiles.each { aarFile ->
191336
def length = aarFile.name.length() - 4
192337
def fileName = aarFile.name[0..<length]
338+
if(fileName == currentDirname) {
339+
return
340+
}
193341
outLogger.withStyle(Style.SuccessHeader).println "\t + adding aar plugin dependency: " + aarFile.getAbsolutePath()
194342
project.dependencies.add("implementation", [name: fileName, ext: "aar"])
195343
}

vendor/gradle-plugin/gradle.properties

+1-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,4 @@
1-
# Project-wide Gradle settings.
2-
3-
# IDE (e.g. Android Studio) users:
4-
# Gradle settings configured through the IDE *will override*
5-
# any settings specified in this file.
6-
7-
# For more details on how to configure your build environment visit
8-
# http://www.gradle.org/docs/current/userguide/build_environment.html
9-
10-
# When configured, Gradle will run in incubating parallel mode.
11-
# This option should only be used with decoupled projects. More details, visit
12-
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13-
#org.gradle.parallel=true
14-
15-
# Specifies the JVM arguments used for the daemon process.
16-
# The setting is particularly useful for tweaking memory settings.
1+
# Nativescript CLI plugin build gradle properties
172
org.gradle.jvmargs=-Xmx16384M
183

194
android.enableJetifier=true

0 commit comments

Comments
 (0)