【问题标题】:Apply local jar-plugin without using maven在不使用 maven 的情况下应用本地 jar-plugin
【发布时间】:2021-04-16 07:20:06
【问题描述】:

我想从本地 jar 加载我的自定义插件。 jar 文件编译良好,当我检查它时,清单和插件类都在那里。

gradlePlugin {
    plugins {
        create("asdf") { // <-- I really call it "asdf" in the kts script
            id = "asdf"
            implementationClass = "pluginTest.TestPlugin"
            version = "1.4.0"
        }
    }
}

该插件还没有做任何有用的事情,因为它应该是一个概念验证,以确保它确实有效:

class TestPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        println("Hallo TestPlugin!")
    }
}

然后我尝试在另一个项目中像这样使用它:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath(files("..\\..\\path\\to\\pluginTest.jar"))
    }
}

plugins {
    id("asdf") version "1.4.0"
}

但它一直告诉我:

在以下任何来源中都找不到插件 [id: 'asdf', version: '1.4.0']:

我在这里缺少什么?我使用 Gradle v6.5。

【问题讨论】:

  • 可能是存储库部分需要flatDir“存储库”?我不习惯处理本地文件,但我猜它可能类似于stackoverflow.com/questions/20700053/…
  • 另一个选项可能是带有版本化插件的plugins {} 块不适用于这样的普通文件。相反,也许您可​​以只使用apply&lt;TestPlugin&gt;() 而不是整个plugins 块?他们在本教程的开头是这样做的:docs.gradle.org/current/userguide/…
  • @Joffrey 我尝试了这两个建议。不幸的是,Gradle 没有购买它们。我想我毕竟必须设置一个本地 maven :-( 嗯,这太令人沮丧了。
  • @Joffrey 你可能想看看我的回答;-] 可以使用 jar 文件。

标签: kotlin gradle gradle-kotlin-dsl kotlin-gradle-plugin


【解决方案1】:

当类路径中有插件 jar 时,插件应用程序中不能有版本号。我想这是因为您首先不能在类路径上拥有多个具有不同版本的 jar,因此在此处指定版本没有任何意义(除非可能验证您使用的是正确的版本)。这不会解决问题,但这是一个开始。

说实话,我不知道为什么你的方法仍然行不通。 buildscript 块应该为该特定脚本设置依赖项,并且应该使插件对其可见。由于某种原因,它不会。

也许这是一个错误,或者这只是对插件 {} 块的使用的无证限制。也许您可以通过Gradle forums 询问或为它创建一个issue。但是,有些解决方法不涉及发布到(本地)Maven 存储库,我同意这可能有点烦人。

如果你使用“apply from”而不是“plugins {}”,它可以工作。由于某种原因,前者可以看到 buildscript 类路径,而后者不能:

// build.gradle (Groovy DSL)
buildscript {
    dependencies {
        classpath(files("..\\..\\path\\to\\pluginTest.jar"))
    }
}

apply from: "asdf"

或者,将 buildscript 插件从 build.gradle 文件移动到 settings.gradle 文件。这使得整个构建类路径都可用,并将使其与插件块一起使用:

// settings.gradle (Groovy DSL):
buildscript {
    dependencies {
        classpath(files("..\\..\\path\\to\\pluginTest.jar"))
    }
}

// build.gradle (Groovy DSL)
plugins {
    id("asdf")
}

最后,如果您还没有考虑过,您可以将插件添加为composite build。这将为插件创建一个源依赖项,并且具有传递依赖项将被传递(您放入插件自己的依赖项块中的那些)的优点,并且如果不是最新的,它将自动构建。我使用这种方法来集成测试我的插件,有时还会将它们应用到我的其他实际项目中,以便在发布新版本之前在更大的环境中测试它们。

使用以下任一方法:

// settings.gradle (Groovy DSL):
includeBuild("..\\..\\path\\to\\plugin")

// build.gradle (Groovy DSL):
plugins {
    id("asdf")
}

或者在构建中不对其进行硬编码(因此您可以在本地版本和发布版本之间动态切换):

// build.gradle (Groovy DSL):
plugins {
    id("asdf") version "1.4.0" // Version is optional (will be ignored when the command line switch below)
}

// Run with:
./gradlew --include-build "..\\..\\path\\to\\plugin" build

【讨论】:

  • 内容丰富,感谢您展示这么多想法!我终于让它与apply(plugin="asdf")(Kotlin DSL)一起工作。默认情况下,from 不起作用。我移动了buildscript,但没有成功,所以我把它放回build.gradle.kts,并开始尝试apply。然后我跳到源头,发现它有多个参数,我试了一下,砰! :)
  • 我很好奇这两种方法之间的区别,这个答案很好地解释了这一点:What the difference in applying gradle plugin Gradle 还没有将功能移动到新的 api 中。
  • 难以置信,看我的回答,我找到了方法:-)
【解决方案2】:

有了@BjørnVester's 的回答,我想通了!

您需要将buildscript 放在settings.gradle.kts 中,因为即使放在plugins 之前,它也不会在build.gradle.kts 中执行。

buildscript {
    repositories {
        flatDir {
            dirs("..\\reusable-kotlin\\build\\libs") // <-- folder with jars
        }
    }
    dependencies {        
        classpath("com.hedev.kotlin:reusable-kotlin:1.4.0")
    }
}

但是有一个问题!您必须在 classpath 的名称标识符中使用 jar 的文件名,如下所示:

组:文件名:版本

gradle 将查找的文件将是 file-name-version.jarfile-name.jar,如果您犯了错误,您将在错误消息中看到(我故意添加了 _ 以触发错误):

无法解析配置“类路径”的所有工件。
找不到 com.hedev.kotlin:reusable-kotlin_:1.4.0。在以下位置搜索:
- 文件:/C:/some/path/reusable-kotlin/build/libs/reusable-kotlin_-1.4.0.jar
- 文件:/C:/some/path/reusable-kotlin/build/libs/reusable-kotlin_.jar

为了使其工作,我还必须将 group 属性添加到插件本身:

gradlePlugin {
    plugins {
        create("asdf") {
            id = "asdf"
            implementationClass = "com.hedev.kotlin.gradle.TestPlugin"
            version = "1.4.0"
            group = "com.hedev.kotlin"
        }
    }
}

最后你可以在build.gradle.kts应用它(这里没有版本):

plugins {
    id("asdf")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 2016-05-13
    • 2015-06-01
    • 2013-10-08
    • 2019-04-11
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多