Skip to content

Commit 80e55bb

Browse files
committed
✨ 添加windows平台资源打包和自动处理
1 parent ff949dc commit 80e55bb

11 files changed

Lines changed: 133 additions & 63 deletions

File tree

rust_library/biometrics/build.gradle.kts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,13 @@ uniffi {
9191
}
9292
}
9393

94-
var outputDirectoryPath = ""
95-
tasks.withType<BuildBindingsTask> {
96-
doLast {
97-
outputDirectoryPath = outputDirectory.get().asFile.path
98-
}
99-
}
10094
tasks.named("compileKotlinDesktop") {
10195
doFirst {
10296
projectDir.resolve("src").deleteRecursively()
10397
}
10498
doLast {
10599
copyDirectoryToTarget(
106-
outputDirectoryPath,
100+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
107101
layout.projectDirectory.dir("src").asFile.path
108102
) { source, target ->
109103
if (source.path.contains("commonMain") || source.path.contains("jvmMain")) {

rust_library/build.gradle.kts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,51 @@ tasks.register("cleanup-all") {
3939
}
4040

4141
dependsOn("cleanup-root-target")
42-
}
42+
}
43+
44+
if (Platform.isWindows) {
45+
tasks.register("win-rust-resources-zip") {
46+
subprojects.forEach { subproject ->
47+
val projectWinResourcesDir =
48+
subproject.projectDir.resolve("src").resolve("desktopMain").resolve("resources")
49+
if (projectWinResourcesDir.exists()) {
50+
ArchAndRustTargetMapping.winRustTargetToArchMapping.values.forEach { arch ->
51+
val winArchResources = projectWinResourcesDir.resolve(arch)
52+
if (winArchResources.exists()) {
53+
winArchResources.copyRecursively(
54+
rootDir.resolve(".kotlin").resolve(arch).resolve(subproject.name).resolve(arch), true
55+
)
56+
}
57+
}
58+
}
59+
}
60+
61+
doLast {
62+
ArchAndRustTargetMapping.winRustTargetToArchMapping.values.forEach { arch ->
63+
val sourceDir = rootDir.resolve(".kotlin").resolve(arch)
64+
if (sourceDir.exists()) {
65+
createZipFile(sourceDir.path, rootDir.resolve(".kotlin").resolve("$arch.zip").path)
66+
}
67+
}
68+
}
69+
}
70+
}
71+
72+
tasks.register("win-rust-resources-unzip") {
73+
ArchAndRustTargetMapping.winRustTargetToArchMapping.values.forEach { arch ->
74+
val zipFile = rootDir.resolve(".kotlin").resolve("$arch.zip")
75+
if (zipFile.exists()) {
76+
val targetDir = rootDir.resolve(".kotlin").resolve(arch)
77+
unzipFile(zipFile.path, targetDir.path)
78+
79+
for (file in targetDir.listFiles() ?: emptyArray()) {
80+
if (file.isDirectory) {
81+
file.copyRecursively(
82+
rootDir.resolve(file.name).resolve("src").resolve("desktopMain").resolve("resources")
83+
.resolve(arch), true
84+
)
85+
}
86+
}
87+
}
88+
}
89+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
object Platform {
22
val osName = System.getProperty("os.name")
3+
val osArch = System.getProperty("os.arch")
34

45
val isMac = osName.startsWith("Mac")
56
val isWindows = osName.startsWith("Windows")
67
val isLinux = osName.startsWith("Linux")
8+
9+
val isX86 = setOf("x86", "i386", "amd64", "x86_64").contains(osArch)
10+
val isArm = listOf("aarch64", "arm").contains(osArch)
711
}

rust_library/buildSrc/src/main/kotlin/Utils.kt

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
import java.io.File
2+
import java.io.FileInputStream
3+
import java.io.FileOutputStream
4+
import java.util.zip.ZipEntry
5+
import java.util.zip.ZipInputStream
6+
import java.util.zip.ZipOutputStream
27

38
object ArchAndRustTargetMapping {
49
val iosRustTargetToArchMapping = mutableMapOf(
@@ -74,4 +79,72 @@ fun copyDirectoryToTarget(
7479
copyFileToTarget(file.path, targetPath, hardLinkOrCopyFile)
7580
}
7681
}
82+
}
83+
84+
fun createZipFile(sourceDirPath: String, outputZipFilePath: String) {
85+
val sourceDir = File(sourceDirPath)
86+
87+
if (!sourceDir.exists()) {
88+
println("win平台rust静态链接库不存在")
89+
return
90+
}
91+
92+
FileOutputStream(outputZipFilePath).use { fos ->
93+
ZipOutputStream(fos).use { zos ->
94+
addFilesToZip(sourceDir, sourceDir, zos)
95+
}
96+
}
97+
}
98+
99+
private fun addFilesToZip(rootDir: File, currentDir: File, zos: ZipOutputStream) {
100+
for (file in currentDir.listFiles() ?: emptyArray()) {
101+
if (file.isDirectory) {
102+
// 如果是目录,递归处理
103+
addFilesToZip(rootDir, file, zos)
104+
} else {
105+
// 如果是文件,添加到 ZIP
106+
FileInputStream(file).use { fis ->
107+
val entryPath = rootDir.toPath().relativize(file.toPath()).toString()
108+
zos.putNextEntry(ZipEntry(entryPath))
109+
fis.copyTo(zos)
110+
zos.closeEntry()
111+
}
112+
}
113+
}
114+
}
115+
116+
fun unzipFile(zipFilePath: String, outputDirPath: String) {
117+
val zipFile = File(zipFilePath)
118+
if (!zipFile.exists() || !zipFile.isFile) {
119+
println("ZIP file does not exist or is not a file: $zipFilePath")
120+
return
121+
}
122+
123+
val outputDir = File(outputDirPath)
124+
if (!outputDir.exists()) {
125+
outputDir.mkdirs() // 如果目标目录不存在,则创建
126+
}
127+
128+
// 打开 ZIP 文件并逐条解压
129+
ZipInputStream(FileInputStream(zipFile)).use { zis ->
130+
var entry: ZipEntry?
131+
while (zis.nextEntry.also { entry = it } != null) {
132+
val entryName = entry!!.name
133+
val outputFile = File(outputDir, entryName)
134+
135+
if (entry!!.isDirectory) {
136+
// 如果是目录,创建目录
137+
outputFile.mkdirs()
138+
} else {
139+
// 如果是文件,创建父目录并写入文件内容
140+
outputFile.parentFile.mkdirs()
141+
FileOutputStream(outputFile).use { fos ->
142+
zis.copyTo(fos)
143+
}
144+
}
145+
146+
// 关闭当前条目
147+
zis.closeEntry()
148+
}
149+
}
77150
}

rust_library/hardware_info/build.gradle.kts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,13 @@ uniffi {
8282
}
8383
}
8484

85-
var outputDirectoryPath = ""
86-
tasks.withType<BuildBindingsTask> {
87-
doLast {
88-
outputDirectoryPath = outputDirectory.get().asFile.path
89-
}
90-
}
9185
tasks.named("compileKotlinDesktop") {
9286
doFirst {
9387
projectDir.resolve("src").deleteRecursively()
9488
}
9589
doLast {
9690
copyDirectoryToTarget(
97-
outputDirectoryPath,
91+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
9892
layout.projectDirectory.dir("src").asFile.path
9993
) { source, target ->
10094
if (source.path.contains("commonMain") || source.path.contains("jvmMain")) {

rust_library/keychainstore/build.gradle.kts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,13 @@ uniffi {
109109
// formatCode = true
110110
}
111111

112-
var outputDirectoryPath = ""
113-
tasks.withType<BuildBindingsTask> {
114-
doLast {
115-
outputDirectoryPath = outputDirectory.get().asFile.path
116-
}
117-
}
118-
119112
tasks.named("compileKotlinDesktop") {
120113
doFirst {
121114
projectDir.resolve("src").deleteRecursively()
122115
}
123116
doLast {
124117
copyDirectoryToTarget(
125-
outputDirectoryPath,
118+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
126119
layout.projectDirectory.dir("src").asFile.path
127120
) { source, target ->
128121
if (!source.path.contains("androidMain")) {

rust_library/mix_compression/build.gradle.kts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,20 +130,13 @@ uniffi {
130130
// formatCode = true
131131
}
132132

133-
var outputDirectoryPath = ""
134-
tasks.withType<BuildBindingsTask> {
135-
doLast {
136-
outputDirectoryPath = outputDirectory.get().asFile.path
137-
}
138-
}
139-
140133
tasks.named("compileKotlinDesktop") {
141134
doFirst {
142135
projectDir.resolve("src").deleteRecursively()
143136
}
144137
doLast {
145138
copyDirectoryToTarget(
146-
outputDirectoryPath,
139+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
147140
layout.projectDirectory.dir("src").asFile.path
148141
) { source, target ->
149142
source.copyTo(target, true)

rust_library/multipart/build.gradle.kts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,20 +129,13 @@ uniffi {
129129
// formatCode = true
130130
}
131131

132-
var outputDirectoryPath = ""
133-
tasks.withType<BuildBindingsTask> {
134-
doLast {
135-
outputDirectoryPath = outputDirectory.get().asFile.path
136-
}
137-
}
138-
139132
tasks.named("compileKotlinDesktop") {
140133
doFirst {
141134
projectDir.resolve("src").deleteRecursively()
142135
}
143136
doLast {
144137
copyDirectoryToTarget(
145-
outputDirectoryPath,
138+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
146139
layout.projectDirectory.dir("src").asFile.path
147140
) { source, target ->
148141
source.copyTo(target, true)

rust_library/resvg_render/build.gradle.kts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,20 +130,13 @@ uniffi {
130130
// formatCode = true
131131
}
132132

133-
var outputDirectoryPath = ""
134-
tasks.withType<BuildBindingsTask> {
135-
doLast {
136-
outputDirectoryPath = outputDirectory.get().asFile.path
137-
}
138-
}
139-
140133
tasks.named("compileKotlinDesktop") {
141134
doFirst {
142135
projectDir.resolve("src").deleteRecursively()
143136
}
144137
doLast {
145138
copyDirectoryToTarget(
146-
outputDirectoryPath,
139+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
147140
layout.projectDirectory.dir("src").asFile.path
148141
) { source, target ->
149142
source.copyTo(target, true)

rust_library/reverse_proxy/build.gradle.kts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,10 @@ uniffi {
108108
// formatCode = true
109109
}
110110

111-
var outputDirectoryPath = ""
112-
tasks.withType<BuildBindingsTask> {
113-
doLast {
114-
outputDirectoryPath = outputDirectory.get().asFile.path
115-
}
116-
}
117-
118111
tasks.named("prepareKotlinIdeaImport") {
119112
doLast {
120113
copyDirectoryToTarget(
121-
outputDirectoryPath,
114+
layout.projectDirectory.dir("build").dir("generated").dir("uniffi").asFile.path,
122115
layout.projectDirectory.dir("src").asFile.path
123116
) { source, target ->
124117
if (!source.path.contains("jvmMain")) {

0 commit comments

Comments
 (0)