2015-01-13 18 views
11

Tôi có một dự án sử dụng Scala 2.10 và một dự án sử dụng Scala 2.11. Chúng phụ thuộc vào một dự án chung, có thể biên dịch với cả hai.Làm thế nào để có tiểu dự án SBT với nhiều phiên bản Scala?

lazy val foo = (project in file("foo")).dependsOn(baz).settings(
    scalaVersion := "2.10.4" 
) 

lazy val bar = (project in file("bar")).dependsOn(baz).settings(
    scalaVersion := "2.11.4" 
) 

lazy val baz = (project in file("baz")).settings(
    crossScalaVersions := Seq("2.10.4", "2.11.4"), 
    scalaVersion := "2.10.4" 
) 

Và sau đó

$ sbt bar/update 
[info] Updating {file:/home/paul/Private/test/}bar... 
[info] Resolving baz#baz_2.11;0.1-SNAPSHOT ... 
[warn] module not found: baz#baz_2.11;0.1-SNAPSHOT 
[warn] ==== local: tried 
[warn] /home/paul/.ivy2/local/baz/baz_2.11/0.1-SNAPSHOT/ivys/ivy.xml 
[warn] ==== public: tried 
[warn] http://repo1.maven.org/maven2/baz/baz_2.11/0.1-SNAPSHOT/baz_2.11-0.1-SNAPSHOT.pom 
[info] Resolving jline#jline;2.12 ... 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[warn] ::   UNRESOLVED DEPENDENCIES   :: 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[warn] :: baz#baz_2.11;0.1-SNAPSHOT: not found 
[warn] :::::::::::::::::::::::::::::::::::::::::::::: 
[trace] Stack trace suppressed: run last bar/*:update for the full output. 
[error] (bar/*:update) sbt.ResolveException: unresolved dependency: baz#baz_2.11;0.1-SNAPSHOT: not found 
[error] Total time: 1 s, completed Jan 13, 2015 11:42:51 AM 

Làm thế nào tôi có thể có baz sử dụng bởi cả hai dự án?

+1

Bạn đã thử tùy chọn 'crossPaths: = false', để bỏ qua các phiên bản scala chưa? –

+0

Có một cơ hội mà bạn sẽ có một số vấn đề so sánh (không phải 100%), nhưng phải trung thực tình huống của bạn có mùi xấu; vì vậy tôi sẽ đề nghị điều này như là một sửa chữa tạm thời, cho đến khi bạn thực hiện * foo * và * baz * sử dụng 2.11.4 cả hai. –

Trả lời

2

Tôi tạo ra một SBT plugin cho việc này.

dự án/plugins.sbt

resolvers += Resolver.sonatypeRepo("releases") 

addSbtPlugin("com.lucidchart" % "sbt-cross" % "1.0") 

build.sbt

lazy val foo = (project in file("foo")).dependsOn(baz_2_10).settings(
    scalaVersion := "2.10.4" 
) 

lazy val bar = (project in file("bar")).dependsOn(baz_2_11).settings(
    scalaVersion := "2.11.5" 
) 

lazy val baz = (project in file("baz")).cross 

lazy val baz_2_10 = baz("2.10.4") 

lazy val baz_2_11 = baz("2.11.5") 

Phải mất thêm một vài dòng, nhưng bây giờ tất cả mọi thứ biên dịch như mong đợi: sbt foo/compile công trình và công trình sbt bar/compile .

Bạn không cần phải nhớ lệnh duy nhất, bạn không có lỗi từ crossPath := false, và không giống như ++, đây là parallelizable: sbt compile sẽ biên dịch foo, bar, và baz với các phiên bản Scala đúng đồng thời.

+0

Thật không may nó không chơi tốt với Intellij, nhưng khi chạy từ sbt - nhanh và tuyệt vời. – Tvaroh

+0

Hoạt động OK với IntellJ '2017.1.4' – Atais

+0

@Tvaroh Tôi nghĩ rằng nó hoạt động với Intellij cũng như hay hơn bất kỳ giải pháp nào khác. Nộp một lỗi trên dự án Github nếu bạn quan sát khác. –

7

Giải pháp đề xuất của Yevgeniy Mordovkin, để khai báo crossPaths := false trong dự án baz, hoạt động.

Một điều khác bạn có thể làm, là thêm một + trước lệnh: sbt '+ bar/update'. Điều đó sẽ xây dựng baz cho tất cả các phiên bản Scala đã khai báo.

+0

Cảm ơn. ** (1) ** Liệu 'crossPaths' có gây ra vấn đề không, vì các phiên bản Scala nhỏ không tương thích nhị phân? ** (2) ** Có vẻ như để '+' hoạt động, tôi cũng cần thêm 'crossVersions' vào' bar', và chuyển đổi dự án bằng 'project bar' và sau đó' + update' (thay vì '+ bar/update'), nếu không nó sẽ sử dụng 2.10. –

+0

@PaulDraper không cần thêm 'crossScalaVersions' vào' bar'. Những gì bạn phải làm là đặt 'cài đặt' trước khi khai báo' dependsOn': 'lazy val bar = (dự án trong tệp (" bar ")) .cài đặt (scalaVersion: =" 2.11.4 "). DependsOn (baz)' . –

+0

@PaulDraper, bạn có thể sử dụng 'update' mà không có' + 'bên trong' bar' trước khi bạn đã biên dịch 'baz' cho tất cả các phiên bản đã khai báo. –

0

Tôi đã có một thiết lập tương tự, và đã nhận nó làm việc như vậy:

lazy val baz = (project in file("baz")).settings(
    crossScalaVersions := Seq("2.10.4", "2.11.4") 
) 
lazy val bar = (project in file("bar")).dependsOn(baz).settings(
    scalaVersion := "2.10.4" 
) 
lazy val foo = (project in file("foo")).dependsOn(baz).settings(
    scalaVersion := "2.11.4" 
) 

Và tòa nhà với

sbt '++ 2.10.4 baz/compile' 'bar/compile' '++ 2.11.4 baz/compile' 'foo/compile' 
Các vấn đề liên quan