Gradle插件如何访问关于已包含构建的信息?

3

我知道你可以通过 org.gradle.api.Project#getSubprojects() 访问项目中使用include包含的不同模块,也知道你可以通过 org.gradle.api.invocation.Gradle#getIncludedBuilds() 获取已经包含的单独构建的名称和目录(使用 includeBuild)。

但是,我的插件如何获取使用 includeBuild 包含的项目的Java源文件和class文件的位置信息呢?

我的目标是确定当前git分支中已更改的文件(这一点我可以做到),然后将它们对应的class文件收集到一个jar文件中,该jar文件用于我们的修补机制。这个机制会将修补程序jar文件插入到classpath的前面,而不是重新部署整个应用程序。


你能否提供更多关于你具体想要实现的细节吗?我几乎无法想象为什么Gradle插件应该担心包含的构建。它可能会担心依赖项,也许是它们来自包含的构建还是其他地方。但是这些依赖项是如何创建的/被创建的对于包含的构建来说并不重要;否则,相应的项目可能应该首先负责自己生产它们。也许我漏掉了什么;-) - Chriki
@Chriki 更新了。这是一个奇怪的遗留情况,我希望最终能够摆脱它,但现在还不行。 - Brad Mace
这个对你有帮助吗 - https://dev59.com/Y7Tma4cB1Zd3GeqP85U8#56663716 - djmonki
@djmonki 使用输入和输出似乎是处理这个问题的正确方式,但我还不太理解如何着手处理它。 - Brad Mace
@Brad Mace,感谢您的更新。很抱歉,我仍然不太明白您最终想要实现什么具体目标。无论如何,我已经尝试回答了您的问题,即Gradle插件(或一般构建)如何从包含的构建中访问信息。 - Chriki
1个回答

3
我认为Gradle的目标并不是提供包含构建的详细信息。当前,Gradle文档基本上只阐述了这样复合构建的两个目标:
- 将通常独立开发的构建组合在一起,[...] - 将大型多项目构建分解为更小、更隔离的块[...]
实际上,所涉及的构建之间的隔离似乎是一个重要的主题: > 包含的构建不会与组合构建或其他包含的构建共享任何配置。每个包含的构建都是在隔离中配置和执行的。
因此,让包含构建消耗包含构建的任何构建配置(如任务输出)似乎也不可能,甚至不可取。那只会使构建耦合,从而破坏隔离目标。

包含的构建仅通过依赖替换与其他构建交互:

如果组合中的任何构建具有可以由包含的构建满足的依赖关系,则该依赖关系将被替换为对包含的构建的项目依赖关系。

因此,如果您想从包含的构建中使用特定部分来自包括的构建,则需要执行多个操作:

  • 在包含的构建中有一个配置文件,该配置文件将这些“特定部分”作为工件生成。
  • 在包括的构建中有一个配置文件,该配置文件将工件作为依赖项消耗。
  • 确保两个配置文件在其功能方面兼容,以使依赖项替换起作用。
  • 让包括的构建中的某些任务以您需要的任何方式使用依赖工件。

当您在两个Gradle项目之间有简单的依赖关系时,比如一个Java应用程序依赖于一个Java库,这些事情会自动发生。但是您也可以定义自己的依赖关系。

问题是:这真的值得付出这样的努力吗?难道您不能更轻松地解决您的目标,或者至少不依赖于编程检索到的关于已包含的构建的信息吗?例如:如果您知道您包含的构建在build/classes/java/main下生成类文件,则可以通过org.gradle.api.initialization.IncludedBuild#getProjectDir()从中获取感兴趣的类。

我知道,这可能不是您希望得到的答案。我仍然希望它有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接