使用cup-gradle-plugin设置生成类包名及-destdir参数无效求助
解决Cup
-destdir 参数不生效及Gradle文件移动问题 问题1:让生成的类位于与包名匹配的正确文件夹
Cup的-destdir参数需要和语法文件中的包名声明配合使用,单独指定路径不会自动生成包结构目录:
- 在你的Cup语法文件(
.cup)开头添加包名声明:package my.pkg; - 修改Gradle的Cup配置,只指定根生成目录,无需包含包路径:
cup { args = ["-destdir", "build/generated-src/cup", "-parser", "my_parser", "-symbols", "my_sym"] }
这样Cup会自动在build/generated-src/cup下创建my/pkg子目录,并将生成的my_parser.java和my_sym.java放入其中,同时文件内会自动带上package my.pkg;声明,完全匹配包名对应的文件夹结构。
问题2:通过Gradle任务移动生成文件的解决方案
如果不想修改语法文件,可通过自定义Gradle任务实现文件移动,同时修正类的包名(避免编译错误):
// 注册移动文件的任务 tasks.register('moveCupGeneratedFiles') { // 依赖Cup生成任务,确保先生成文件再移动 dependsOn tasks.named('cup') doLast { def sourceDir = file('build/generated-src/cup') def targetDir = file('build/generated-src/cup/my/pkg') // 创建目标目录(如果不存在) targetDir.mkdirs() // 移动指定的生成文件 def filesToMove = sourceDir.listFiles().findAll { it.name == 'my_parser.java' || it.name == 'my_sym.java' } filesToMove.each { file -> file.moveTo(new File(targetDir, file.name)) } // 修正文件内的包名声明(可选但必要,否则编译报错) targetDir.eachFile { file -> def updatedContent = file.text.replaceFirst( /^package.*;/, 'package my.pkg;' ) file.text = updatedContent } } } // 让Java编译任务依赖该移动任务,确保编译前文件已到位 tasks.named('compileJava').configure { dependsOn 'moveCupGeneratedFiles' }
执行gradle compileJava时,会先执行Cup生成任务,再移动文件并修正包名,最后编译代码。
内容的提问来源于stack exchange,提问作者Zhen
相关产品推荐
相关产品推荐

