gradle 构建应用流程_使用Gradle构建和应用AST转换
gradle 構建應用流程
最近,我想在Gradle項目中構建并應用本地ast轉換。 雖然我可以找到幾個有關如何編寫轉換的示例,但找不到完整的示例來顯示完整的構建過程。 轉換必須單獨編譯然后放在類路徑中,因此其源代碼不能簡單地放在Groovy源代碼樹的其余部分中。 這是讓我絆倒了一段時間的細節。
最初,我設置了一個單獨的GroovyCompile任務來處理其余注釋,然后再處理其余注釋(摘自Gradle論壇上Peter Niederwieser的有用建議)。 在此可行的同時,要應用轉換的一個更簡單的解決方案是設置多項目構建。 主項目依賴于具有ast轉換源文件的子項目。 這是一個最小示例的目錄結構:
ast/build.gradle
ast構建文件
ast/src/main/groovy/com/cholick/ast/Marker.groovy 標記界面 ast/src/main/groovy/com/cholick/ast/Transform.groovy AST轉型 build.gradle 主構建文件 settings.gradle 項目層次結構配置 src/main/groovy/com/cholick/main/Main.groovy 轉化源
對于完整的工作源(具有簡單的測試,沒有*導入),請克隆https://github.com/cholick/gradle_ast_example
根build.gradle文件包含對ast項目的依賴項:
dependencies {...compile(project(':ast')) }根settings.gradle定義ast子項目:
include 'ast'基礎項目還具有src / main / groovy / com / cholick / main / Main.groovy,其中包含要轉換的源文件。 在此示例中,我編寫的ast轉換將名為“ added”的方法添加到類中。
package com.cholick.mainimport com.cholick.ast.Marker@Marker class Main {static void main(String[] args) {new Main().run()}def run() {println 'Running main'assert this.class.declaredMethods.find { it.name == 'added' }added()} }在ast子項目中,ast / src / main / groovy / com / cholick / ast / Marker.groovy定義一個接口來標記ast轉換的類:
package com.cholick.astimport org.codehaus.groovy.transform.GroovyASTTransformationClassimport java.lang.annotation.*@Retention(RetentionPolicy.SOURCE) @Target([ElementType.TYPE]) @GroovyASTTransformationClass(['com.cholick.ast.Transform']) public @interface Marker {}最后,ast轉換類處理源類并添加一個方法:
package com.cholick.astimport org.codehaus.groovy.ast.* import org.codehaus.groovy.ast.builder.AstBuilder import org.codehaus.groovy.control.* import org.codehaus.groovy.transform.*@GroovyASTTransformation(phase = CompilePhase.INSTRUCTION_SELECTION) class Transform implements ASTTransformation {void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {if (!astNodes) returnif (!astNodes[0]) returnif (!astNodes[1]) returnif (!(astNodes[0] instanceof AnnotationNode)) returnif (astNodes[0].classNode?.name != Marker.class.name) returnClassNode annotatedClass = (ClassNode) astNodes[1]MethodNode newMethod = makeMethod(annotatedClass)annotatedClass.addMethod(newMethod)}MethodNode makeMethod(ClassNode source) {def ast = new AstBuilder().buildFromString(CompilePhase.INSTRUCTION_SELECTION, false,"def added() { println 'Added' }")return (MethodNode) ast[1].methods.find { it.name == 'added' }} }感謝Hamlet D'Arcy提供的一個出色的AST轉換示例,并感謝Peter Niederwieser在論壇上回答了我的問題 。
翻譯自: https://www.javacodegeeks.com/2014/09/using-gradle-to-build-apply-ast-transformations.html
gradle 構建應用流程
總結
以上是生活随笔為你收集整理的gradle 构建应用流程_使用Gradle构建和应用AST转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对方把我拉黑了微信怎么加回来
- 下一篇: 盒马开售iPhone 15 首批新机8点