在多个模块中,在完成任何编译之前,仍然首先执行Android项目注释处理,然后触发完整的编译。当然,在进入app模块之前,每个模块都要这样做。
假设某些子模块依赖于其他模块,编译将失败,因为依赖者还不能,还不能找到它所依赖的模块中生成的类的定义,因为它们还没有生成。
我想知道是否有一种方法可以使用gradle或其他方式强制执行所有子模块、注释处理,然后以自动方式编译整个项目。这意味着,如果我有3个模块,让我们将它们命名为app、services和executors,其中services依赖于executors。
我正在寻找的是,构建树将按照以下顺序排列:
到目前为止,我发现了一些使用java compiler's选项-proc:{none;only}的有希望的线索,在这里,值only应该调用注释处理而无需进行任何进一步的编译。我已经尝试将这个option传递给我的编译器,但是仍然是编译,每个子模块依次执行子模块。
有什么想法吗?
发布于 2020-06-08 07:31:58
经过对这个主题的深入调查,长时间的阅读,以及很多的T恤和咖啡杯,我了解到我的项目设置不太正确,我也发现Kotlin android插件有它自己的悲哀和阴暗的事实,我希望我能在这个答案中澄清,所以拿一杯T恤/咖啡,享受阅读吧。
gradle it self有一个无循环依赖图,这意味着不应该有循环依赖项,因此每个gradle调用只能运行一次任务。Source set (将通过添加一个新的buildType为安卓),要么简单地打破鸡/蛋困境的奇迹,使用工件。我对每一种可能的解决方案都做了大量的实验,但还是有一些东西让人觉得有点可疑。首先,这里是我向gradle用户询问我的问题的一个线程。尽管它并没有解决我的问题,但它仍然揭示了问题本身的根源,即“The鸡/蛋困境”()。
为了进一步澄清我的问题,我进行了调查,并询问了kotlin开发人员如何使用kotlin插件。请找出答案这里
短篇小说:--没有办法直接扩展kotlinCompile级任务--,因为有一个启动编译的“代码”。我的意思是,当然,但为什么它是如此糟糕的设计?为什么像kotlin这样漂亮的语言必须赶着生产那个被认为功能强大的插件,而最主要的原因是为什么它的源代码从那时起就没有被更新/评论过?
解决这个问题的方法是使用它们的句柄KotlinCompilation入口点。我个人不喜欢这个解决方案,因为它限制了灵活性的水平,而且还进一步抽象了编译任务。
使用gradle的另一种很有希望的方法是artifacts,其中一个模块自己构建它并生成一个工件(在我们的例子中通常是一个jar ),它将被其他项目使用。听起来很酷对吧?不幸的是,没有办法将这个库添加到consumers的类路径中,编译就会失败。
这些都是我的发现,如果我错误地理解了什么,请随时更新我的知识或者纠正我。
编码愉快!
https://stackoverflow.com/questions/62059261
复制相似问题