2012-03-19 26 views
6

Tôi đang gặp sự cố khi xây dựng và điều hành một dự án SBT.Scala SBT xây dựng dự án đa mô-đun cho các chai runnable

  • Dự án "giao thức" được nhiều mô-đun sử dụng, bao gồm cả "daemon".

  • Dự án "daemon" phải được đóng gói dưới dạng một tệp thực thi.

Cách "làm đúng" là gì?

Dưới đây là Build.scala tôi:

object MyBuild extends Build { 
lazy val buildSettings = Seq(
    organization := "com.example", 
    version  := "1.0-SNAPSHOT", 
    scalaVersion := "2.9.1" 
    ) 

lazy val root = Project(
    id = "MyProject", 
    base = file("."), 
    aggregate = Seq(protocol, daemon) 
    ) 

lazy val protocol = Project(
    id = "Protocol", 
    base = file("Protocol") 
    ) 

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol) 
    ) 
// (plus more projects) 

Trả lời

7

Cách đúng để làm điều này là sử dụng một trong những plugin SBT cho sản xuất lọ. Tôi đã thử nghiệm cả hai one-jarassembly và cả hai đều có hỗ trợ để loại trừ các thư viện khỏi bình của bạn. Bạn có thể thêm các thiết lập cho các dự án riêng lẻ để chỉ một số dự án sẽ sản xuất các lọ.

Cá nhân tôi đang sử dụng hội đồng, nhưng khi this post chỉ ra, bạn sẽ gặp sự cố nếu bạn có tên tệp trùng lặp.

Edit:

Ví dụ của bạn ở trên, bạn muốn thêm hàng nhập khẩu sau ở đầu:

import sbtassembly.Plugin._ 
import AssemblyKeys._ 

Bạn muốn sửa đổi dự án để xem xét như thế này:

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol), 
    settings = assemblySettings 
) 

Ngoài ra, bạn cần thêm thông tin sau vào project/plugins.sbt (đối với sbt .11):

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.7.3") 

resolvers += Resolver.url("sbt-plugin-releases", 
    new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns) 

Nếu bạn quyết định đi với Hội đồng, có thể bạn sẽ cần xóa các tệp trùng lặp. Dưới đây là ví dụ về mã lắp ráp để loại trừ các tệp log4j.properties trùng lặp trong một dự án có tên là "projectName". Điều này sẽ được thêm vào như là một phần của chuỗi "cài đặt" cho dự án. Lưu ý rằng lệnh thu thập thứ 2 là việc thực hiện cơ sở và được yêu cầu.

excludedFiles in assembly := { (bases: Seq[File]) => 
    bases.filterNot(_.getAbsolutePath.contains("projectName")) flatMap { base => 
    //Exclude all log4j.properties from other peoples jars 
    ((base * "*").get collect { 
     case f if f.getName.toLowerCase == "log4j.properties" => f 
    }) ++ 
    //Exclude the license and manifest from the exploded jars 
    ((base/"META-INF" * "*").get collect { 
     case f if f.getName.toLowerCase == "license" => f 
     case f if f.getName.toLowerCase == "manifest.mf" => f 
    }) 
    } 
} 
+0

Cảm ơn, hoạt động tốt. Ngoài ra phải thêm plugin trong plugins.sbt của tôi - bạn cũng có thể thêm plugin đó vào câu trả lời của mình để trợ giúp người khác. Tôi sẽ đóng câu hỏi vào ngày mai. Có vẻ như điều duy nhất tôi thực sự cần là thêm mainClass thiết lập: = Some ("com.example.Main") vào dự án của tôi, miễn là tôi tự quản lý các phụ thuộc/classpath. - Đó là khá ẩn trong tài liệu, hoặc có lẽ tôi chỉ mù :-) – Arve

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