2013-01-31 33 views
5

Thật dễ dàng để khai báo thư viện phụ thuộc quản lý trong SBT, ví dụLàm cách nào để chuyển đổi giữa các phụ thuộc của dự án và thư viện trong SBT?

libraryDependencies ++= Seq(
"org.specs2" %% "specs2" % "1.12.2" % "test" , 
"junit" % "junit" % "4.7" % "test" 
) 

Và trong khi nó không phải là dễ dàng để khai báo phụ thuộc dự án trong SBT, tôi có thể làm điều đó quá:

object RichMath extends Build { 
    lazy val myApp = Project("RichMath", file(".")) dependsOn(richUtil) 
    lazy val richUtil = RootProject(file("../RichUtil")) 
} 

Nhưng trong thực tế, Tôi thường muốn thay đổi giữa chế độ dự án, nơi các thay đổi hiển thị ngay lập tức trong các dự án thượng nguồn và chế độ thư viện, nơi tôi phải xuất bản các thay đổi để xem chúng trong các dự án phụ thuộc.

Thời gian sử dụng mã nguồn sớm hoặc bất cứ khi nào tôi muốn thực hiện các thay đổi thường xuyên trên các mô-đun, tôi không muốn xuất bản lại chỉ để xem thay đổi ở phía trên. Nhưng trong mã ổn định/trưởng thành, tôi muốn chỉ định chính xác phiên bản nào tôi đang phụ thuộc.

Có vẻ như SBT coi hai phụ thuộc là hoàn toàn khác nhau. Có một cách thẳng thắn hơn để chuyển đổi giữa các dự án và phụ thuộc vào thư viện hơn là viết lại định nghĩa xây dựng của tôi không?

+0

có thể câu hỏi/câu trả lời này là một số trợ giúp cho bạn: http://stackoverflow.com/questions/14351940/setting-up-sbt-environment-to-hack-on-multiple-libraries-at-once/14352600# 14352600 –

Trả lời

3

Tôi có một vài kịch bản cho tập lệnh sbt của mình (kiểm tra, xuất bản, sản xuất). Tôi bắt đầu sbt từ kịch bản (từ bash, bạn có thể có môi trường khác) với ví dụ DO=TESTS sbt. Đây là phụ thuộc năng động của tôi về vấn đề của biến môi trường với:

if (sys.env.contains("LOCAL_BUILD")) { 
    Seq[Project.Setting[_]](
    unmanagedResourceDirectories in Compile <+= baseDirectory { _/"src"/"main"/"scala" }, 
    libraryDependencies ++= { 
     Seq(
     "org.digimead" %% "digi-lib-slf4j" % "0.2.1-SNAPSHOT" % "test", 
     "org.digimead" %% "digi-lib-test" % "0.2.1-SNAPSHOT" % "test", 
     "org.scalatest" %% "scalatest" % "1.9" % "test" 
    ) 
    } 
) 
} else { 
    Seq[Project.Setting[_]](
    libraryDependencies ++= { 
     Seq(
     "org.slf4j" % "slf4j-log4j12" % "1.7.1" 
    ) 
    } 
) 
} 

Như bạn có thể thấy tôi có thể thiết lập dự án khác nhau với định nghĩa .sbt đơn điều khiển bởi biến một môi trường. Biến môi trường ảnh hưởng đến tất cả các gói dự án/tiểu dự án.

+0

Mặc dù ví dụ này chỉ hiển thị các cài đặt được thay đổi bởi một biến môi trường, nó cũng có thể áp dụng cho câu hỏi gốc. Thuộc tính hệ thống cũng là một tùy chọn. Điều đó nói rằng, tôi thích tránh các thuộc tính hệ thống/biến env vì vậy tôi thường sử dụng một thiết lập tùy chỉnh cho kịch bản trong câu trả lời này.Đối với câu hỏi ban đầu, cài đặt không có sẵn khi xác định các phụ thuộc giữa các dự án, do đó, trong khi các biến env/thuộc tính không thanh lịch, bạn có thể làm tồi tệ hơn. –

3

Đúng là hai loại phụ thuộc được xử lý khá khác nhau và sẽ tốt hơn nếu không. Trở ngại chính là sbt cần phải biết về tất cả các dự án bên ngoài trước khi cài đặt được tải (vì nhiều lý do).

Hiện tại, giải pháp dễ nhất có lẽ là biến môi trường hoặc thuộc tính hệ thống như được mô tả trong câu trả lời khác. Trong tương lai, sau đây là rất gần với việc có thể trong SBT, nhưng vẫn cần một số công việc hơn:

  1. Khai báo một sự phụ thuộc như thường lệ

    libraryDependencies += "org.example" % "rich-util" % "0.1" 
    
  2. Thêm sự phụ thuộc nguồn từ dòng lệnh, trọng phụ thuộc bình thường tự động trong quá trình này

    $ sbt 
    > projects add ../RichUtil 
    

các conv phương pháp tiếp cận dựa trên ention được mô tả trong Setting up sbt environment to hack on multiple libraries at once là một trường hợp đặc biệt và sẽ được kích hoạt bằng cách này làm việc là tốt.

Các vấn đề liên quan