Làm thế nào để quản lý nhiều mô-đun phụ thuộc lẫn nhau với SBT và IntelliJ IDEA?


82

Tôi đang phát triển một số mô-đun với các phụ thuộc giữa chúng và muốn làm việc với tất cả chúng cùng nhau trong một dự án IDEA. Tôi đang sử dụng sbt-idea để tạo các dự án IDEA từ các định nghĩa xây dựng sbt, điều này hoạt động tốt cho các dự án riêng lẻ. Tuy nhiên, trong trường hợp nhiều mô-đun, những thứ tôi đã thử cho đến nay không hoàn toàn hoạt động:

Sử dụng sbt-idea để tạo tệp IDEA .iml cho từng mô-đun một cách độc lập ; sau đó tạo một dự án IDEA tổng thể từ đầu và thêm các mô-đun đó vào nó. Điều này làm cho tất cả các nguồn mô-đun có thể chỉnh sửa trong cùng một cửa sổ, nhưng các phụ thuộc giữa chúng không được theo dõi (vì vậy việc cố gắng điều hướng từ một số nguồn trong dự án foo đến một thứ gì đó trong thanh sẽ đưa tôi đến phiên bản thư viện đã nhập của thanh , không phải các nguồn cục bộ ).

Sử dụng các bản dựng đa dự án sbt (hay còn gọi là các dự án con) , trong đó Build.scala của dự án mẹ chứa những thứ như:

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

Điều này hầu như hoạt động, trong ý tưởng sbt đó tạo ra một dự án IDEA tổng thể với các phụ thuộc giữa các dự án con được theo dõi. Tuy nhiên, có hai lưu ý:

  1. Nó dường như là một hạn chế sbt rằng các dự án con phải sống trong các thư mục con của dự án tổng thể (tức file("../foo")là không được phép). Đây thực sự không phải là điều tôi muốn (điều gì sẽ xảy ra nếu một mô-đun - chẳng hạn như gói "utils" hoặc "commons" - được sử dụng trong hai dự án tổng thể khác nhau?) Nhưng tôi có thể sống chung với nó.
  2. Một trong các tiểu dự án của tôi có các tiểu dự án của riêng nó; Tôi không chắc liệu bản thân sbt có xử lý các dự án lồng nhau này một cách chính xác hay không, nhưng trong mọi trường hợp chúng đều bị sbt-idea bỏ qua. Rõ ràng là tôi cần các dự án con lồng nhau được đưa vào một cách đệ quy trong dự án tổng thể.

Tóm lại: Tôi muốn thu thập các mô-đun có thể đã có các dự án con thành một dự án IDEA lớn với các phụ thuộc được theo dõi để chỉnh sửa thuận tiện. Tôi làm nó như thế nào? Cảm ơn!


2
Hãy thử thiết lập một siêu dự án liên kết với những cái khác dưới dạng tham chiếu dự án bên ngoài ( github.com/harrah/xsbt/wiki/Full-Configuration ). Tôi chưa tự mình thử điều này với sbt-idea, vì vậy đây là một nhận xét chứ không phải là một câu trả lời.
retronym

Cảm ơn vì ý tưởng-- nhưng đáng buồn là sbt-idea hoàn toàn bỏ qua các tài liệu tham khảo bên ngoài.
David Soergel

Có lẽ điều này sẽ giúp trong phiên bản tiếp theo của SBT-ý tưởng: github.com/mpeltonen/sbt-idea/commit/9f17cc8 github.com/mpeltonen/sbt-idea/commit/4b4adf75
retronym

Thật tuyệt, vì vậy tôi đã cài đặt svn-idea từ các nguồn git mới nhất để lấy những thay đổi đó, sau đó làm sạch các dự án và chạy lại sbt-idea. Có một số vấn đề giải quyết phụ thuộc kỳ lạ mà tôi không hiểu hết, nhưng bằng cách nào đó, tôi đã kết thúc với một dự án đang hoạt động! Tôi đã phải thiết lập thủ công mã nguồn trong IDEA cho các tiểu dự án phụ; và khi nhìn lại, tôi không chắc mình đã không thể làm điều đó ngay từ đầu với ý tưởng chứng khoán 11.1. Nhưng dù sao, cảm ơn-- Tôi nghĩ tôi có thể ngừng cạo yak này ngay bây giờ.
David Soergel

