Skip to content

Commit 726ee71

Browse files
author
wangfeihang
committed
规范化的maven仓库发布
1 parent 54437ee commit 726ee71

12 files changed

Lines changed: 661 additions & 22 deletions

File tree

localrepo/build.gradle

Lines changed: 0 additions & 22 deletions
This file was deleted.

localrepo/build.gradle.kts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
3+
plugins {
4+
groovy
5+
`kotlin-dsl`
6+
kotlin("jvm") version "1.2.20"
7+
"com.github.dcendents.android-maven"
8+
}
9+
10+
dependencies {
11+
impl(
12+
gradleApi(),
13+
localGroovy(),
14+
"com.android.tools.build:gradle:3.1.2",
15+
kotlin("stdlib"),
16+
"org.apache.httpcomponents:httpclient:4.5.2"
17+
)
18+
}
19+
20+
fun DependencyHandlerScope.impl(vararg dependency: Any) {
21+
dependency.forEach {
22+
"implementation"(it)
23+
}
24+
}
25+
26+
group = "com.github.wangfeihang"
27+
version = "1.0.1"
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package com.yy.publish
2+
3+
import com.yy.publish.analyzer.SdkPathUtil
4+
import groovy.util.Node
5+
import groovy.xml.QName
6+
import org.gradle.api.Action
7+
import org.gradle.api.Project
8+
import org.gradle.api.publish.PublishingExtension
9+
import org.gradle.api.publish.maven.MavenPublication
10+
import java.util.*
11+
12+
/**
13+
* Created by wangfeihang on 2019-08-24.
14+
*/
15+
object PublishExtensionUtil {
16+
fun createPublishingExtension(
17+
project: Project,
18+
publishExtension: UnionPublishRepoExtension,
19+
currentUnionSdkInfo: UnionSdkInfo
20+
) {
21+
project.extensions.configure("publishing", Action<PublishingExtension> {
22+
this.repositories(Action {
23+
this.maven {
24+
credentials {
25+
username = publishExtension.repoUserName
26+
password = publishExtension.repoPassword
27+
}
28+
if (project.version.toString().contains("SNAPSHOT")) {
29+
setUrl("${publishExtension.snapshotRepo}")
30+
} else {
31+
setUrl("${publishExtension.releaseRepo}")
32+
}
33+
}
34+
})
35+
36+
fun MavenPublication.applyFrom(unionSdkInfo: UnionSdkInfo, sdkPath: String, setExclusions: Boolean) {
37+
38+
if (publishExtension.dontCopy.call(unionSdkInfo.baseStr())) {
39+
println("UnionPublishPlugin warinng, dontCopy matched:${unionSdkInfo.baseStr()}")
40+
return
41+
}
42+
this.groupId = unionSdkInfo.groupId
43+
this.artifactId = unionSdkInfo.artifactId
44+
this.version = unionSdkInfo.sdkVersion
45+
this.artifact(sdkPath).apply {
46+
if (project.hasProperty("android")) {
47+
this.builtBy(project.tasks.findByName("assembleRelease"))
48+
} else {
49+
this.builtBy(project.tasks.findByName("build"))
50+
}
51+
}
52+
if (unionSdkInfo.dependencies?.isEmpty() == false) {
53+
this.pom.withXml {
54+
var dependenciesNode: Node? = null
55+
this.asNode().getAt(QName("dependencies"))?.let {
56+
if (!it.isEmpty()) {
57+
dependenciesNode = this.asNode().getAt(QName("dependencies"))[0] as Node
58+
}
59+
}
60+
if (dependenciesNode != null) {
61+
this.asNode().remove(dependenciesNode)
62+
}
63+
dependenciesNode = asNode().appendNode("dependencies")
64+
unionSdkInfo.dependencies?.forEach {
65+
if (!publishExtension.dontCopy.call(it.baseStr())) {
66+
val dependencyNode = dependenciesNode?.appendNode("dependency")
67+
dependencyNode?.appendNode("groupId", it.groupId)
68+
dependencyNode?.appendNode("artifactId", it.artifactId)
69+
dependencyNode?.appendNode("version", it.sdkVersion)
70+
71+
if (setExclusions) {
72+
val exclusionsNode = dependencyNode?.appendNode("exclusions")
73+
it.exclusions?.forEach {
74+
val exclusionNode = exclusionsNode?.appendNode("exclusion")
75+
if (it.groupId != null) {
76+
exclusionNode?.appendNode("groupId", it.groupId)
77+
}
78+
if (it.artifactId != null) {
79+
exclusionNode?.appendNode("artifactId", it.artifactId)
80+
}
81+
}
82+
}
83+
}
84+
}
85+
}
86+
}
87+
}
88+
89+
this.publications {
90+
//先发布当前project的sdk
91+
this.create(currentUnionSdkInfo.artifactId, MavenPublication::class.java) {
92+
applyFrom(currentUnionSdkInfo, currentUnionSdkInfo.sdkPath.first(), true)
93+
}
94+
95+
//发布当前project所依赖的本公司sdk
96+
fun publishDependencies(unionSdkInfo: UnionSdkInfo) {
97+
unionSdkInfo.dependencies?.forEach {
98+
if (it.isLocal && !it.isProject) {
99+
println("set ${it.baseStr()} mavenPublication, sdkpath:${it.sdkPath}")
100+
if (it.sdkPath.isEmpty()) {
101+
it.sdkPath = SdkPathUtil.getSdkPath(
102+
project,
103+
SdkPathUtil.getExternalSdkPath(
104+
project,
105+
it.groupId,
106+
it.artifactId,
107+
it.sdkVersion
108+
)
109+
)
110+
}
111+
println("after fill, sdkpath:${it.sdkPath}")
112+
Collections.sort(it.sdkPath, kotlin.Comparator { t1, t2 ->
113+
fun getFilePathValue(path: String): Int {
114+
return when {
115+
path.endsWith(".so") -> 2
116+
path.endsWith(".aar") -> 1
117+
else -> 0
118+
}
119+
}
120+
121+
val value1 = getFilePathValue(t1)
122+
val value2 = getFilePathValue(t2)
123+
return@Comparator value2 - value1
124+
})
125+
for (i in it.sdkPath.indices) {
126+
val pubName = "${it.groupId}${it.artifactId}$i"
127+
if (!this.any { pub -> pub.name == pubName }) {
128+
this.create(
129+
"${it.groupId}${it.artifactId}$i",
130+
MavenPublication::class.java
131+
) {
132+
applyFrom(it, it.sdkPath[i], false)
133+
}
134+
}
135+
}
136+
publishDependencies(it)
137+
}
138+
}
139+
}
140+
141+
if (!publishExtension.onlyPublishProject) {
142+
publishDependencies(currentUnionSdkInfo)
143+
}
144+
}
145+
})
146+
}
147+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.yy.publish
2+
3+
import com.yy.publish.analyzer.DependencyAnalyzer
4+
import org.gradle.api.Plugin
5+
import org.gradle.api.Project
6+
import org.gradle.kotlin.dsl.get
7+
8+
/**
9+
* Created by wangfeihang on 2019-08-19.
10+
*/
11+
class UnionPublishPlugin : Plugin<Project> {
12+
13+
private var project: Project? = null
14+
private var publishExtension: UnionPublishRepoExtension? = null
15+
private var currentUnionSdkInfo: UnionSdkInfo? = null
16+
17+
18+
private fun defineTask(unionSdkInfo: UnionSdkInfo, project: Project) {
19+
val publishTaskName = "publish"
20+
21+
project.tasks.findByName(publishTaskName)?.let { publishTask ->
22+
unionSdkInfo.dependencies?.forEach {
23+
if (it.isProject) {
24+
publishTask.dependsOn("${it.projectPath}:$publishTaskName")
25+
}
26+
}
27+
}
28+
}
29+
30+
override fun apply(target: Project) {
31+
project = target
32+
project?.extensions?.create("publishPublicRepo", UnionPublishRepoExtension::class.java)
33+
project?.plugins?.apply("maven")
34+
project?.plugins?.apply("maven-publish")
35+
project?.plugins?.apply("signing")
36+
project?.afterEvaluate {
37+
38+
publishExtension = this.extensions["publishPublicRepo"] as UnionPublishRepoExtension
39+
40+
41+
println("UnionPublishPlugin publishExtension:$publishExtension")
42+
publishExtension?.let {
43+
currentUnionSdkInfo = DependencyAnalyzer(
44+
project = this,
45+
isLocal = it.local,
46+
groupId = it.groupId,
47+
sdkVersion = it.sdkVersion
48+
).analyze()
49+
}
50+
println(
51+
"UnionPublishPlugin,${project.name} analyze finish, " +
52+
"currentUnionSdkInfo:${currentUnionSdkInfo?.customStr("")}"
53+
)
54+
55+
56+
publishExtension?.let { extension ->
57+
currentUnionSdkInfo?.let { sdkinfo ->
58+
PublishExtensionUtil.createPublishingExtension(project, extension, sdkinfo)
59+
}
60+
}
61+
62+
currentUnionSdkInfo?.let {
63+
defineTask(it, project)
64+
}
65+
}
66+
}
67+
68+
69+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.yy.publish
2+
3+
import groovy.lang.Closure
4+
import org.gradle.kotlin.dsl.closureOf
5+
6+
/**
7+
* Created by wangfeihang on 2019-08-19.
8+
*/
9+
open class UnionPublishRepoExtension {
10+
var local: Closure<Boolean> = closureOf<Boolean> { false } as Closure<Boolean>
11+
var dontCopy: Closure<Boolean> = closureOf<Boolean> { false } as Closure<Boolean>
12+
var onlyPublishProject: Boolean = false
13+
var groupId: String = ""
14+
var sdkVersion: String = ""
15+
var snapshotRepo: String = ""
16+
var releaseRepo: String = ""
17+
var repoUserName: String = ""
18+
var repoPassword: String = ""
19+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.yy.publish
2+
3+
import com.yy.publish.analyzer.ExclusionNode
4+
5+
/**
6+
* Created by wangfeihang on 2019-08-19.
7+
*/
8+
data class UnionSdkInfo(
9+
val groupId: String,
10+
val artifactId: String,
11+
val sdkVersion: String,
12+
var isLocal: Boolean,
13+
var isProject: Boolean,
14+
var sdkPath: List<String>,
15+
val dependencies: List<UnionSdkInfo>?,
16+
val exclusions: List<ExclusionNode>?
17+
) {
18+
19+
var projectPath = ""
20+
21+
//打印UnionSdkInfo的完整信息,包括全部依赖树
22+
fun customStr(prefixStr: String): String {
23+
var result =
24+
"\n$prefixStr$groupId\n$prefixStr$artifactId\n$prefixStr$sdkVersion\n$prefixStr Local:$isLocal\n" +
25+
"$prefixStr isProject:$isProject\n$prefixStr$sdkPath\n$prefixStr exclusions:$exclusions\n$prefixStr dependencies:${dependencies == null}\n"
26+
dependencies?.forEach {
27+
result += it.customStr(prefixStr + " ")
28+
}
29+
println("name:$artifactId,dependencies size:${dependencies?.size}, prefixStr:$prefixStr, ${prefixStr + " "};")
30+
return result
31+
}
32+
33+
//打印UnionSdkInfo的基本信息
34+
fun baseStr(): String {
35+
return "$groupId:$artifactId:$sdkVersion"
36+
}
37+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.yy.publish.analyzer
2+
3+
import org.gradle.api.artifacts.Dependency
4+
5+
/**
6+
* Created by wangfeihang on 2019-08-21.
7+
*/
8+
abstract class DefaultFakeDependency : Dependency {
9+
override fun contentEquals(p0: Dependency): Boolean {
10+
return false
11+
}
12+
13+
override fun copy(): Dependency {
14+
return this
15+
}
16+
17+
override fun getGroup(): String? {
18+
return null
19+
}
20+
21+
override fun getName(): String {
22+
return ""
23+
}
24+
25+
override fun getVersion(): String? {
26+
return null
27+
}
28+
29+
override fun toString(): String {
30+
return "$group:$name:$version"
31+
}
32+
}

0 commit comments

Comments
 (0)