2

使用带有 Scala 插件的 Intellij IDEA。

执行Build->时Rebuild Project,我收到以下 make 警告:

Output path ProjectRootFolder\project\target\idea-test-classes intersects with a source root. Only files that were created by build will be cleaned.
Output path ProjectRootFolder\project\target\idea-classes intersects with a source root. Only files that were created by build will be cleaned.

该项目是使用 SBT gen-idea 插件生成的。

Project Structure警告中提到的两个输出路径设置为-> Modules-> ProjectName-build-> Paths->下项目的构建模块的输出路径和测试输出路径Use module compile output path

查看ProjectName模块和ProjectName-build模块的 Sources 选项卡,我发现没有ProjectRootFolder\project\target标记为Source.

4

2 回答 2

3

似乎警告是由于project.文件夹被标记为模块Sources中的事实引起的。ProjectName-build

由于在使用 IDEA 构建项目时不需要 SBT 构建模块,因此一种解决方案是生成没有该模块的 IDEA 项目:

sbt gen-idea no-sbt-build-module

更多细节在这里:https ://github.com/mpeltonen/sbt-idea/issues/180

更新

删除构建模块实际上是有问题的,因为 build.scala 文件会显示很多警告,因为缺少所需的库。

一个解决方案是取消标记.project退出Sources构建模块,这也很麻烦,因为它需要在每个 gen-idea 之后完成。

更好的解决方案是使用 sbt 而不是 make 来构建项目。要实现这一点,请删除 IDEA 运行配置中的启动前生成步骤,并products改为添加 SBT 步骤。

于 2014-03-02T00:30:22.300 回答
1

我得到了同样的警告,到目前为止它没有引起任何问题。

这段代码来看,他们似乎只是删除了 IDE 生成的文件,否则他们会想要删除目标目录中的所有内容。他们通过检查那里是否有任何源文件来确保安全:

// check that output and source roots are not overlapping
final List<File> filesToDelete = new ArrayList<File>();
for (Map.Entry<File, Collection<BuildTarget<?>>> entry : rootsToDelete.entrySet()) {
  context.checkCanceled();
  boolean okToDelete = true;
  final File outputRoot = entry.getKey();
  if (JpsPathUtil.isUnder(allSourceRoots, outputRoot)) {
    okToDelete = false;
  }
  else {
    final Set<File> _outRoot = Collections.singleton(outputRoot);
    for (File srcRoot : allSourceRoots) {
      if (JpsPathUtil.isUnder(_outRoot, srcRoot)) {
        okToDelete = false;
        break;
      }
    }
  }
  if (okToDelete) {
    // do not delete output root itself to avoid lots of unnecessary "roots_changed" events in IDEA
    final File[] children = outputRoot.listFiles();
    if (children != null) {
      filesToDelete.addAll(Arrays.asList(children));
    }
    else if (outputRoot.isFile()) {
      filesToDelete.add(outputRoot);
    }
  }
  else {
    context.processMessage(new CompilerMessage(
      "", BuildMessage.Kind.WARNING, "Output path " + outputRoot.getPath() + " intersects with a source root. Only files that were created by build will be cleaned.")
    );
    // clean only those files we are aware of
    for (BuildTarget<?> target : entry.getValue()) {
      clearOutputFiles(context, target);
    }
  }
}
于 2014-03-01T22:57:40.730 回答