mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
chore: osx dist
This commit is contained in:
@@ -7,8 +7,11 @@ import org.jetbrains.kotlin.org.apache.commons.io.FileUtils
|
|||||||
import org.jetbrains.kotlin.org.apache.commons.io.filefilter.FileFilterUtils
|
import org.jetbrains.kotlin.org.apache.commons.io.filefilter.FileFilterUtils
|
||||||
import org.jetbrains.kotlin.org.apache.commons.lang3.StringUtils
|
import org.jetbrains.kotlin.org.apache.commons.lang3.StringUtils
|
||||||
import org.jetbrains.kotlin.org.apache.commons.lang3.time.DateFormatUtils
|
import org.jetbrains.kotlin.org.apache.commons.lang3.time.DateFormatUtils
|
||||||
|
import java.io.FileNotFoundException
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.Executors
|
||||||
|
import java.util.concurrent.Future
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
java
|
java
|
||||||
@@ -35,7 +38,6 @@ val isBeta = project.version.toString().contains("beta", ignoreCase = true)
|
|||||||
val macOSSignUsername = System.getenv("TERMORA_MAC_SIGN_USER_NAME") ?: StringUtils.EMPTY
|
val macOSSignUsername = System.getenv("TERMORA_MAC_SIGN_USER_NAME") ?: StringUtils.EMPTY
|
||||||
val macOSSign = os.isMacOsX && macOSSignUsername.isNotBlank()
|
val macOSSign = os.isMacOsX && macOSSignUsername.isNotBlank()
|
||||||
&& System.getenv("TERMORA_MAC_SIGN").toBoolean()
|
&& System.getenv("TERMORA_MAC_SIGN").toBoolean()
|
||||||
val macOSInstallSignUsername = System.getenv("TERMORA_MAC_INSTALL_SIGN_USER_NAME") ?: StringUtils.EMPTY
|
|
||||||
|
|
||||||
// macOS 公证信息
|
// macOS 公证信息
|
||||||
val macOSNotaryKeychainProfile = System.getenv("TERMORA_MAC_NOTARY_KEYCHAIN_PROFILE") ?: StringUtils.EMPTY
|
val macOSNotaryKeychainProfile = System.getenv("TERMORA_MAC_NOTARY_KEYCHAIN_PROFILE") ?: StringUtils.EMPTY
|
||||||
@@ -430,7 +432,7 @@ tasks.register<Exec>("jpackage") {
|
|||||||
|
|
||||||
arguments.add("--type")
|
arguments.add("--type")
|
||||||
if (os.isMacOsX) {
|
if (os.isMacOsX) {
|
||||||
arguments.add("app-image")
|
arguments.add("dmg")
|
||||||
} else if (os.isWindows) {
|
} else if (os.isWindows) {
|
||||||
arguments.add("app-image")
|
arguments.add("app-image")
|
||||||
} else if (os.isLinux) {
|
} else if (os.isLinux) {
|
||||||
@@ -573,30 +575,65 @@ fun packOnWindows(distributionDir: Directory, finalFilenameWithoutExtension: Str
|
|||||||
*/
|
*/
|
||||||
fun packOnMac(distributionDir: Directory, finalFilenameWithoutExtension: String, projectName: String) {
|
fun packOnMac(distributionDir: Directory, finalFilenameWithoutExtension: String, projectName: String) {
|
||||||
val dmgFile = distributionDir.file("${finalFilenameWithoutExtension}.dmg").asFile
|
val dmgFile = distributionDir.file("${finalFilenameWithoutExtension}.dmg").asFile
|
||||||
val appFile = distributionDir.file("${projectName}.app").asFile
|
val zipFile = distributionDir.file("${finalFilenameWithoutExtension}.zip").asFile
|
||||||
|
|
||||||
|
// rename
|
||||||
|
// @formatter:off
|
||||||
|
exec { commandLine("mv", distributionDir.file("${projectName}-${appVersion}.dmg").asFile.absolutePath, dmgFile.absolutePath,) }
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
|
// sign dmg
|
||||||
|
signMacOSLocalFile(dmgFile)
|
||||||
|
|
||||||
|
// 找到 .app
|
||||||
|
val imageFile = layout.buildDirectory.dir("jpackage/images/").get().asFile
|
||||||
|
val appFile = imageFile.listFiles()?.firstOrNull()?.listFiles()?.firstOrNull()
|
||||||
|
?: throw FileNotFoundException("${projectName}.app")
|
||||||
|
|
||||||
|
// zip
|
||||||
|
// @formatter:off
|
||||||
|
exec { commandLine("ditto", "-c", "-k", "--sequesterRsrc", "--keepParent", appFile.absolutePath, zipFile.absolutePath) }
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
|
// sign zip
|
||||||
|
signMacOSLocalFile(zipFile)
|
||||||
|
|
||||||
|
// 公证
|
||||||
|
if (macOSNotary) {
|
||||||
|
val pool = Executors.newCachedThreadPool()
|
||||||
|
val jobs = mutableListOf<Future<*>>()
|
||||||
|
|
||||||
|
// zip
|
||||||
|
pool.submit {
|
||||||
|
// 对 zip 公证
|
||||||
|
notaryMacOSLocalFile(zipFile)
|
||||||
|
// 对 .app 盖章
|
||||||
|
stapleMacOSLocalFile(appFile)
|
||||||
|
// 删除旧的 zip ,旧的 zip 仅仅是为了公证
|
||||||
|
FileUtils.deleteQuietly(zipFile)
|
||||||
|
// 再对盖完章的 app 打成 zip 包
|
||||||
|
// @formatter:off
|
||||||
|
exec { commandLine("ditto", "-c", "-k", "--sequesterRsrc", "--keepParent", appFile.absolutePath, zipFile.absolutePath) }
|
||||||
|
// @formatter:on
|
||||||
|
// 再对 zip 签名
|
||||||
|
signMacOSLocalFile(zipFile)
|
||||||
|
}.apply { jobs.add(this) }
|
||||||
|
|
||||||
// dmg
|
// dmg
|
||||||
exec {
|
pool.submit {
|
||||||
commandLine(
|
|
||||||
"create-dmg",
|
|
||||||
"--volname", "$projectName Installer",
|
|
||||||
"--window-pos", "300", "100",
|
|
||||||
"--window-size", "500", "300",
|
|
||||||
"--icon-size", "80",
|
|
||||||
"--icon", appFile.name, "130", "110",
|
|
||||||
"--hide-extension", appFile.name,
|
|
||||||
"--app-drop-link", "370", "110",
|
|
||||||
dmgFile.absolutePath, appFile.absolutePath,
|
|
||||||
)
|
|
||||||
workingDir = distributionDir.asFile
|
|
||||||
}
|
|
||||||
|
|
||||||
// 签名
|
|
||||||
signMacOSLocalFile(dmgFile)
|
|
||||||
// 公证
|
// 公证
|
||||||
notaryMacOSLocalFile(dmgFile)
|
notaryMacOSLocalFile(dmgFile)
|
||||||
// 盖章
|
// 盖章
|
||||||
stapleMacOSLocalFile(dmgFile)
|
stapleMacOSLocalFile(dmgFile)
|
||||||
|
}.apply { jobs.add(this) }
|
||||||
|
|
||||||
|
// join ...
|
||||||
|
jobs.forEach { it.get() }
|
||||||
|
|
||||||
|
// shutdown
|
||||||
|
pool.shutdown()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user