[scala] SBT 및 IntelliJ IDEA로 여러 상호 의존적 모듈을 관리하는 방법은 무엇입니까?

종속성이있는 여러 모듈을 개발 중이며 하나의 IDEA 프로젝트에서 모두 함께 작업하고 싶습니다. sbt-idea 를 사용하여 sbt 빌드 정의에서 IDEA 프로젝트를 생성하고 있으며 이는 개별 프로젝트에 적합합니다. 그러나 다중 모듈의 경우 지금까지 시도한 것이 제대로 작동하지 않습니다.

sbt-idea를 사용하여 각 모듈에 대해 독립적으로 IDEA .iml 파일을 생성하십시오 . 그런 다음 처음부터 마스터 IDEA 프로젝트를 만들고 해당 모듈을 추가합니다. 이렇게하면 모듈 소스를 모두 같은 창에서 편집 할 수 있지만 종속성은 추적되지 않습니다 (따라서 foo 프로젝트 내의 일부 소스 에서 bar의 항목 으로 이동하려고 하면 로컬 소스가 아닌 bar 의 가져온 라이브러리 버전으로 이동 합니다. ).

sbt 다중 프로젝트 빌드 (하위 프로젝트라고도 함)를 사용합니다 . 여기서 상위 프로젝트의 Build.scala에는 다음과 같은 항목이 포함됩니다.

lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)

이는 sbt-idea가 추적 된 하위 프로젝트 간의 종속성으로 마스터 IDEA 프로젝트를 생성한다는 점에서 거의 작동합니다. 그러나 두 가지주의 사항이 있습니다.

  1. 하위 프로젝트가 마스터 프로젝트의 하위 디렉터리에 있어야한다는 것은 sbt 제한 인 것 같습니다 (즉, file("../foo")허용되지 않음). 이것은 실제로 내가 원하는 것은 아니지만 ( “utils”또는 “commons”패키지와 같은 모듈이 두 개의 다른 마스터 프로젝트에서 사용된다면 어떻게 될까요?)하지만 함께 살 수 있습니다.
  2. 내 하위 프로젝트 중 하나에는 자체 하위 프로젝트가 있습니다. sbt 자체가 이러한 중첩 된 프로젝트를 올바르게 처리하는지 여부는 확실하지 않지만 어쨌든 sbt-idea에서는 무시됩니다. 분명히 마스터 프로젝트에 재귀 적으로 포함될 중첩 된 하위 프로젝트가 필요합니다.

요약하면 : 편리한 편집을 위해 추적 된 종속성이있는 하나의 큰 IDEA 프로젝트에 하위 프로젝트가 이미있을 수있는 모듈을 수집하고 싶습니다 . 어떻게하니? 감사!



답변

다중 프로젝트 빌드를 사용한 접근 방식이 올바른 방법입니다. 임의 길이의 하위 프로젝트의 중첩 트리를 가질 수 있지만 여러 상위 프로젝트에 속하는 모듈을 가질 수는 없습니다. 이것은 절대적으로 의미가 있으며 Maven에서도 동일하게 발생합니다.

그 이유는 동일한 모듈을 여러 프로젝트에 포함하고 소스를 동기화 상태로 유지하기가 어렵 기 때문입니다. 일반적인 워크 플로는 다음과 같습니다.

  • 모듈 소스를 수정하는 모듈이 속한 프로젝트가 있습니다.
  • 모듈을 로컬 저장소에 게시합니다.
  • 모듈이 필요한 다른 프로젝트에서는이를 libraryDependency로 선언합니다.

Idea 내에서 현재 프로젝트에 속하지 않는 모듈을로드하려는 경우 작업 공간에 외부 모듈로 추가 할 수 있으므로 가능합니다.

  • SBT-IDEA는 프로젝트에 대한 .iml 파일을 생성하고 작업 공간으로 가져옵니다.
  • 다른 프로젝트의 other.iml을 작업 공간에 추가 할 수 있습니다.
  • 작업 공간에 수동으로 추가 한 외부 SBT 모듈을 수정하는 경우 “기본”프로젝트에서 변경 사항을 볼 수 있도록 해당 외부 모듈이 “libraryDependency”임을 확인하도록 다시 게시해야합니다.


답변

서브 프로젝트가 마스터 프로젝트의 서브 디렉토리에 있어야한다는 것은 sbt 제한 인 것 같습니다 (즉, file ( “../ foo”)는 허용되지 않음). 이것은 실제로 내가 원하는 것은 아니지만 ( “utils”또는 “commons”패키지와 같은 모듈이 두 개의 다른 마스터 프로젝트에서 사용된다면 어떻게 될까요?)하지만 함께 살 수 있습니다.

sbt 13.5 및 intellij 13.x에서는 Build.scala를 사용하여 상대 경로로 프로젝트 간 종속성을 지정할 수 있습니다 . 두 개의 프로젝트 (핵심 프로젝트 공유지 및 다른 프로젝트 foo )가 공통 디렉토리 코드에 살고 있다고 가정 해 보겠습니다.

  1. code / foo / project / 아래에 Build.scala를 만듭니다.
  2. 이 코드 조각을 Build.scala에 넣으십시오.

    object ProjectDependencies {
        val commons = RootProject(file("../commons"))
    }
    
    object ProjectBuild extends Build {
        import ProjectDependencies._
    
        lazy val root = Project(id = "foo", base = file(".")).dependsOn(commons)
    }
    
  3. sbt를 통해 IntelliJ 프로젝트 생성 sbt gen-idea


답변