mirror of
https://github.com/HighCapable/SweetDependency.git
synced 2025-09-06 18:55:50 +08:00
Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
2b81ae41b2
|
|||
c44dc6f4c3
|
|||
a56d2ed895
|
|||
301283a1d0
|
|||
710a597454
|
|||
e9a71f29ef
|
|||
a6770e3e03
|
|||
6fedc9ef50
|
|||
ff0ae7f0ab
|
|||
a2ca412ec9
|
|||
7e419b758f
|
|||
9b014cdb77
|
|||
de339a49f6
|
@@ -1,8 +1,8 @@
|
|||||||
# Sweet Dependency
|
# Sweet Dependency
|
||||||
|
|
||||||
[](https://github.com/HighCapable/SweetDependency/blob/master/LICENSE)
|
[](https://github.com/HighCapable/SweetDependency/blob/master/LICENSE)
|
||||||

|
[](https://github.com/HighCapable/SweetDependency/releases)
|
||||||
[](https://t.me/HighCapable_Dev)
|
[](https://t.me/HighCapable_Dev)
|
||||||
|
|
||||||
<img src="https://github.com/HighCapable/SweetDependency/blob/master/img-src/icon.png?raw=true" width = "100" height = "100" alt="LOGO"/>
|
<img src="https://github.com/HighCapable/SweetDependency/blob/master/img-src/icon.png?raw=true" width = "100" height = "100" alt="LOGO"/>
|
||||||
|
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
# Sweet Dependency
|
# Sweet Dependency
|
||||||
|
|
||||||
[](https://github.com/HighCapable/SweetDependency/blob/master/LICENSE)
|
[](https://github.com/HighCapable/SweetDependency/blob/master/LICENSE)
|
||||||

|
[](https://github.com/HighCapable/SweetDependency/releases)
|
||||||
[](https://t.me/HighCapable_Dev)
|
[](https://t.me/HighCapable_Dev)
|
||||||
|
|
||||||
<img src="https://github.com/HighCapable/SweetDependency/blob/master/img-src/icon.png?raw=true" width = "100" height = "100" alt="LOGO"/>
|
<img src="https://github.com/HighCapable/SweetDependency/blob/master/img-src/icon.png?raw=true" width = "100" height = "100" alt="LOGO"/>
|
||||||
|
|
||||||
|
@@ -2,4 +2,11 @@
|
|||||||
|
|
||||||
## 1.0.0 | 2023.09.03
|
## 1.0.0 | 2023.09.03
|
||||||
|
|
||||||
- 首个版本提交至 Maven
|
- 首个版本提交至 Maven
|
||||||
|
|
||||||
|
## 1.0.1 | 2023.09.07
|
||||||
|
|
||||||
|
- 使用 `net.lingala.zip4j` 取代 JDK 默认创建压缩文档功能修复在 Windows 平台中 Gradle 8.0.2+ 版本创建的 JAR 损坏导致找不到生成的 Class 问题
|
||||||
|
- 重构自动生成代码部分的装载功能,增加可能找不到 Class 的错误提示
|
||||||
|
- 新增在设置了未定义版本的插件依赖条件下直接运行自动装配相关 Gradle Task 将抛出异常
|
||||||
|
- 修复可能的旧版本 Gradle 在使用 `repositories` 的 `content` 功能会抛出异常
|
@@ -2,4 +2,13 @@
|
|||||||
|
|
||||||
## 1.0.0 | 2023.09.03
|
## 1.0.0 | 2023.09.03
|
||||||
|
|
||||||
- The first version is submitted to Maven
|
- The first version is submitted to Maven
|
||||||
|
|
||||||
|
## 1.0.1 | 2023.09.07
|
||||||
|
|
||||||
|
- Use `net.lingala.zip4j` to replace JDK's default function of creating compressed files and fix the problem that the JAR created by Gradle 8.0.2+
|
||||||
|
version on Windows platform is broken and the generated classes cannot be found
|
||||||
|
- Refactor the loading function of the automatically generated code part, and add an error message that classes may not be found
|
||||||
|
- Added an exception will be thrown when running the autowire related Gradle task directly
|
||||||
|
under the condition of setting an undefined version of plugins
|
||||||
|
- Fix possible old version of Gradle throwing exception when using `content` function of `repositories`
|
@@ -80,6 +80,12 @@ plugins {
|
|||||||
|
|
||||||
上述配置完成后,运行一次 Gradle Sync。
|
上述配置完成后,运行一次 Gradle Sync。
|
||||||
|
|
||||||
|
**可能遇到的问题**
|
||||||
|
|
||||||
|
如果在运行 Gradle Sync 后失败并报错 `Cannot have abstract method KotlinTarget. withSourcesJar()`,这可能是你当前项目的 Kotlin 插件版本的问题。
|
||||||
|
|
||||||
|
此问题为 Kotlin 插件从 `1.8.0+` → `1.9.0+` 升级导致的错误,解决方案为将 Kotlin 插件的版本修改为 `1.9.0+`。
|
||||||
|
|
||||||
**特别注意**
|
**特别注意**
|
||||||
|
|
||||||
`SweetDependency` 会替换 `pluginManagement` 和 `dependencyResolutionManagement` 中设置的存储库,如果你手动在这些方法块中配置了存储库,它们都将会无效。
|
`SweetDependency` 会替换 `pluginManagement` 和 `dependencyResolutionManagement` 中设置的存储库,如果你手动在这些方法块中配置了存储库,它们都将会无效。
|
||||||
|
@@ -81,6 +81,15 @@ Please replace `<version>` in the above code with the latest version in
|
|||||||
|
|
||||||
After the above configuration is complete, run Gradle Sync once.
|
After the above configuration is complete, run Gradle Sync once.
|
||||||
|
|
||||||
|
**Possible Problems**
|
||||||
|
|
||||||
|
If running Gradle Sync fails with the error `Cannot have abstract method KotlinTarget. withSourcesJar()`,
|
||||||
|
this may be a problem with the Kotlin plugin version of your current project.
|
||||||
|
|
||||||
|
This problem is an error caused by upgrading the Kotlin plugin from `1.8.0+` → `1.9.0+`.
|
||||||
|
|
||||||
|
The solution is to modify the version of the Kotlin plugin to `1.9.0+`.
|
||||||
|
|
||||||
**Pay Attention**
|
**Pay Attention**
|
||||||
|
|
||||||
`SweetDependency` will replace the repositories set in `pluginManagement` and `dependencyResolutionManagement`,
|
`SweetDependency` will replace the repositories set in `pluginManagement` and `dependencyResolutionManagement`,
|
||||||
|
@@ -5,12 +5,12 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.highcapable.sweetdependency.demo_app"
|
namespace = "com.highcapable.sweetdependency.demo_app"
|
||||||
compileSdk = 33
|
compileSdk = 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.highcapable.sweetdependency.demo_app"
|
applicationId = "com.highcapable.sweetdependency.demo_app"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 33
|
targetSdk = 34
|
||||||
versionCode = 1
|
versionCode = 1
|
||||||
versionName = "1.0"
|
versionName = "1.0"
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
@@ -5,11 +5,10 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.highcapable.sweetdependency.demo_library"
|
namespace = "com.highcapable.sweetdependency.demo_library"
|
||||||
compileSdk = 33
|
compileSdk = 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 33
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
consumerProguardFiles("consumer-rules.pro")
|
consumerProguardFiles("consumer-rules.pro")
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
@@ -8,7 +8,7 @@ pluginManagement {
|
|||||||
plugins {
|
plugins {
|
||||||
// Import the SweetDependency plugin here
|
// Import the SweetDependency plugin here
|
||||||
// 在这里引入 SweetDependency 插件
|
// 在这里引入 SweetDependency 插件
|
||||||
id("com.highcapable.sweetdependency") version "1.0.0"
|
id("com.highcapable.sweetdependency") version "1.0.1"
|
||||||
}
|
}
|
||||||
sweetDependency {
|
sweetDependency {
|
||||||
configFileName = "sweet-dependency-config.yaml"
|
configFileName = "sweet-dependency-config.yaml"
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
@@ -8,7 +8,7 @@ pluginManagement {
|
|||||||
plugins {
|
plugins {
|
||||||
// Import the SweetDependency plugin here
|
// Import the SweetDependency plugin here
|
||||||
// 在这里引入 SweetDependency 插件
|
// 在这里引入 SweetDependency 插件
|
||||||
id("com.highcapable.sweetdependency") version "1.0.0"
|
id("com.highcapable.sweetdependency") version "1.0.1"
|
||||||
}
|
}
|
||||||
sweetDependency {
|
sweetDependency {
|
||||||
configFileName = "sweet-dependency-config.yaml"
|
configFileName = "sweet-dependency-config.yaml"
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
# Project Configuration
|
# Project Configuration
|
||||||
project.name=SweetDependency
|
project.name=SweetDependency
|
||||||
project.description=An easy autowire and manage dependencies Gradle plugin
|
project.description=An easy autowire and manage dependencies Gradle plugin
|
||||||
project.url=https://github.com/fankes/HighCapable/SweetDependency
|
project.url=https://github.com/HighCapable/SweetDependency
|
||||||
project.groupName=com.highcapable.sweetdependency
|
project.groupName=com.highcapable.sweetdependency
|
||||||
project.moduleName=sweet-dependency
|
project.moduleName=sweet-dependency
|
||||||
project.version=1.0.0
|
project.version=1.0.1
|
||||||
project.licence.name=Apache License 2.0
|
project.licence.name=Apache License 2.0
|
||||||
project.licence.url=https://github.com/fankes/HighCapable/SweetDependency/blob/master/LICENSE
|
project.licence.url=https://github.com/HighCapable/SweetDependency/blob/master/LICENSE
|
||||||
project.developer.id=0
|
project.developer.id=0
|
||||||
project.developer.name=fankes
|
project.developer.name=fankes
|
||||||
project.developer.email=qzmmcn@163.com
|
project.developer.email=qzmmcn@163.com
|
||||||
|
@@ -35,4 +35,7 @@ libraries:
|
|||||||
version: 4.11.0
|
version: 4.11.0
|
||||||
com.squareup:
|
com.squareup:
|
||||||
javapoet:
|
javapoet:
|
||||||
version: 1.13.0
|
version: 1.13.0
|
||||||
|
net.lingala.zip4j:
|
||||||
|
zip4j:
|
||||||
|
version: 2.11.5
|
@@ -8,8 +8,8 @@ pluginManagement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
plugins {
|
plugins {
|
||||||
id("com.highcapable.sweetdependency") version "1.0.0"
|
id("com.highcapable.sweetdependency") version "1.0.1"
|
||||||
id("com.highcapable.sweetproperty") version "1.0.0"
|
id("com.highcapable.sweetproperty") version "1.0.2"
|
||||||
}
|
}
|
||||||
sweetDependency {
|
sweetDependency {
|
||||||
isEnableVerboseMode = false
|
isEnableVerboseMode = false
|
||||||
|
@@ -27,6 +27,7 @@ dependencies {
|
|||||||
implementation(com.charleskorn.kaml.kaml)
|
implementation(com.charleskorn.kaml.kaml)
|
||||||
implementation(com.squareup.okhttp3.okhttp)
|
implementation(com.squareup.okhttp3.okhttp)
|
||||||
implementation(com.squareup.javapoet)
|
implementation(com.squareup.javapoet)
|
||||||
|
implementation(net.lingala.zip4j.zip4j)
|
||||||
}
|
}
|
||||||
|
|
||||||
gradlePlugin {
|
gradlePlugin {
|
||||||
|
@@ -78,6 +78,24 @@ internal class DependencyVersion(internal var actual: String, optionalType: Opti
|
|||||||
else -> current
|
else -> current
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取固定存在的版本
|
||||||
|
*
|
||||||
|
* 满足以下情况
|
||||||
|
*
|
||||||
|
* - [isBlank]
|
||||||
|
* - [isNoSpecific]
|
||||||
|
*
|
||||||
|
* 这些情况都会返回 [AUTOWIRE_VERSION_NAME]
|
||||||
|
*
|
||||||
|
* 其余情况会返回 [current]
|
||||||
|
* @return [String]
|
||||||
|
*/
|
||||||
|
internal val fixed get() = when {
|
||||||
|
isBlank || isNoSpecific -> AUTOWIRE_VERSION_NAME
|
||||||
|
else -> current
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取部署版本
|
* 获取部署版本
|
||||||
*
|
*
|
||||||
|
@@ -85,9 +85,9 @@ internal fun Project.addDependencyToBuildScript(repositoryPath: String, pomData:
|
|||||||
/**
|
/**
|
||||||
* 装载构建脚本的 [Class]
|
* 装载构建脚本的 [Class]
|
||||||
* @param name [Class] 完整名称
|
* @param name [Class] 完整名称
|
||||||
* @return [Class]
|
* @return [Class] or null
|
||||||
*/
|
*/
|
||||||
internal fun Project.loadBuildScriptClass(name: String) = buildscript.classLoader.loadClass(name)
|
internal fun Project.loadBuildScriptClass(name: String) = runCatching { buildscript.classLoader.loadClass(name) }.getOrNull()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取指定项目部署的插件依赖数组 (实时)
|
* 获取指定项目部署的插件依赖数组 (实时)
|
||||||
|
@@ -24,6 +24,7 @@ package com.highcapable.sweetdependency.manager
|
|||||||
import com.highcapable.sweetdependency.document.PreferencesDocument
|
import com.highcapable.sweetdependency.document.PreferencesDocument
|
||||||
import com.highcapable.sweetdependency.document.RepositoryDocument
|
import com.highcapable.sweetdependency.document.RepositoryDocument
|
||||||
import com.highcapable.sweetdependency.exception.SweetDependencyUnresolvedException
|
import com.highcapable.sweetdependency.exception.SweetDependencyUnresolvedException
|
||||||
|
import com.highcapable.sweetdependency.gradle.helper.GradleHelper
|
||||||
import com.highcapable.sweetdependency.manager.const.AdditionalRepositories
|
import com.highcapable.sweetdependency.manager.const.AdditionalRepositories
|
||||||
import com.highcapable.sweetdependency.manager.content.Repositories
|
import com.highcapable.sweetdependency.manager.content.Repositories
|
||||||
import com.highcapable.sweetdependency.plugin.config.content.SweetDependencyConfigs
|
import com.highcapable.sweetdependency.plugin.config.content.SweetDependencyConfigs
|
||||||
@@ -100,9 +101,17 @@ internal object RepositoryManager {
|
|||||||
fun List<String>.forEachParams(size: Int, result: (List<String>) -> Unit) = forEach {
|
fun List<String>.forEachParams(size: Int, result: (List<String>) -> Unit) = forEach {
|
||||||
result(it.split(":").also { e -> if (e.size != size) SError.make("Missing argument in content configuration") })
|
result(it.split(":").also { e -> if (e.size != size) SError.make("Missing argument in content configuration") })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对旧版本不兼容的方法打印警告信息
|
||||||
|
* @param name 方法名称
|
||||||
|
*/
|
||||||
|
fun warnIfNotSupport(name: String) = SLog.warn("Current Gradle ${GradleHelper.version} not support \"$name\"")
|
||||||
document.content.exclude.also {
|
document.content.exclude.also {
|
||||||
it.group().noEmpty()?.forEach { e -> excludeGroup(e) }
|
it.group().noEmpty()?.forEach { e -> excludeGroup(e) }
|
||||||
it.groupAndSubgroups().noEmpty()?.forEach { e -> excludeGroupAndSubgroups(e) }
|
runCatching {
|
||||||
|
it.groupAndSubgroups().noEmpty()?.forEach { e -> excludeGroupAndSubgroups(e) }
|
||||||
|
}.onFailure { warnIfNotSupport(name = "excludeGroupAndSubgroups") }
|
||||||
it.groupByRegex().noEmpty()?.forEach { e -> excludeGroupByRegex(e) }
|
it.groupByRegex().noEmpty()?.forEach { e -> excludeGroupByRegex(e) }
|
||||||
it.module().noEmpty()?.forEachParams(size = 2) { e -> excludeModule(e[0], e[1]) }
|
it.module().noEmpty()?.forEachParams(size = 2) { e -> excludeModule(e[0], e[1]) }
|
||||||
it.moduleByRegex().noEmpty()?.forEachParams(size = 2) { e -> excludeModuleByRegex(e[0], e[1]) }
|
it.moduleByRegex().noEmpty()?.forEachParams(size = 2) { e -> excludeModuleByRegex(e[0], e[1]) }
|
||||||
@@ -111,7 +120,9 @@ internal object RepositoryManager {
|
|||||||
}
|
}
|
||||||
document.content.include.also {
|
document.content.include.also {
|
||||||
it.group().noEmpty()?.forEach { e -> includeGroup(e) }
|
it.group().noEmpty()?.forEach { e -> includeGroup(e) }
|
||||||
it.groupAndSubgroups().noEmpty()?.forEach { e -> includeGroupAndSubgroups(e) }
|
runCatching {
|
||||||
|
it.groupAndSubgroups().noEmpty()?.forEach { e -> includeGroupAndSubgroups(e) }
|
||||||
|
}.onFailure { warnIfNotSupport(name = "includeGroupAndSubgroups") }
|
||||||
it.groupByRegex().noEmpty()?.forEach { e -> includeGroupByRegex(e) }
|
it.groupByRegex().noEmpty()?.forEach { e -> includeGroupByRegex(e) }
|
||||||
it.module().noEmpty()?.forEachParams(size = 2) { e -> includeModule(e[0], e[1]) }
|
it.module().noEmpty()?.forEachParams(size = 2) { e -> includeModule(e[0], e[1]) }
|
||||||
it.moduleByRegex().noEmpty()?.forEachParams(size = 2) { e -> includeModuleByRegex(e[0], e[1]) }
|
it.moduleByRegex().noEmpty()?.forEachParams(size = 2) { e -> includeModuleByRegex(e[0], e[1]) }
|
||||||
|
@@ -26,6 +26,7 @@ import com.highcapable.sweetdependency.environment.Environment
|
|||||||
import com.highcapable.sweetdependency.generated.SweetDependencyProperties
|
import com.highcapable.sweetdependency.generated.SweetDependencyProperties
|
||||||
import com.highcapable.sweetdependency.gradle.delegate.ProjectTransaction
|
import com.highcapable.sweetdependency.gradle.delegate.ProjectTransaction
|
||||||
import com.highcapable.sweetdependency.gradle.delegate.entity.ExternalDependencyDelegate
|
import com.highcapable.sweetdependency.gradle.delegate.entity.ExternalDependencyDelegate
|
||||||
|
import com.highcapable.sweetdependency.gradle.entity.DependencyVersion
|
||||||
import com.highcapable.sweetdependency.gradle.factory.addDependencyToBuildScript
|
import com.highcapable.sweetdependency.gradle.factory.addDependencyToBuildScript
|
||||||
import com.highcapable.sweetdependency.gradle.factory.applyPlugin
|
import com.highcapable.sweetdependency.gradle.factory.applyPlugin
|
||||||
import com.highcapable.sweetdependency.gradle.factory.getOrCreate
|
import com.highcapable.sweetdependency.gradle.factory.getOrCreate
|
||||||
@@ -79,6 +80,25 @@ internal object DependencyDeployHelper {
|
|||||||
runCatching {
|
runCatching {
|
||||||
settings.dependencyResolutionManagement.versionCatalogs.create(pluginsNamespace) {
|
settings.dependencyResolutionManagement.versionCatalogs.create(pluginsNamespace) {
|
||||||
Dependencies.plugins().forEach { (dependencyName, artifact) ->
|
Dependencies.plugins().forEach { (dependencyName, artifact) ->
|
||||||
|
if (GradleTaskManager.isInternalRunningTask && artifact.version().isAutowire) SError.make(
|
||||||
|
"""
|
||||||
|
It looks like now you directly execute ${SweetDependency.TAG}'s autowiring related Gradle task
|
||||||
|
Since this plugin "$dependencyName" that set "${DependencyVersion.AUTOWIRE_VERSION_NAME}" as the version,
|
||||||
|
you now need to ensure that the version exists during the initialization phase
|
||||||
|
The version catalogs rules require that a plugin version must be declared
|
||||||
|
You can try the following solutions to resolve this problem:
|
||||||
|
1. Manually re-run Gradle Sync
|
||||||
|
Make sure "autowire-on-sync-mode" is one of:
|
||||||
|
- UPDATE_OPTIONAL_DEPENDENCIES
|
||||||
|
- UPDATE_OPTIONAL_PLUGINS
|
||||||
|
- UPDATE_ALL_DEPENDENCIES
|
||||||
|
- UPDATE_ALL_PLUGINS
|
||||||
|
- ONLY_AUTOWIRE_DEPENDENCIES
|
||||||
|
- ONLY_AUTOWIRE_PLUGINS
|
||||||
|
2. Fill an existing version for plugin "$dependencyName" and re-run Gradle Sync
|
||||||
|
If you get this error again after doing the above, maybe the currently set repositories cannot find this plugin
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
if (artifact.version().isNoSpecific) return@forEach SLog.warn(
|
if (artifact.version().isNoSpecific) return@forEach SLog.warn(
|
||||||
"""
|
"""
|
||||||
You must specific a version for plugin "$dependencyName" or use Gradle's internal plugin function instead it
|
You must specific a version for plugin "$dependencyName" or use Gradle's internal plugin function instead it
|
||||||
@@ -98,13 +118,13 @@ internal object DependencyDeployHelper {
|
|||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
val deployedName = dependencyName.ambiguousName(symbol = "-", isReplaceFirstChar = true, isLowerCase = false)
|
val deployedName = dependencyName.ambiguousName(symbol = "-", isReplaceFirstChar = true, isLowerCase = false)
|
||||||
plugin(deployedName, dependencyName.current).version(artifact.version().deployed)
|
plugin(deployedName, dependencyName.current).version(artifact.version().fixed)
|
||||||
artifact.versions().forEach { (name, version) ->
|
artifact.versions().forEach { (name, version) ->
|
||||||
plugin("$deployedName-${name.camelcase()}", dependencyName.current).version(version.deployed)
|
plugin("$deployedName-${name.camelcase()}", dependencyName.current).version(version.fixed)
|
||||||
if (artifact.alias.isNotBlank())
|
if (artifact.alias.isNotBlank())
|
||||||
plugin("${artifact.alias}-${name.camelcase()}", dependencyName.current).version(version.deployed)
|
plugin("${artifact.alias}-${name.camelcase()}", dependencyName.current).version(version.fixed)
|
||||||
}
|
}
|
||||||
if (artifact.alias.isNotBlank()) plugin(artifact.alias, dependencyName.current).version(artifact.version().deployed)
|
if (artifact.alias.isNotBlank()) plugin(artifact.alias, dependencyName.current).version(artifact.version().fixed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
@@ -120,7 +140,7 @@ internal object DependencyDeployHelper {
|
|||||||
* @param rootProject 当前根项目
|
* @param rootProject 当前根项目
|
||||||
*/
|
*/
|
||||||
internal fun resolveAccessors(rootProject: Project) {
|
internal fun resolveAccessors(rootProject: Project) {
|
||||||
if (Dependencies.isOutdate || accessorsDir.isEmpty())
|
if (Dependencies.isOutdate || accessorsDir.resolve(accessorsPomData.relativePomPath).isEmpty())
|
||||||
accessorsGenerator.build().compile(accessorsPomData, accessorsDir.absolutePath, accessorsGenerator.compileStubFiles)
|
accessorsGenerator.build().compile(accessorsPomData, accessorsDir.absolutePath, accessorsGenerator.compileStubFiles)
|
||||||
rootProject.addDependencyToBuildScript(accessorsDir.absolutePath, accessorsPomData)
|
rootProject.addDependencyToBuildScript(accessorsDir.absolutePath, accessorsPomData)
|
||||||
}
|
}
|
||||||
@@ -132,7 +152,14 @@ internal object DependencyDeployHelper {
|
|||||||
*/
|
*/
|
||||||
internal fun deployAccessors(project: Project, extension: ExtensionAware) =
|
internal fun deployAccessors(project: Project, extension: ExtensionAware) =
|
||||||
accessorsGenerator.librariesClasses.forEach { (name, className) ->
|
accessorsGenerator.librariesClasses.forEach { (name, className) ->
|
||||||
extension.getOrCreate(name, project.loadBuildScriptClass(className))
|
val accessorsClass = project.loadBuildScriptClass(className) ?: SError.make(
|
||||||
|
"""
|
||||||
|
Generated class "$className" not found, stop loading $project
|
||||||
|
Please check whether the initialization process is interrupted and re-run Gradle Sync
|
||||||
|
If this doesn't work, please manually delete the entire "${accessorsDir.absolutePath}" directory
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
extension.getOrCreate(name, accessorsClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -21,15 +21,13 @@
|
|||||||
*/
|
*/
|
||||||
package com.highcapable.sweetdependency.utils.code
|
package com.highcapable.sweetdependency.utils.code
|
||||||
|
|
||||||
import com.highcapable.sweetdependency.plugin.SweetDependencyExtension
|
|
||||||
import com.highcapable.sweetdependency.utils.code.entity.MavenPomData
|
import com.highcapable.sweetdependency.utils.code.entity.MavenPomData
|
||||||
import com.highcapable.sweetdependency.utils.debug.SError
|
import com.highcapable.sweetdependency.utils.debug.SError
|
||||||
import com.highcapable.sweetdependency.utils.deleteEmptyRecursively
|
import com.highcapable.sweetdependency.utils.deleteEmptyRecursively
|
||||||
import com.highcapable.sweetdependency.utils.parseFileSeparator
|
|
||||||
import com.highcapable.sweetdependency.utils.toFile
|
import com.highcapable.sweetdependency.utils.toFile
|
||||||
|
import net.lingala.zip4j.ZipFile
|
||||||
|
import net.lingala.zip4j.model.ZipParameters
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.jar.JarEntry
|
|
||||||
import java.util.jar.JarOutputStream
|
|
||||||
import javax.tools.DiagnosticCollector
|
import javax.tools.DiagnosticCollector
|
||||||
import javax.tools.JavaFileObject
|
import javax.tools.JavaFileObject
|
||||||
import javax.tools.StandardLocation
|
import javax.tools.StandardLocation
|
||||||
@@ -49,7 +47,7 @@ internal object CodeCompiler {
|
|||||||
* @param outputDirPath 编译输出目录路径
|
* @param outputDirPath 编译输出目录路径
|
||||||
* @param files [JavaFileObject] 数组
|
* @param files [JavaFileObject] 数组
|
||||||
* @param compileOnlyFiles [JavaFileObject] 仅编译数组 - 默认空
|
* @param compileOnlyFiles [JavaFileObject] 仅编译数组 - 默认空
|
||||||
* @throws SweetDependencyExtension 如果编译失败
|
* @throws IllegalStateException 如果编译失败
|
||||||
*/
|
*/
|
||||||
internal fun compile(
|
internal fun compile(
|
||||||
pomData: MavenPomData,
|
pomData: MavenPomData,
|
||||||
@@ -85,8 +83,8 @@ internal object CodeCompiler {
|
|||||||
sourceFile.writeText(it.getCharContent(true).toString())
|
sourceFile.writeText(it.getCharContent(true).toString())
|
||||||
}
|
}
|
||||||
}; outputClassesDir.deleteEmptyRecursively()
|
}; outputClassesDir.deleteEmptyRecursively()
|
||||||
writeMetaInf(outputClassesDir.absolutePath)
|
writeMetaInf(outputClassesDir)
|
||||||
writeMetaInf(outputSourcesDir.absolutePath)
|
writeMetaInf(outputSourcesDir)
|
||||||
createJarAndPom(pomData, outputDir, outputBuildDir, outputClassesDir, outputSourcesDir)
|
createJarAndPom(pomData, outputDir, outputBuildDir, outputClassesDir, outputSourcesDir)
|
||||||
} else SError.make("Failed to compile java files into path: $outputDirPath\n$diagnosticsMessage")
|
} else SError.make("Failed to compile java files into path: $outputDirPath\n$diagnosticsMessage")
|
||||||
}
|
}
|
||||||
@@ -100,30 +98,29 @@ internal object CodeCompiler {
|
|||||||
* @param sourcesDir 编译源码目录
|
* @param sourcesDir 编译源码目录
|
||||||
*/
|
*/
|
||||||
private fun createJarAndPom(pomData: MavenPomData, outputDir: File, buildDir: File, classesDir: File, sourcesDir: File) {
|
private fun createJarAndPom(pomData: MavenPomData, outputDir: File, buildDir: File, classesDir: File, sourcesDir: File) {
|
||||||
val pomPath = "${pomData.groupId.toPomPathName()}/${pomData.artifactId}/${pomData.version}"
|
val pomDir = outputDir.resolve(pomData.relativePomPath).also { if (it.exists().not()) it.mkdirs() }
|
||||||
val pomDir = "${outputDir.absolutePath}/$pomPath".toFile().also { if (it.exists().not()) it.mkdirs() }
|
|
||||||
packageToJar(classesDir, pomDir, pomData, isSourcesJar = false)
|
packageToJar(classesDir, pomDir, pomData, isSourcesJar = false)
|
||||||
packageToJar(sourcesDir, pomDir, pomData, isSourcesJar = true)
|
packageToJar(sourcesDir, pomDir, pomData, isSourcesJar = true)
|
||||||
writePom(pomDir.absolutePath, pomData)
|
writePom(pomDir, pomData)
|
||||||
buildDir.deleteRecursively()
|
buildDir.deleteRecursively()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入 META-INF/MANIFEST.MF
|
* 写入 META-INF/MANIFEST.MF
|
||||||
* @param dirPath 当前目录路径
|
* @param dir 当前目录
|
||||||
*/
|
*/
|
||||||
private fun writeMetaInf(dirPath: String) {
|
private fun writeMetaInf(dir: File) {
|
||||||
val metaInfFile = "$dirPath/META-INF".toFile().apply { mkdirs() }
|
val metaInfDir = dir.resolve("META-INF").apply { mkdirs() }
|
||||||
"${metaInfFile.absolutePath}/MANIFEST.MF".toFile().writeText("Manifest-Version: 1.0")
|
metaInfDir.resolve("MANIFEST.MF").writeText("Manifest-Version: 1.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入 POM
|
* 写入 POM
|
||||||
* @param dirPath 当前目录路径
|
* @param dir 当前目录
|
||||||
* @param pomData Maven POM 实体
|
* @param pomData Maven POM 实体
|
||||||
*/
|
*/
|
||||||
private fun writePom(dirPath: String, pomData: MavenPomData) =
|
private fun writePom(dir: File, pomData: MavenPomData) =
|
||||||
"$dirPath/${pomData.artifactId}-${pomData.version}.pom".toFile().writeText(
|
dir.resolve("${pomData.artifactId}-${pomData.version}.pom").writeText(
|
||||||
"""
|
"""
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project
|
<project
|
||||||
@@ -138,12 +135,6 @@ internal object CodeCompiler {
|
|||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* 转换到 [MavenPomData] 目录名称
|
|
||||||
* @return [String]
|
|
||||||
*/
|
|
||||||
private fun String.toPomPathName() = trim().replace(".", "/").replace("_", "/").replace(":", "/").replace("-", "/")
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 转换到文件
|
* 转换到文件
|
||||||
* @param outputDir 输出目录
|
* @param outputDir 输出目录
|
||||||
@@ -164,30 +155,12 @@ internal object CodeCompiler {
|
|||||||
* @param outputDir 输出目录
|
* @param outputDir 输出目录
|
||||||
* @param pomData Maven POM 实体
|
* @param pomData Maven POM 实体
|
||||||
* @param isSourcesJar 是否为源码 JAR
|
* @param isSourcesJar 是否为源码 JAR
|
||||||
* @throws SweetDependencyExtension 如果编译输出目录不存在
|
* @throws IllegalStateException 如果编译输出目录不存在
|
||||||
*/
|
*/
|
||||||
private fun packageToJar(buildDir: File, outputDir: File, pomData: MavenPomData, isSourcesJar: Boolean) {
|
private fun packageToJar(buildDir: File, outputDir: File, pomData: MavenPomData, isSourcesJar: Boolean) {
|
||||||
if (buildDir.exists().not()) SError.make("Jar file output path not found: ${buildDir.absolutePath}")
|
if (buildDir.exists().not()) SError.make("Jar file output path not found: ${buildDir.absolutePath}")
|
||||||
/**
|
val jarFile = outputDir.resolve("${pomData.artifactId}-${pomData.version}${if (isSourcesJar) "-sources" else ""}.jar")
|
||||||
* 添加文件到 JAR
|
|
||||||
* @param jos 当前输出流
|
|
||||||
* @param parentPath 父级路径
|
|
||||||
*/
|
|
||||||
fun File.addToJar(jos: JarOutputStream, parentPath: String = "") {
|
|
||||||
val currentPath = "$parentPath$name".replace("${buildDir.name}|", "").replace("|", "/").parseFileSeparator()
|
|
||||||
if (isFile) {
|
|
||||||
if (name.startsWith(".")) return
|
|
||||||
jos.putNextEntry(JarEntry(currentPath))
|
|
||||||
inputStream().use { fis ->
|
|
||||||
val buffer = ByteArray(4096)
|
|
||||||
var bytesRead: Int
|
|
||||||
while (fis.read(buffer).also { bytesRead = it } != -1) jos.write(buffer, 0, bytesRead)
|
|
||||||
}
|
|
||||||
jos.closeEntry()
|
|
||||||
} else listFiles()?.forEach { it.addToJar(jos, parentPath = "$currentPath|") }
|
|
||||||
}
|
|
||||||
val jarFile = "${outputDir.absolutePath}/${pomData.artifactId}-${pomData.version}${if (isSourcesJar) "-sources" else ""}.jar".toFile()
|
|
||||||
if (jarFile.exists()) jarFile.delete()
|
if (jarFile.exists()) jarFile.delete()
|
||||||
jarFile.outputStream().use { fos -> JarOutputStream(fos).use { jos -> buildDir.addToJar(jos) } }
|
ZipFile(jarFile).addFolder(buildDir, ZipParameters().apply { isIncludeRootFolder = false })
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -27,4 +27,17 @@ package com.highcapable.sweetdependency.utils.code.entity
|
|||||||
* @param artifactId Artifact Id
|
* @param artifactId Artifact Id
|
||||||
* @param version 版本
|
* @param version 版本
|
||||||
*/
|
*/
|
||||||
internal data class MavenPomData(internal val groupId: String, internal val artifactId: String, internal val version: String)
|
internal data class MavenPomData(internal val groupId: String, internal val artifactId: String, internal val version: String) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 [MavenPomData] 相对路径
|
||||||
|
* @return [String]
|
||||||
|
*/
|
||||||
|
internal val relativePomPath get() = "${groupId.toPomPathName()}/$artifactId/$version"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换到 [MavenPomData] 目录名称
|
||||||
|
* @return [String]
|
||||||
|
*/
|
||||||
|
private fun String.toPomPathName() = trim().replace(".", "/").replace("_", "/").replace(":", "/").replace("-", "/")
|
||||||
|
}
|
Reference in New Issue
Block a user