gradle - 在 Intellij/Gradle 中创建包含源代码和测试的平面目录结构?

标签 gradle intellij-idea

我第一次将 Kotlin 与 Intellij 和 Gradle 一起使用(我最初的目标是在学习 Kotlin 的同时实现一个个人项目,我认为最好使用“完整”环境)。我想用一个简单的平面目录结构来组织我的项目,我的所有代码和测试都在同一个目录中。所以我希望它看起来像这样:

project
|-src
  |-MyClass.kt
  |-MyClassTest.kt
  |-MyOtherClass.kt
  |-MyOtherClassTest.kt

我试图查看 Gradle 和 Intellij 的文档,但老实说,我无法对其中任何一个做出正面或反面。

Gradle 中的 Kotlin 插件似乎具有默认目录结构,但可以更改。因此,我尝试根据在搜索中找到的一些代码片段将以下内容添加到 build.gradle 文件中:
sourceSets {
    main {
        kotlin {
            srcDirs = ['src']
            exclude('*Test.kt')
        }
    }
    test {
        kotlin {
            srcDirs = ['src']
            include('*Test.kt')
        }
    }
}

这似乎将所有代码(包括源代码和测试代码)都放入 main 中。源代码工作正常,但测试在导入“kotlin.test”包时提示 undefined reference 。这是我完整的 build.gradle 文件(除 sourceSets 外,所有这些都是由 IntelliJ 预先生成的):
buildscript {
    ext.kotlin_version = '1.2.41'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

version '1.0-SNAPSHOT'

apply plugin: 'kotlin'

sourceSets {
    main {
        kotlin {
            srcDirs = ['src']
            exclude('*Test.kt')
        }
    }
    test {
        kotlin {
            srcDirs = ['src']
            include('*Test.kt')
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

然后 Intellij 具有项目结构设置,我可以使用它来将 src 文件夹标记为源或测试,但这似乎不允许您将其设置为两者。我也对模块窗口显示的内容感到困惑。在顶层它有四个蓝色框的“myproject”和一个蓝色框的“myproject”,在第一个里面是“myproject_main”和“myproject_test”,两者都有一个蓝色框。我不明白一个蓝框和四个蓝框之间的区别,或者这些东西与我的目录结构有何关系(也许不是?)。然后我不确定这些设置如何与 Gradle 交互。

总而言之,我很困惑,我什至不知道我的问题是与 Gradle 设置、Intellij 设置还是两者兼而有之。我以为这将是一项简单的任务,但它变成了一个巨大的兔子洞。理想情况下,我想创建我所描述的目录结构,但即使只是对我一直在搞乱的所有这些设置做了一个很好的解释,我也会很高兴,因为我在网上找到的资源没有帮助我完全理解。

最佳答案

您需要了解的关键是 IntelliJ IDEA 要求每个目录属于单一类型的单一源根目录。因此,即使 Gradle 允许您说与特定模式匹配的文件应视为测试源,而与此模式不匹配的文件应视为生产源,但此类配置无法正确反射(reflect)在 IntelliJ IDEA 项目结构中。

另一个关键是你永远不应该在从 Gradle 导入的项目中手动更改项目结构。这将导致 IDE 和命令行构建的不同行为,并且您的更改很可能会在后续项目重新同步期间丢失。

有四个蓝框的东西叫做模块组,有一个蓝框的东西叫做模块。将 Gradle 项目导入 IntelliJ IDEA 时,会为每个 Gradle 模块创建一个模块组,然后在每个模块组下创建三个模块(用于 Gradle 模块整体、其生产源和测试源) .

如果您想将代码保存在单个目录中,那么基本上您需要将所有代码视为生产源。只是不要为测试根指定任何设置,并为所有依赖项使用常规的“编译”范围。

或者,如果您想将您的应用程序发送给用户,并且不想将已编译的测试作为其中的一部分发送,您应该将生产和测试源保存在不同的目录中。如果您创建如下结构,您仍然可以减少嵌套:

project
|-src
  |-MyClass.kt
  |-MyOtherClass.kt
|-testSrc
  |-MyClassTest.kt
  |-MyOtherClassTest.kt

关于gradle - 在 Intellij/Gradle 中创建包含源代码和测试的平面目录结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50663698/

相关文章:

java - IntelliJ IDEA 15 中的无限目录递归

Scala 代码在 Intellij 上运行,但不在 Apache Zeppelin notebook 上运行

junit - gradle junit 运行 : how to pick tests from jar file

gradle - 如何从最终工件(jar)中排除依赖项,但需要在 gradle 中编译和运行单元测试时使用

java - 使用 Gradle 上传文件到 GitLab Maven 仓库

java - Intellij 堆大小,初始堆大小设置为大于最大堆大小的值

android - "Android Studio"调试-显示变量为十六进制

testing - 无法在 Gradle 中解析类 org.gradle.util.TestUtil

android - Flutter:Android模拟器上未安装发布apk

android-studio - 如何在 Android Studio 上隐藏滚动条标记?