【问题标题】:using gradle plugin from flatDir source使用来自 flatDir 源的 gradle 插件
【发布时间】:2019-07-21 22:46:21
【问题描述】:

How to amend Gradle plugins {} management repository for custom plugins? 在这篇文章中没有重复,因为它不包括 flatDir 的使用。


问题

如何使用在本地 JAR 中定义的 Gradle 插件,使用新的 plugin {} 语义,而不是已弃用的 apply() 语义?

当前状态

没有任何解决方案,在发布问题并进行了相当长的搜索后,我提交了 issue,想知道在 Gradle 的修订版中,这种本应常见且直接的用法是否不受设计或疏忽的支持插件语义。

很遗憾,我的报告已关闭,没有提供任何有用的信息。

我通过 new issue 要求澄清,但仍在等待。

我很沮丧,因为我期望社区至少会对讨论这个问题感兴趣。

如果您可以提供信息,请提供。

第一次更新

在澄清关于配置插件源的新样式之后,我更新了我的settings.gradle 文件以使用以下块打开。但是,我很遗憾,仅凭这一变化,我并没有看到任何改善。 (对于build.gradle 文件中引用的插件 id 字段,我尝试了 JAR 元数据中发布的全局 ID 和 JAR 文件的基本名称。两者都同样失败。)

pluginManagement {
    repositories {
        gradlePluginPortal()
        jcenter()
        flatDir {
            dirs 'lib`'
        }
    }
}

文档解释了如何使用自定义存储库,但似乎忽略了普通平面目录的情况。

第二次更新

如果我将版本号添加到 JAR 文件和 plugins {} 块中的相应语句中,我会得到一些改进。在这种情况下,消息变为:

Plugin [id: 'plugin-id', version: '1.0.0'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'plugin-id:plugin-id.gradle.plugin:1.0.0')
  Searched in the following repositories:
    Gradle Central Plugin Repository
    BintrayJCenter
    flatDir(/absolute/path/to/lib)

在这种情况下,目录被添加到搜索的源列表中。

奇怪的是,.gradle.plugin 后缀被附加到打印工件中的我的 ID 上。将版本号添加到正在搜索的内容会影响正在搜索的地点列表,这也很奇怪。

所以我的项目仍然无法构建。感谢您提供任何进一步的帮助。

原始背景

我在项目的lib 目录中放置了一个包含自定义插件定义的JAR 文件。使用下面的build.gradle 构建文件,构建运行成功。

buildscript {
  repositories {
      flatDir {
          dirs 'lib'
      }
  }
}

apply plugin: 'plugin-id'

但是,apply() 语义已被弃用,支持 plugins {} 块,因此我尝试如下更新构建文件。

plugins {
    id 'plugin-id'
}

repositories {
    flatDir {
        dirs 'lib'
    }
}

我了解plugins {} 内容可以从repositories {} 定义中提取。

但是,更改会导致失败:

* What went wrong:
Plugin [id: 'plugin-id'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)

保留plugin {} 块但将repositories {} 块移回前导buildscript {} 块并不能解决错误。也就是说,即使我恢复到早期版本,错误仍然存​​在,只是将 apply() 语句替换为 plugin {} 块。

最后,将dependencies { classpath: ':jarname' } 块添加到repositories {} 块没有任何效果,一些消息来源认为这是必要的,尽管我不知道为什么会这样。

【问题讨论】:

  • 除非我添加 buildscript { dependencies { classpath '...' }}} 部分,否则您已弃用的语法解决方案对我不起作用。仅指定存储库以解析插件是不够的,您还需要指定提供它的 jar 文件。将 flatDir 存储库与 maven 中心进行比较:除非您明确指定要在哪个 jar 中查找,否则 gradle 不会下载每个 jar。
  • @Alex 请澄清“解决方案不起作用”。该案例测试插件的发现。如果发现插件,则案例有效。顺便说一句,我认为类路径是在构建和运行的后期阶段相关的正交问题。
  • 无法解决插件中的问题:> Plugin with id 'plugin-id' not found.。我不确定你指的是什么测试用例。 Wrt 类路径,它适用于编译和运行时:您的代码引用的类需要在编译代码时和稍后运行时再次解析。
  • 了解编译需要类路径,但编译是生成字节码,而直接的问题是插件解析。注释和取消注释 classpath 块是导致 pluign not found 错误出现或消失的唯一区别吗?
  • > 注释和取消注释类路径块是导致未找到插件错误出现或消失的唯一区别吗?:是的。我不明白您为什么要谈论插件解析,就好像它与类文件解析有什么不同:插件是分布在 jar 文件中的类(在 META-INF 中有附加描述符)。

标签: java gradle plugins repository local


【解决方案1】:

这行得通。使用 gradle 6.3 测试。

build.gradle

plugins {
    id 'plugin-id'
}

settings.gradle

pluginManagement {
    buildscript {
        repositories {
            flatDir {
                dirs '/plugin-folder/build/libs'
            }
        }
        dependencies {
            classpath ':plugin-jar:0.0.1'
        }
    }
}

更新:我今天刚刚发现可以在不使用上面的 dependencies 块的情况下解析您的插件 jar。在这种情况下,您应该将您的插件 jar 命名为 [plugin-id].gradle.plugin[-version].jar。请注意,[-version] 部分是可选的,plugin-id.gradle.plugin.jar 也可以使用。

注意:不鼓励使用平面目录存储库,而应使用本地 maven 存储库文件夹。尤其是在您想在本地覆盖远程仓库中存在的工件时。见https://docs.gradle.org/current/userguide/declaring_repositories.html#sub:flat_dir_resolver。考虑到 gradle 本身不支持在 maven repo 文件夹中安装本地工件,似乎不可能完全放弃 maven 以支持 gradle。

【讨论】:

  • 由于响应中报告的版本号比问题中的版本号更新,因此澄清版本对解决方案的重要性会很有用。
  • 是否有任何问题阻止您将此回复标记为答案?这里也报道了同样的方法:stackoverflow.com/a/61842621/410939
  • 大多数情况下,我们仍然没有清楚地表明是什么让您的解决方案成功。是工具版本、构建布局还是其他?
  • 很公平,我已经用 cmets 解释了解决方案,而不是在这个答案中,我不会重复自己。欢呼
  • 例如“这行得通。使用 gradle 6.3 进行测试。”:基于如此随意的一连串言论,很难清楚地了解问题的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多