我第一次将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')
}
}
}
这似乎将所有代码(源代码和测试代码)都放入了主要代码中。源代码工作正常,但是在导入" kotlin.test"时,测试会抱怨未定义的引用。包。这是我的完整build.gradle文件(所有这些都是由IntelliJ预生成的,除了sourceSets):
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文件夹标记为Source或Test,但是这似乎不允许你将它设置为两者。我也对模块窗口显示的内容感到困惑。在顶层它有" myproject"有四个蓝框和" myproject"一个蓝色的盒子里面,第一个是#34; myproject_main"和" myproject_test",两个都有一个蓝框。我不明白一个蓝盒子和四个蓝盒子之间的区别,或者这些东西与我的目录结构有什么关系(也许它没有?)。然后我不确定这些设置是如何与Gradle交互的。
总而言之,我非常困惑,我甚至不知道我的问题是Gradle设置,Intellij设置还是两者兼而有之。我认为这将是一项简单的任务,但它变成了一个巨大的兔子洞。理想情况下,我想创建我已经描述的目录结构,但我很高兴即使只是对我所做的所有这些设置的一个很好的解释,因为我所拥有的资源发现在线避风港帮助我了解al。
答案 0 :(得分:0)
您需要了解的关键是IntelliJ IDEA要求每个目录属于单个类型的单个源根目录。因此,即使Gradle允许您说匹配特定模式的文件应该被视为测试源,并且不匹配此模式的文件应该是生产源,这样的配置也无法在IntelliJ IDEA项目结构中正确反映。
另一个关键是你永远不应该在从Gradle导入的项目中手动更改项目结构。这将导致IDE和命令行构建的不同行为,并且很可能在后续项目重新同步期间您的更改将丢失。
带有四个蓝色框的东西称为模块组,带有一个蓝色框的东西称为模块。将Gradle项目导入IntelliJ IDEA时,它会为每个Gradle模块创建一个模块组,然后在每个模块组下创建三个模块(作为整体的Gradle模块,用于其生产源及其测试源) 。
如果您想将代码保存在单个目录中,那么基本上您需要将所有代码视为生产源。只是不要为测试根指定任何设置,并对所有依赖项使用常规的“编译”范围。
或者,如果要将应用程序发送给用户并且不希望将编译的测试作为其一部分发布,则应将生产和测试源保存在单独的目录中。如果您创建如下结构,仍然可以减少嵌套:
project
|-src
|-MyClass.kt
|-MyOtherClass.kt
|-testSrc
|-MyClassTest.kt
|-MyOtherClassTest.kt