Sau khi viết bình luận cuối cùng đó, tôi thấy rằng tôi không có một dự án nào đang hoạt động (một lần nữa, rắc rối với các tiểu dự án phụ). Vì vậy, tôi chỉ tách chúng thành các dự án cấp một, vì vậy dự án tổng thể của tôi bây giờ chỉ có một cấp dự án con bên dưới nó. Tất nhiên tôi chỉ có thể làm điều đó bởi vì đây là tất cả mã của riêng tôi để bắt đầu.
David Soergel

Câu trả lời:


7

Cách tiếp cận với xây dựng nhiều dự án là một cách chính xác. Bạn có thể có một cây lồng nhau gồm các dự án con có độ dài tùy ý, nhưng bạn không thể có một mô-đun thuộc nhiều dự án mẹ. Điều này hoàn toàn có ý nghĩa, và ở Maven cũng xảy ra tương tự.

Lý do là sẽ khó có cùng một mô-đun vào nhiều dự án và giữ cho các nguồn được đồng bộ hóa. Quy trình làm việc bình thường như sau:

  • Bạn có một dự án thuộc về mô-đun, nơi bạn sửa đổi nguồn mô-đun.
  • Bạn xuất bản mô-đun vào kho lưu trữ cục bộ của mình
  • Trong các dự án khác mà bạn cần mô-đun, bạn khai báo nó dưới dạng thư viện

Nếu bạn muốn tải một mô-đun không thuộc dự án hiện tại bên trong Idea, điều này tuy nhiên khả thi vì bạn có thể thêm mô-đun này làm mô-đun bên ngoài vào không gian làm việc:

  • SBT-IDEA tạo tệp .iml cho dự án của bạn và bạn nhập chúng vào không gian làm việc
  • Bạn có thể thêm other.iml của các dự án khác vào không gian làm việc
  • Nếu bạn sửa đổi các mô-đun SBT bên ngoài mà bạn đã thêm vào không gian làm việc theo cách thủ công, bạn nên xuất bản lại chúng để hiển thị các thay đổi trên dự án "chính", dự án này xem các mô-đun bên ngoài đó là một "thư viện Phụ thuộc"

Cảm ơn các đầu vào. Tuy nhiên vấn đề là không phải trường hợp "Bạn có thể có một cây lồng nhau của các dự án con có độ dài tùy ý". Tôi đồng ý rằng điều này sẽ hoạt động với sbt, nhưng sbt-idea dường như không bao gồm các tiểu dự án con trong tệp dự án IDEA kết quả.
David Soergel

Hạn chế này xuất phát từ ý tưởng?
Edmondo1984 28/12/12

Không, tôi chắc chắn đã làm cho phân cấp dự án IDEA sâu đến nhiều cấp độ.
David Soergel

7

Có vẻ như là một hạn chế sbt rằng các dự án con phải nằm trong các thư mục con của dự án chính (tức là không cho phép tệp ("../ foo")). Đây thực sự không phải là điều tôi muốn (điều gì sẽ xảy ra nếu một mô-đun - chẳng hạn như gói "utils" hoặc "commons" - được sử dụng trong hai dự án tổng thể khác nhau?) Nhưng tôi có thể sống chung với nó.

Với sbt 13.5 và intellij 13.x, bạn có thể chỉ định sự phụ thuộc giữa các dự án với đường dẫn tương đối, sử dụng Build.scala . Hãy nói rằng bạn có hai dự án, một lõi dự án commons và một dự án foo , cả hai sống trong một thư mục chung mã /

  1. tạo Build.scala dưới mã / foo / project /
  2. đặt đoạn mã này vào 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. Tạo dự án IntelliJ của bạn qua sbt bằng cách sbt gen-idea


điều này có cho phép chỉnh sửa nguồn "commons" bằng cách liên kết từ "foo" không?
Tjunkie

Có nó cho phép. Và nó hoạt động trên SBT tôi 0.13.7 và IntelliJ 14.0.3 installion
user2829759
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.