我有一个发布的gradle插件,看起来像这样:
|__root
| |
| |
| |__java
| | |__SomeJavaClass.java
| | |__SomeJavaClass2.java
| |
| |__kotlin
| |__MyPluginClass.kts
| |__MyTaskClass.kts
| |__Utils.kts
我想把这个插件作为一个项目包含在我的多项目构建中,而不是将它发布到一个更容易开发的repo。
这个插件有3 Kotlin文件项目A正在使用。MyPluginClass。kts有我自己的插件类MyTaskClass。kts有我自己的任务类和Utils。KTS只包含kotlin函数。java类用于MyPlugin和MyTask。
它被放在项目A的build.gradle.kts类路径中
classpath("com.my:custom.plugin:version")
我想实现的一个非常简化的项目结构:
root
|
|__Project A
| |
| |__build.gradle.kts
| |__x.gradle.kts
| |__y.gradle.kts
| |__settings.gradle
|
|__Project build-logic
| |
| |__build.gradle.kts
| |
| |__java
| | |__SomeJavaClass.java
| | |__SomeJavaClass2.java
| |
| |__kotlin
| |__MyPluginClass.gradle.kts
| |__MyTaskClass.gradle.kts
| |__Utils.gradle.kts
我试图从那些kotlin文件创建插件,并将它们包含在我的主要构建中,因为我需要它们预编译,但我似乎找不到一种方法把它们放在项目a的类路径时构建。它正在运行。这可能吗?合适的解决方案是什么?
我使用gradle 7.3
你可以使用复合构建组合多个独立的Gradle项目。对于Gradle插件也是如此。
包含另一个目录的Gradle插件,请参见测试Gradle插件一节。
如果你有一个shared-build-logic
项目,提供了一个ID为my.shared-build-logic
的Gradle插件,并且你想在project-a
中使用它。
my-projects/
├── shared-build-logic/
│ ├── src/
│ │ └── ...
│ ├── build.gradle.kts
│ └── settings.gradle.kts
└── project-a/
├── src/
│ └── ...
├── build.gradle.kts
└── settings.gradle.kts
那么你需要在你的project-a
Gradle设置文件中包含shared-build-logic
。
// my-projects/project-a/settings.gradle.kts
rootProject.name = "project-a"
pluginManagement {
includeBuild("../shared-build-logic")
}
现在,只要shared-build-logic
正确地提供了Gradle插件,你就可以在project-a
中引用这个插件。
// my-projects/project-a/settings.gradle.kts
plugins {
id("my.shared-build-logic")
}
终于想通了。我没有从构建逻辑中创建插件,而是将它们作为kotlin文件。因为它是一个单独的gradle项目,所以我可以构建项目并将项目a的类路径指向生成的jar文件,如
buildscript {
dependencies {
classpath(files("path.to.the.jar"))
}
}
这样我可以从项目a中访问方法和MyTask。
另一个问题是,我想应用MyPlugin像
plugins{
id("my-plugin-name")
}
不起作用,我猜是因为它是一个类。但现在,因为我有整个项目jar在我的构建类路径,我可以这样做:
apply<my-plugin-name>()