1. 組織建置

組織建置 

本頁討論建置結構的組織。

請先閱讀入門指南中的先前頁面,特別是您需要了解 build.sbt任務圖函式庫依賴多專案建置,然後再閱讀此頁面。

sbt 是遞迴的 

build.sbt 隱藏了 sbt 的實際運作方式。sbt 建置是使用 Scala 程式碼定義的。該程式碼本身也必須建置。有什麼比使用 sbt 更好的方式?

project 目錄是您建置中的另一個建置,它知道如何建置您的建置。為了區分建置,我們有時使用術語適當建置來指稱您的建置,並使用元建置來指稱 project 中的建置。元建置中的專案可以執行任何其他專案可以執行的操作。您的建置定義是一個 sbt 專案。

而且它們是層層遞迴的。如果您願意,您可以透過建立 project/project/ 目錄來調整建置定義專案的建置定義。

這是一個說明。

hello/                     # your build's root project's base directory

    Hello.scala            # a source file in your build's root project
                           #   (could be in src/main/scala too)

    build.sbt              # build.sbt is part of the source code for
                           #   meta-build's root project inside project/;
                           #   the build definition for your build

    project/               # base directory of meta-build's root project

        Dependencies.scala # a source file in the meta-build's root project,
                           #   that is, a source file in the build definition
                           #   the build definition for your build

        assembly.sbt       # this is part of the source code for
                           #   meta-meta-build's root project in project/project;
                           #   build definition's build definition

        project/           # base directory of meta-meta-build's root project;
                           #   the build definition project for the build definition

            MetaDeps.scala # source file in the root project of
                           #   meta-meta-build in project/project/

別擔心! 大部分時候您不需要所有這些。但是了解原理可能會有所幫助。

順帶一提:任何時候使用以 .scala.sbt 結尾的檔案時,將它們命名為 build.sbtDependencies.scala 只是慣例。這也意味著允許多個檔案。

在一個地方追蹤依賴 

使用 project 底下的 .scala 檔案會成為建置定義一部分的事實的一種方式是建立 project/Dependencies.scala,以便在一個地方追蹤依賴。

import sbt._

object Dependencies {
  // Versions
  lazy val akkaVersion = "2.6.21"

  // Libraries
  val akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion
  val akkaCluster = "com.typesafe.akka" %% "akka-cluster" % akkaVersion
  val specs2core = "org.specs2" %% "specs2-core" % "4.20.0"

  // Projects
  val backendDeps =
    Seq(akkaActor, specs2core % Test)
}

Dependencies 物件將在 build.sbt 中可用。為了更方便使用其中定義的 val,請在您的 build.sbt 檔案中匯入 Dependencies._

import Dependencies._

ThisBuild / organization := "com.example"
ThisBuild / version      := "0.1.0-SNAPSHOT"
ThisBuild / scalaVersion := "2.12.18"

lazy val backend = (project in file("backend"))
  .settings(
    name := "backend",
    libraryDependencies ++= backendDeps
  )

當您有一個正在變大的多專案建置,並且想要確保子專案具有一致的依賴時,此技術非常有用。

何時使用 .scala 檔案 

.scala 檔案中,您可以撰寫任何 Scala 程式碼,包括最上層的類別和物件。

建議的方法是在多專案 build.sbt 檔案中定義大多數設定,並使用 project/*.scala 檔案來執行任務或共用值(例如金鑰)。.scala 檔案的使用也取決於您或您的團隊對 Scala 的熟悉程度。

定義自動外掛程式 

對於更進階的使用者,組織建置的另一種方式是在 project/*.scala 中定義一次性的 自動外掛程式。透過定義觸發的外掛程式,自動外掛程式可以用作跨所有子專案注入自訂任務和命令的便捷方法。