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


82

종속성이있는 여러 모듈을 개발 중이며 하나의 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 프로젝트에 하위 프로젝트가 이미있을 수있는 모듈을 수집하고 싶습니다 . 어떻게하니? 감사!


2
다른 프로젝트에 외부 프로젝트 참조 ( github.com/harrah/xsbt/wiki/Full-Configuration ) 로 연결되는 메타 프로젝트를 설정해보세요 . 나는 이것을 sbt-idea로 직접 시도하지 않았으므로 이것은 대답이 아닌 주석입니다.
retronym

아이디어에 감사하지만 슬프게도 sbt-idea는 외부 참조를 완전히 무시합니다.
David Soergel 2012 년

어쩌면이 SBT-아이디어의 다음 버전에 도움이 될 것입니다 github.com/mpeltonen/sbt-idea/commit/9f17cc8 github.com/mpeltonen/sbt-idea/commit/4b4adf75
retronym

멋지다. 그래서 최신 git 소스에서 svn-idea를 설치하여 변경 사항을 가져온 다음 프로젝트를 정리하고 sbt-idea를 다시 실행했습니다. 내가 완전히 이해하지 못하는 이상한 종속성 해결 문제가 있었지만 어떻게 든 작업 프로젝트로 끝났습니다! 하위 프로젝트에 대해 IDEA에서 소스 디렉토리를 수동으로 설정해야했습니다. 그리고 돌이켜 보면 나는 주식 sbt-idea 11.1로 처음에 그것을 할 수 없었는지 확신하지 못합니다. 어쨌든 고마워요. 지금은이 야크 면도 그만 둘 수있을 것 같아요.
David Soergel 2012-01-12

마지막 댓글을 쓴 후 결국 작업 프로젝트가 없다는 것을 알게되었습니다 (다시 하위 프로젝트에 문제가 있음). 그래서 저는 그것들을 일급 프로젝트로 분리했습니다. 그래서 제 마스터 프로젝트는 이제 그 아래에 한 수준의 하위 프로젝트 만 있습니다. 물론 이것은 시작해야 할 모든 코드이기 때문에 그렇게 할 수 있습니다.
David Soergel 2012 년

답변:


7

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

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

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

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

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

입력 해 주셔서 감사합니다. 그러나 문제는 "임의의 길이의 하위 프로젝트의 중첩 트리를 가질 수있다"는 경우가 아니라는 것입니다. 나는 이것이 sbt와 함께 작동해야한다는 데 동의하지만 sbt-idea는 결과 IDEA 프로젝트 파일에 하위 하위 프로젝트를 포함하지 않는 것으로 보입니다.
David Soergel

이 제한은 아이디어에서 비롯된 것입니까?
Edmondo1984 2012

아니요, 저는 확실히 IDEA 프로젝트 계층 구조를 여러 수준으로 만들었습니다.
David Soergel 2012

7

서브 프로젝트가 마스터 프로젝트의 서브 디렉토리에 있어야한다는 것은 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


"foo"에서 링크하여 "commons"소스를 편집 할 수 있습니까?
Tjunkie 2015

네, 가능합니다. 그리고 그것은 내 sbt 0.13.7 및 intellij 14.0.3 설치에서 작동합니다
user2829759 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.