moh*_*ssa 6 java android annotation-processing
在多模块 Android 项目中,注释处理仍然作为第一个任务执行,然后再进行任何编译,然后触发完整的编译。当然,这是在进入模块之前按模块完成的app。
想象一下,其中一些子模块依赖于他人的情况下,编译将失败作为因无法还没有找到该模块中生成的类定义,这取决于仅仅是因为他们还没有产生。
我想知道是否有一种方法可以使用gradle或其他任何方法来强制首先执行所有子模块注释处理,然后以自动方式编译整个项目。这意味着,如果我有3个模块,让我们为它们命名app,services并executors在那里services依赖executors。
我所寻求的是构建树将按以下顺序进行:
到目前为止,我发现使用该java compiler's选项的一些有希望的线索,-proc:{none;only}其中值only应该调用注释处理而无需任何进一步的编译。我试过将它传递option给我的编译器,但编译仍然按子模块顺序进行。
有任何想法吗?
经过对这个主题的深入调查、长时间的阅读和许多茶杯和咖啡杯之后,我发现我的项目设置不太正确,而且我发现 Kotlin android 插件有它自己的悲伤和阴暗的事实,我希望我能在这个答案中澄清,所以喝杯茶/咖啡并享受阅读。
gradle它本身具有非循环依赖关系图,这意味着不应该有循环依赖关系,因此任务每次gradle调用只会运行一次。Source set(对于 android 将通过添加一个新的buildType)或者简单地打破先有鸡还是先有蛋的困境并使用工件。我对每一种可能的解决方案都进行了很多实验,但仍然有股腥味。首先,这是一个我向用户询问我的问题的线程gradle。尽管如此,它并没有解决我的问题,但它仍然揭示了问题本身的根源,即先有鸡还是先有蛋的困境。
为了进一步澄清我的问题,我继续进行调查,并向kotlin开发人员询问如何使用 kotlin gradle 插件来做到这一点。请在这里找到答案
简短的故事:没有办法直接扩展 kotlinCompile gradle 任务,因为有一个启动编译的“代码”。我的意思是当然,但为什么它的设计如此糟糕呢?为什么如此美丽的语言kotlin必须匆忙生产那个特定的所谓强大的插件,而且主要是为什么它的源代码从那时起就从未更新/审查过?
解决这个问题的方法是使用它们的句柄KotlinCompilation入口点。我个人不喜欢这个解决方案,因为它限制了灵活性,并且仍然进一步抽象了编译任务。
使用 gradle 的另一种有前途的方法是artifacts模块自行构建并生成一个工件(在我们的例子中通常是一个 jar),该工件将被其他项目使用。这听起来很酷吧?不幸的是,无法将此库添加到 的类路径中consumers,并且编译将失败。
这些是我的发现,如果我错误地理解某些内容,请随时更新我的知识或纠正我。
快乐编码!
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |