1. sbt 启动器配置

sbt 启动器配置 

启动器可以通过以下几种方式进行配置,按优先级递增排列

  • 替换启动器 jar 中的 /sbt/sbt.boot.properties 文件
  • 在类路径中放置一个名为 sbt.boot.properties 的配置文件。将它放在类路径的根目录中,没有 /sbt 前缀。
  • 在命令行中指定备用配置的位置,可以是路径或绝对 URI。可以通过将位置指定为系统属性 sbt.boot.properties 或作为以 @ 为前缀的启动器的第一个参数来实现。系统属性的优先级较低。对相对路径的解析首先尝试针对当前工作目录,然后针对用户的 home 目录,最后针对包含启动器 jar 的目录进行解析。

如果所有这些尝试都失败,则会生成错误。

示例 

sbt 作为应用程序的默认配置文件如下所示

[scala]
  version: ${sbt.scala.version-auto}

[app]
  org: ${sbt.organization-org.scala-sbt}
  name: sbt
  version: ${sbt.version-read(sbt.version)[0.13.5]}
  class: ${sbt.main.class-sbt.xMain}
  components: xsbti,extra
  cross-versioned: ${sbt.cross.versioned-false}

[repositories]
  local
  typesafe-ivy-releases: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
  maven-central
  sonatype-snapshots: https://oss.sonatype.org/content/repositories/snapshots

[boot]
  directory: ${sbt.boot.directory-${sbt.global.base-${user.home}/.sbt}/boot/}

[ivy]
  ivy-home: ${sbt.ivy.home-${user.home}/.ivy2/}
  checksums: ${sbt.checksums-sha1,md5}
  override-build-repos: ${sbt.override.build.repos-false}
  repository-config: ${sbt.repository.config-${sbt.global.base-${user.home}/.sbt}/repositories}

让我们详细了解所有启动器配置部分

1. Scala 配置 

[scala] 部分用于配置 Scala 的版本。它包含一个属性

  • version - 应用程序使用的 Scala 版本,如果应用程序不是跨版本,则为 auto
  • classifiers - 要解析的额外 Scala 工件(可选)的列表,例如源代码。

2. 应用程序标识 

[app] 部分配置启动器将如何使用 Ivy 依赖项管理器查找您的应用程序。它包含以下属性

  • org - 与 Ivy 模块关联的组织。(Maven 术语中的 groupId
  • name - Ivy 模块的名称。(Maven 术语中的 artifactId
  • version - Ivy 模块的版本。
  • class - 应用程序的“入口点”的名称。入口点必须是满足以下条件之一的类

    • 扩展 xsbti.AppMain 接口。
    • 扩展 xsbti.ServerMain 接口。
    • 包含具有签名 static void main(String[]) 的方法
    • 包含具有签名 static int main(String[]) 的方法
    • 包含具有签名 static xsbti.Exit main(String[]) 的方法
  • components - Ivy 应该解析的额外组件(可选)的列表。
  • cross-versioned - 一个可选字符串,表示此应用程序如何发布。如果 app.cross-versioned 为 binary,则解析的模块 ID 为 {app.name+'_'+CrossVersion.binaryScalaVersion(scala.version)}。如果 app.cross-versionedtruefull,则解析的模块 ID 为 {app.name+'_'+scala.version}。当跨版本时,scala.version 属性必须指定且不能为 auto
  • resources - 应该添加到应用程序类路径的 jar 文件(可选)的列表。
  • classifiers - 应该与此应用程序一起解析的额外分类器(可选)的列表,例如源代码。

3. 仓库部分 

[repositories] 部分配置 Ivy 将在哪里以及如何查找您的应用程序。每行表示 Ivy 将查找的仓库。

  • 注意:此部分配置了 Ivy 将查找的默认位置,但可以通过用户配置进行覆盖。*

有几个内置字符串可用于常见仓库

  • local - 本地 Ivy 仓库 ~/.ivy2/local
  • maven-local - 本地 Maven 仓库 ~/.m2/repository
  • maven-central - Maven Central 仓库 repo1.maven.org

除了内置仓库之外,还可以使用以下语法配置其他仓库

name: url(, pattern)(,bootOnly)(,descriptorOptional)(,skipConsistencyCheck)(,allowInsecureProtocol)

name 属性是一个标识符,Ivy 使用它来缓存从此位置解析的模块。name 在所有仓库中都应该是唯一的。

url 属性是 Ivy 应该查找模块的基 url

pattern 属性是 Ivy 应该查找模块的可选方式规范。默认情况下,启动器假设仓库采用 maven 风格的格式。

bootOnly 字符串用于告诉 Ivy 仅在启动期间使用此仓库。即查找 sbt 自己的 JAR 和任何插件的 JAR。具有 bootOnly 字符串的仓库不会用于构建时依赖解析。

skipConsistencyCheck 字符串用于告诉 Ivy 不要验证它解析的文件的校验和和签名。

allowInsecureProtocol 字符串告诉 SBT 不要输出关于此仓库为 http:// 的警告。在使用 HTTP 仓库之前请仔细考虑,因为它们可能会带来重大的安全风险

4. 启动部分 

[boot] 部分用于配置 sbt 启动器将在哪里存储其缓存和配置信息。它包含以下属性

  • directory - 此处定义的目录用于存储启动器解析的所有缓存的 JAR。
  • properties - (可选)用于任何 read 变量的属性文件。

5. Ivy 部分 

[ivy] 部分用于配置 Ivy 依赖项管理器以解析应用程序。它包含以下属性

  • ivy-home - Ivy 的主目录。这决定了 ivy-local 仓库的位置,以及 Ivy 缓存的存储位置。默认为 ~/.ivy2
  • checksums - Ivy 应该用来验证工件是否正确解析的校验和的逗号分隔列表,例如 md5 或 sha1。
  • override-build-repos - 如果设置了此选项,则 xsbti.Launcher 接口上的 isOverrideRepositories 方法将返回其值。此方法的使用是特定于应用程序的,但在 sbt 的情况下,它表示启动器中仓库的配置应该覆盖任何构建使用的仓库。如果可以,应用程序应该尊重此约定。
  • repository-config - 这指定了一个配置位置,Ivy 仓库也可以在那里进行配置。如果此文件存在,则其内容将覆盖 [repositories] 部分。

6. 服务器部分 

当使用启动器的 --locate 功能时,此部分配置服务器的启动方式。它包含以下属性

  • lock - 控制对正在运行的服务器的访问的文件。此文件将包含服务器使用的活动端口,并且必须位于支持锁定的文件系统上。
  • jvmargs - 包含在启动服务器时使用的以换行符分隔的 JVM 参数的文件。
  • jvmprops - 一个属性文件的路径,它将定义服务器中的覆盖属性。此文件中定义的所有属性都将设置为 -D Java 属性。

变量替换 

属性值可以包含变量替换。变量替换采用以下形式之一

  • ${variable.name}
  • ${variable.name-default}

其中 variable.name 是系统属性的名称。如果存在该名称的系统属性,则会替换其值。如果不存在,并且指定了默认值,则在递归地替换默认值中的变量后,将替换默认值。如果系统属性不存在且未指定默认值,则不会替换原始字符串。

还有一种特殊的变量替换

read(property.name)[default]

它将在 boot.properties 配置的文件中查找值。如果未配置 boot.properties 文件或属性不存在,则选择默认值。

语法 

配置文件基于行,以 UTF-8 编码读取,并由以下语法定义。'nl' 是换行符或文件结尾,'text' 是不包含换行符或周围分隔符(如括号或方括号)的纯文本

configuration: scala app repositories boot log appProperties
scala: "[" "scala" "]" nl version nl classifiers nl
app: "[" "app" "]" nl org nl name nl version nl components nl class nl crossVersioned nl resources nl classifiers nl
repositories: "[" "repositories" "]" nl (repository nl)*
boot: "[" "boot" "]" nl directory nl bootProperties nl search nl promptCreate nl promptFill nl quickOption nl
log: "[" "log" "]" nl logLevel nl
appProperties: "[" "app-properties" "]" nl (property nl)*
ivy: "[" "ivy" "]" nl homeDirectory nl checksums nl overrideRepos nl repoConfig nl
directory: "directory" ":" path
bootProperties: "properties" ":" path
search: "search" ":" ("none" | "nearest" | "root-first" | "only" ) ("," path)*
logLevel: "level" ":" ("debug" | "info" | "warn" | "error")
promptCreate: "prompt-create"  ":"  label
promptFill: "prompt-fill" ":" boolean
quickOption: "quick-option" ":" boolean
version: "version" ":" versionSpecification
versionSpecification: readProperty | fixedVersion
readProperty: "read"  "(" propertyName ")"  "[" default "]"
fixedVersion: text
classifiers: "classifiers" ":" text ("," text)*
homeDirectory: "ivy-home" ":" path
checksums: "checksums" ":" checksum ("," checksum)*
overrideRepos: "override-build-repos" ":" boolean
repoConfig: "repository-config" ":" path
org: "org" ":" text
name: "name" ":" text
class: "class" ":" text
components: "components" ":" component ("," component)*
crossVersioned: "cross-versioned" ":"  ("true" | "false" | "none" | "binary" | "full")
resources: "resources" ":" path ("," path)*
repository: ( predefinedRepository | customRepository ) nl
predefinedRepository: "local" | "maven-local" | "maven-central"
customRepository: label ":" url [ ["," ivyPattern] ["," artifactPattern] [", mavenCompatible"] [", bootOnly"]]
property: label ":" propertyDefinition ("," propertyDefinition)*
propertyDefinition: mode "=" (set | prompt)
mode: "quick" | "new" | "fill"
set: "set" "(" value ")"
prompt: "prompt"  "(" label ")" ("[" default "]")?
boolean: "true" | "false"
nl: "\r\n" | "\n" | "\r"
path: text
propertyName: text
label: text
default: text
checksum: text
ivyPattern: text
artifactPattern: text
url: text
component: text