簡體   English   中英

如何將自定義 Gradle 插件放在另一個項目構建類路徑上?

[英]How to put custom Gradle plugins on an another projects build classpath?

我有一個已發布的 gradle 插件,看起來像這樣:

|__root
|     |
|     |
|     |__java
|     |    |__SomeJavaClass.java
|     |    |__SomeJavaClass2.java
|     |
|     |__kotlin
|          |__MyPluginClass.kts
|          |__MyTaskClass.kts
|          |__Utils.kts   

我想將此插件作為一個項目包含在我的多項目構建中,而不是將其發布到存儲庫以便於開發。

這個插件有 3 個項目 A 正在使用的 Kotlin 文件。 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 文件創建插件並將它們包含在我的主構建中,因為我需要對它們進行預編譯,但是當 build.gradle 在那里運行時,我似乎無法找到將它們放在項目 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中包含shared-build-logic ——一個 Gradle 設置文件。

// 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>()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM