-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.gradle.kts
137 lines (121 loc) · 5.87 KB
/
build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import com.automattic.android.publish.CheckS3Version
import org.json.JSONObject
// This value is introduced to control breaking changes to the publisher itself.
// Whenever we need to make a change, such as updating the `compileSdkVersion`, we will want to
// publish the artifacts of the libraries again using the version. However, we don't want to
// override existing artifacts, so we are using a hardcoded value that's supposed to be updated
// after every breaking change.
//
// For example, let's say we have already published the `9.13.6` version of the `react-native-svg`
// library with `compileSdkVersion = 30`. Then, we decided to update the `compileSdkVersion` to 31.
// In this case, we'll want to increment the `publisherVersion` so that the artifacts will be
// published again in a different path.
//
// Although this allows different clients to use different artifacts, since we only have one client
// this is now the most important use case for this implementation. Instead, this implementation
// aims to make it easier to test publisher changes without having to override the artifacts.
val publisherVersion = "v6"
plugins {
id("com.android.library") apply false
id("com.automattic.android.publish-to-s3") apply false
}
val defaultCompileSdkVersion = 34
val defaultMinSdkVersion = 24
val defaultTargetSdkVersion = 34
val excludeAppGlideModule = true
val kotlinVersion = "1.8.0"
// Set project extra properties
project.ext.set("compileSdkVersion", defaultCompileSdkVersion)
project.ext.set("minSdkVersion", defaultMinSdkVersion)
project.ext.set("targetSdkVersion", defaultTargetSdkVersion)
project.ext.set("excludeAppGlideModule", excludeAppGlideModule)
project.ext.set("kotlinVersion", kotlinVersion)
// Fetch dependencies versions from package.json
val packageJson = JSONObject(File("$rootDir/package.json").readText())
val packageDevDependencies: JSONObject = packageJson.optJSONObject("devDependencies")
val reactNativeVersion: String = packageDevDependencies.optString("react-native")
val publishGroupId = "org.wordpress.react-native-libraries.$publisherVersion"
subprojects {
apply(plugin = "maven-publish")
apply(plugin = "com.automattic.android.publish-to-s3")
repositories {
exclusiveContent {
forRepository {
maven {
url = uri("https://a8c-libs.s3.amazonaws.com/android/react-native-mirror")
}
}
filter {
includeModule("com.facebook.react", "react-native")
}
}
mavenCentral()
google()
}
configurations.all {
resolutionStrategy {
dependencySubstitution {
// This substitution is based on React Native Gradle plugin.
// Reference: https://t.ly/38jk
substitute(module("com.facebook.react:react-android"))
.using(module("com.facebook.react:react-android:$reactNativeVersion"))
substitute(module("com.facebook.react:hermes-android"))
.using(module("com.facebook.react:hermes-android:$reactNativeVersion"))
// For backward-compatibility, we also substitute `react-native` module
// with the new module `react-android`.
substitute(module("com.facebook.react:react-native"))
.using(module("com.facebook.react:react-android:$reactNativeVersion"))
}
}
}
afterEvaluate {
afterEvaluate {
configure<PublishingExtension> {
publications {
create<MavenPublication>("S3") {
from(components["release"])
groupId = publishGroupId
artifactId = project.name
// Version is overriden by 'publish-to-s3' plugin, however there seems to be an
// edge case where the `.module` metadata file doesn't contain the correct
// version information for some libraries (i.e. "react-native-fast-image").
// So, we are setting the version information here as well.
//
// Hopefully we can address this in the `publish-to-s3-gradle-plugin`, but
// even after it's fixed in the plugin, this is OK to keep. The reason we
// normally don't set it is to communicate that it'll be overriden, but with
// this documentation in place, that's not a problem.
version = getPackageVersion(project.name)
versionMapping {
allVariants {
fromResolutionOf("releaseRuntimeClasspath")
}
}
}
}
}
}
}
tasks.withType(com.automattic.android.publish.PrepareToPublishToS3Task::class.java) {
val packageVersion = getPackageVersion(project.name)
// Override the default behaviour of 'publish-to-s3' plugin since we always want to specify the version
tagName = packageVersion
}
tasks.register("assertVersionIsNotAlreadyPublished") {
doLast {
val packageVersion = getPackageVersion(project.name)
val checkS3Version = CheckS3Version(publishGroupId, project.name, packageVersion)
if (checkS3Version.check()) {
throw IllegalStateException("'${project.name}' version '$packageVersion' is already published!")
}
}
}
}
fun getPackageVersion(projectName: String): String {
val jsonProperty = when (projectName) {
"react-native-masked-view" -> "@react-native-masked-view/masked-view"
"react-native-clipboard" -> "@react-native-clipboard/clipboard"
else -> projectName
}
return packageDevDependencies.optString(jsonProperty)
}