如何使用Groovy / idea插件来操作intelliJ IDEA XML?

时间:2016-06-07 18:57:57

标签: xml gradle groovy

我是Groovy和Gradle的新手。我通常也不会使用XML做很多事情。 我遇到的问题是我们的集成测试没有被标记为测试源,这会导致我们的构建出现问题。据我所知,他们在Gradle中正确完成。好的,现在是一些代码上下文。这是我们有问题的* .iml文件之一的示例:

<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":project:projects:chicken:integrationTest" external.linked.project.path="$MODULE_DIR$/../../../../../project/projects/chicken" external.root.project.path="$MODULE_DIR$/../../../../.." external.system.id="GRADLE" external.system.module.group="eas.project.ouboundnmanagement-project" external.system.module.type="sourceSet" external.system.module.version="6.8.0-SNAPSHOT" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
    <output url="file://$MODULE_DIR$/../../../../../project/projects/chicken/build/classes/it" />
    <exclude-output />
    <content url="file://$MODULE_DIR$/../../../../../project/projects/chicken/src/integrationTest">
      <sourceFolder url="file://$MODULE_DIR$/../../../../../project/projects/chicken/src/integrationTest/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/../../../../../project/projects/chicken/src/integrationTest/resources" type="java-resource" />
    </content>
    <content url="file://$MODULE_DIR$/../../../../../project/projects/chicken/src/it">
      <sourceFolder url="file://$MODULE_DIR$/../../../../../project/projects/chicken/src/it/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/../../../../../project/projects/chicken/src/it/resources" type="java-resource" />
...

出于某种原因,IntelliJ IDE坚持额外的内容根。它与任务名称integrationTest有关,而在所有其他情况下我们称之为it。例如,源目录是src/it/java。所以需要删除。另外,对于正确的,我们需要将isTestSource更改为true,我认为我们还需要将type="java-resource"更改为type="test-resource"type="java-test-resource"

到目前为止,我已尝试过:

idea {
    module {
        iml {
            withXml { xmlProvider ->                 // Get root node.
                def moduleNode = xmlProvider.asNode()
                def contents = moduleNode.findAll { node -> node.name == 'content' }
                println "####### $contents"
            }
        }
    }
}

以上打印#########[]因此不太有用或信息丰富。

可能有更好的方法,但有一种可能性是获取所有<content...>个节点的集合。迭代它并删除URL属性以'integrationTest'结尾的那个。对于任何具有以it结尾的URL,检索sourceFolder个元素并设置属性{{1}分别和isTestSource

问题在于我无法弄清楚要做出什么样的调用才能实现这一目标。 IDE通常不会像往常一样告诉我可能的调用是什么,这对我来说没有帮助。

[更新]我现在有代码修复了问题,但IntellJ无法识别已更改的* .iml&#39; s。在更新到2016.1.3之前。

所以我的集成测试源集现在看起来像&#34;

type

1 个答案:

答案 0 :(得分:0)

如果您链接到Gradle,这将不起作用。此外,还有一个错误会阻止集成测试被正确标记。请投票支持。

https://youtrack.jetbrains.com/issue/IDEA-151925