1

我正在尝试设置 IntelliJ 2017.2 以使用 Gradle 4.2.1 与我的 Play 2.6 应用程序一起使用。

我还安装了 IntelliJ 的 Scala 插件。

经过数小时筛选各种博客和指南后,我创建了一个看起来像这样的 build.gradle 文件,它应该可以解决问题:

plugins {
    id 'play'
    id 'idea'
}

model {
    components {
        play {
            platform play: '2.6.6', scala: '2.11'
            injectedRoutesGenerator = true
        } 
    }
}

idea {
    module {
        sourceDirs += project.file('app')
        testSourceDirs += project.file('test')

        project.file("${project.buildDir}/src/play/binary").listFiles().each {
            if (it.name.endsWith('ScalaSources')) {
                sourceDirs += it
                generatedSourceDirs += it
            }
        }

        outputDir = project.file("${project.buildDir}/playBinary/classes")
        testOutputDir = project.file("${project.buildDir}/playBinary/testClasses")

        scopes.COMPILE = [plus: [configurations.play], minus: []]
        scopes.RUNTIME = [plus: [configurations.playRun], minus:[configurations.play]]
        scopes.TEST = [plus: [configurations.playTest], minus: [configurations.playRun]]

        sourceDirs += project.file('conf')
        testSourceDirs += project.file('test/resources')
    }
}

dependencies {
    // dependencies...
}

我面临的主要问题是 IntelliJ 无法正确找到我的所有资源。

如果我尝试在项目设置中手动添加内容(例如“app”目录),我的更改会通过 Gradle 刷新重置。

我也尝试过使用 Gradle 配置,例如“为每个源集创建单独的模块”,但它并没有太大帮助。

我知道这不是典型的设置,因为大多数人在 Play 中使用 SBT,但不幸的是,由于 Gradle 是工作中的标准,我们暂时坚持这样做。有没有人对 IntelliJ 2017、Gradle 4.2 和 Play 2.6 的设置感到幸运?

4

1 回答 1

0

我发现 Intellij 2017 并不真正支持 Gradle play 插件。我正在运行 IDEA 2017 3.5 和 Gradle 4.6,从 build.gradle 简单导入 Gradle 项目将不起作用。在处理源文件时,IDEA 变得与记事本差不多。

我认为正在发生的是,IDEA 是硬编码的,专门用于查找 Java 插件的配置和源集。您的范围配置可能会做同样的事情,但首先,我添加了两个配置:

// IDEA will not use the dependencies unless it finds these particular configurations.

configurations.create(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME, configuration -> {
    configuration.extendsFrom(configurations.findByName(PlayPluginConfigurations.COMPILE_CONFIGURATION));
    configuration.setTransitive(true);
});

configurations.create(JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME, configuration -> {
    configuration.extendsFrom(configurations.findByName(PlayPluginConfigurations.TEST_COMPILE_CONFIGURATION));
    configuration.setTransitive(true);
});

这允许 IDEA 识别 gradle 依赖项,但除非它们与 IDEA 项目结构的模块源相关联,否则它们不会出现在 IDE 中,因此我添加了两个源集——它们的唯一目的是触发IDEA 识别依赖关系,而不是 IDEA 在构建任何东西时使用它们。(我应用了“java-base”插件,并使用了 JavaPluginConvention 对象的 sourceSets。)

    sourceSets.create("main", sourceSet -> {
        sourceSet.getJava().setSrcDirs(Collections.singletonList("app"));
        sourceSet.getJava().setOutputDir(fileResolver.resolve("build/playBinary/classes"));
        sourceSet.getResources().setSrcDirs(Collections.singletonList("conf"));
        sourceSet.getResources().setOutputDir(fileResolver.resolve("build/playBinary/resources"));
    });

    sourceSets.create("test", sourceSet -> {
        sourceSet.getJava().setSrcDirs(Collections.singletonList("test"));
        sourceSet.getJava().setOutputDir(fileResolver.resolve("build/playBinary/classes"));
        sourceSet.getResources().setSrcDirs(Collections.singletonList("test/resources"));
        sourceSet.getResources().setOutputDir(fileResolver.resolve("build/playBinary/resources"));
    });

我仍然缺少一些细节。如果有人可以添加详细信息,我很乐意分享我的插件,上面来自。我没有使用“idea”插件——我只是单独应用“play”插件,并应用上述修复,并将项目作为 Gradle 项目导入。gradle 任务在 IDE 中运行良好,并且依赖项显示正确,并且 IDE 的所有优点,只要通过点击来导航源,就会恢复生机。

于 2018-03-29T18:31:14.857 回答