目录
sbt 参考手册
安装
入门
sbt 的特性
其他
sbt 入门
安装 sbt
提示和注意事项
在 macOS 上安装 sbt
使用 cs 设置安装 sbt
安装 JDK
SDKMAN!
从通用包安装
从第三方包安装
Homebrew
在 Windows 上安装 sbt
使用 cs 设置安装 sbt
安装 JDK
从通用包安装
Windows 安装程序
从第三方包安装
Scoop
Chocolatey
在 Linux 上安装 sbt
使用 cs 设置安装 sbt
从 SDKMAN 安装
安装 JDK
从通用包安装
Ubuntu 和其他基于 Debian 的发行版
Red Hat Enterprise Linux 和其他基于 RPM 的发行版
Gentoo
sbt 例子
创建最小 sbt 构建
启动 sbt shell
退出 sbt shell
编译项目
代码更改时重新编译
创建源文件
运行之前的命令
获取帮助
运行您的应用程序
从 sbt shell 设置 ThisBuild / scalaVersion
将会话保存到 build.sbt
命名您的项目
重新加载构建
将 toolkit-test 添加到 libraryDependencies
运行测试
持续运行增量测试
编写测试
使测试通过
添加库依赖项
使用 Scala REPL
创建子项目
列出所有子项目
编译子项目
将 toolkit-test 添加到子项目
广播命令
使 hello 依赖于 helloCore
使用 uJson 解析 JSON
添加 sbt-native-packager 插件
重新加载并创建 .zip 分发
将您的应用程序容器化
设置版本
临时切换 scalaVersion
检查 dist 任务
批处理模式
sbt new 命令
致谢
目录结构
基本目录
源代码
sbt 构建定义文件
构建支持文件
构建产品
配置版本控制
运行
sbt shell
批处理模式
持续构建和测试
常用命令
制表符补全
sbt shell 历史记录
IDE 集成
使用 sbt 作为 Metals 构建服务器
在 VS Code 上进行交互式调试
登录到 sbt 会话
导入到 IntelliJ IDEA
使用 IntelliJ IDEA 进行交互式调试
使用 sbt 作为 IntelliJ IDEA 构建服务器(高级)
登录到 sbt 会话
使用 Neovim 作为 Metals 前端(高级)
转到定义
悬停
列出诊断信息
使用 Neovim 进行交互式调试
登录到 sbt 会话
构建定义
指定 sbt 版本
什么是构建定义?
build.sbt 如何定义设置
键
类型
内置键
自定义键
任务与设置键
列出所有可用的设置键和任务键
定义任务和设置
任务和设置的类型
sbt shell 中的键
build.sbt 中的导入
裸 .sbt 构建定义
添加库依赖项
多项目构建
多个子项目
构建范围设置
常见设置
依赖项
聚合
类路径依赖项
每个配置类路径依赖项
项目间依赖项
默认根项目
交互式浏览项目
通用代码
附录:子项目构建定义文件
任务图
术语
声明对其他任务的依赖
内联 .value 调用
检查任务
定义依赖于其他设置的任务
定义依赖于其他设置的设置
build.sbt DSL 的意义何在?
Make 简介
Rake
混合流式编程的好处
总结
作用域
关于键的完整故事
作用域轴
通过子项目轴进行作用域划分
通过配置轴进行作用域划分
通过任务轴进行作用域划分
零作用域组件
在构建定义中引用作用域
从 sbt shell 引用作用域键
sbt shell 中作用域键表示法的示例
检查作用域
何时指定作用域
构建级设置
作用域委托
追加值
追加到先前的值:+= 和 ++=
设置未定义时
基于其他键值的任务
使用依赖项追加:+= 和 ++=
作用域委托(.value 查找)
作用域委托规则
规则 1:作用域轴优先级
规则 2:任务轴委托
规则 3:配置轴搜索路径
规则 4:子项目轴搜索路径
作用域轴优先级,再次
inspect 命令列出委托
.value 查找与动态调度
库依赖项
非托管依赖项
托管依赖项
libraryDependencies 键
使用 %% 获取正确的 Scala 版本
Ivy 版本
解析器
覆盖默认解析器
每个配置的依赖项
使用插件
什么是插件?
声明插件
启用和禁用自动插件
全局插件
可用插件
自定义设置和任务
定义键
实现任务
任务的执行语义
任务依赖项的去重
清理任务
使用纯 Scala
将它们转换为插件
组织构建
sbt 是递归的
在一个地方跟踪依赖项
何时使用 .scala 文件
定义自动插件
入门总结
sbt:核心概念
高级笔记
常见问题
项目信息
sbt 的名称代表什么,为什么它不应该写成 SBT?
如何获得帮助?
如何报告错误?
我如何提供帮助?
用法
我的上一个命令没有执行,但我没有看到解释。为什么?
如何禁用输出中的 ansi 代码?
如何启动带有 sbt 项目配置(依赖项等)的 Scala 解释器(REPL)?
构建定义
:=、+= 和 ++= 方法是什么?
% 方法是什么?
ThisBuild / scalaVersion 是什么意思?
ModuleID、Project、? 是什么?
如何将文件添加到 jar 包?
如何生成源代码或资源?
如果输入文件未更改,任务如何避免重复工作?
扩展 sbt
如何添加新的依赖配置?
如何添加测试配置?
除了 run 之外,如何创建自定义运行任务?
如何表示对外部工具(例如 proguard)的依赖?
如何动态更改 sbt 的类路径?
动态类路径增强的示例
项目加载或卸载时如何采取行动?
项目加载/卸载钩子的示例
错误
在项目加载时,对未初始化设置的引用
依赖项管理
如何解决校验和错误?
我添加了一个插件,现在我的交叉编译失败了!
杂项
在哪里可以找到 1.9.8 的插件?
一般信息
致谢
社区插件
sbt 组织
社区 Ivy 存储库
从 sbt 0.13 中交叉构建插件
可用于 sbt 1.0(包括 RC-x)的插件
代码格式化插件
文档插件
一个 jar 插件
发布插件
部署集成插件
实用程序和系统插件
IDE 集成插件
测试插件
库依赖项插件
Web 和前端开发插件
数据库插件
特定于框架的插件
代码生成器插件
静态代码分析插件
代码覆盖率插件
创建新的项目插件
内部插件
验证插件
语言支持插件
社区存储库策略
Bintray 用于插件
使用 Sonatype
Sonatype 设置
sbt 设置
步骤 1:PGP 签名
步骤 2:sbt-pgp
步骤 3:凭据
步骤 4:配置 build.sbt
步骤 5:发布
可选步骤
sbt-sonatype
发布提示
与发布过程集成
为 sbt 做贡献
文档
更改
从 sbt 0.13.x 迁移
迁移案例类 .copy(...)
SbtPlugin
特定于 sbt 版本的源目录
迁移到斜杠语法
从 sbt 0.12 风格迁移
迁移 sbt 0.12 风格运算符
从元组增强迁移
使用 .dependsOn、.triggeredBy 或 .runBefore 时迁移
设置 Task 时迁移
使用 InputKey 迁移
从 Build 特性迁移
从 Resolver.withDefaultResolvers 迁移
sbt 1.4.x 版本
sbt 1.4.1
sbt 1.4.0
构建服务器协议 (BSP) 支持
如何使用 BSP 导入到 IntelliJ
如何导入到 VS Code + Metals
原生瘦客户端
ThisBuild / versionScheme
VirtualFile + RemoteCache
构建 linting
条件任务
增量构建管道
sbt-dependency-graph 已内联
具有兼容性影响的修复
其他更新
参与
sbt 1.3.x 版本
sbt 1.3.0
具有兼容性影响的更改
使用 Coursier 进行库管理
使用类加载器分层进行 Turbo 模式
IO 改进
Glob
监视改进
构建定义源监视
自定义增量任务
超级 shell
跟踪
SemanticDB 支持
print 命令
追加 Function1
JDK 11 支持
其他错误修复和改进
参与
sbt 1.2.x 版本
sbt 1.2.1
向前二进制兼容性中断
项目 Foo 引用了未知配置 bar
其他错误修复
贡献者
sbt 1.2.0
用于插件开发的 SbtPlugin
跨 JDK 分叉
scalaVersion 过滤的聚合
复合项目
项目矩阵
语义版本选择器 API
addPluginSbtFile 命令
可扩展的 sbt 服务器
瘦客户端(s)
具有兼容性影响的更改
其他错误修复和改进
内部
贡献者
sbt 1.1.x 版本
sbt 1.1.6
错误修复
贡献者
sbt 1.1.5
错误修复
改进
监视改进
VS Code 扩展更新
sbt 例子
贡献者
sbt 1.1.4
错误修复
改进
在 macOS 上触发执行
使用备用模式运行 sbt
加载性能改进
贡献者
sbt 1.1.2
错误修复
改进
内部
贡献者
sbt 1.1.1
错误修复
改进
autoStartServer 设置
贡献者
sbt 1.1.0
功能、修复、具有兼容性影响的更改
功能
修复
改进
统一的 sbt shell 和 build.sbt 斜杠语法
sbt 服务器
VS Code 扩展
使用 project/build.properties 过滤脚本测试
贡献者
sbt 1.0.x 版本
sbt 1.0.4
错误修复
增强
内部
贡献者
sbt 1.0.3
错误修复
改进
替代监视模式
贡献者
sbt 1.0.2
错误修复
内部
贡献者
sbt 1.0.1
错误修复
WatchSource
sbt 1.0.0
功能、修复、具有兼容性影响的更改
功能
修复
改进
内部
主要更改的详细信息
Zinc 1:基于类的名称哈希
Zinc API 更改
sbt 服务器:用于工具集成的 JSON API
build.sbt 的静态验证
驱逐警告演示
sbt-cross-building
CopyOptions
库管理 API 和并行工件下载
Zinc 内部存储的二进制格式
依赖项锁定
贡献者
详细主题
使用 sbt
命令行参考
关于命令行的说明
项目级任务
配置级任务
通用命令
用于管理构建定义的命令
控制台项目
描述
访问设置
示例
评估任务
示例
状态
示例
跨编译
介绍
发布惯例
使用跨编译库
使用 sbt-projectmatrix 跨编译项目
有状态地跨编译项目
根据 Scala 版本更改设置
特定于 Scala 版本的源目录
与 Java 项目跨编译
切换 Scala 版本
跨发布
覆盖发布惯例
Scala 3 特定的跨版本
更多关于使用跨编译库的信息
关于 sbt-release 的说明
与配置系统交互
选择命令、任务和设置
选择配置
特定于任务的设置
发现设置和任务
值和提供者
相关设置
依赖项
请求的依赖项
实际依赖项
委托
触发执行
编译
测试
运行多个命令
构建源代码
清除屏幕
配置
脚本模式
sbt 脚本运行器
示例
sbt 服务器
配置
语言服务器协议 3.0
服务器模式
服务器发现和身份验证
初始化请求
textDocument/publishDiagnostics 事件
textDocument/didSave 事件
sbt/exec 请求
sbt/setting 请求
sbt/completion 请求
sbt/cancelRequest
理解增量重新编译
sbt 启发式方法
如何利用 sbt 启发式方法
配置
类路径、源代码和资源
基础
非托管与托管
按名称排除源文件
外部与内部
键
示例
编译器插件支持
Continuations 插件示例
特定于版本的编译器插件示例
配置 Scala
自动管理 Scala
配置 scala-library 依赖项
配置额外的 Scala 依赖项
配置 Scala 工具依赖项
切换到本地 Scala 版本
使用本地目录中的 Scala
与托管依赖项混合
仅使用非托管依赖项
sbt s Scala 版本
分叉
启用分叉
更改工作目录
分叉的 JVM 选项
Java 主目录
配置输出
配置输入
直接使用
全局设置
基本的全局配置文件
使用全局插件的全局设置
Java 源代码
用法
混合模式编译中的已知问题
忽略 Scala 源代码目录
映射文件
相对于目录
重新定位
扁平化
替代方案
本地 Scala
宏项目
介绍
定义项目关系
通用接口
分发
路径
构建文件
路径查找器
选择后代
get
选择子级
仅现有文件
名称过滤器
组合路径查找器
过滤
空路径查找器
路径查找器到字符串转换
映射
文件过滤器
并行执行
任务排序
实际约束
背景
配置
标记任务
定义限制
内置标签和规则
自定义标签
未来工作
标记任务
分数加权
默认行为
对默认值的调整
其他特征
外部进程
用法
示例
运行项目代码
问题
System.exit
线程
反序列化和类加载
测试
基础
testOnly
testQuick
制表符补全
其他任务
输出
测试报告
选项
测试框架参数
设置和清理
禁用测试的并行执行
过滤类
分叉测试
额外的测试配置
集成测试
自定义测试配置
具有共享源代码的额外测试配置
对并行执行的应用
JUnit
扩展
自定义测试框架
自定义测试报告器
使用扩展
进程内类加载
故障排除
通配符
构建通配符
路径名称
过滤器
深度
正则表达式
使用 FileTreeView 查询文件系统
文件属性
过滤
流
实现
通配符与路径查找器
远程缓存
用法
通过 Maven 仓库进行远程缓存
ThisBuild / rootPaths
remoteCacheId
依赖项管理
工件
选择默认工件
修改默认工件
定义自定义工件
发布 .war 文件
将依赖项与工件一起使用
依赖项管理流程
背景
缓存和配置
关于 SNAPSHOT 的说明
库管理
介绍
手动依赖项管理
自动依赖项管理
内联声明
依赖项
解析器
覆盖默认解析器
覆盖所有构建的所有解析器
显式 URL
禁用传递性
分类器
排除传递性依赖项
下载源代码
额外属性
内联 Ivy XML
Ivy 主目录
校验和
冲突管理
逐出警告
覆盖版本
未解析的依赖项错误
缓存的解析
发布
配置
强制修订版(不推荐)
已知限制
代理仓库
概述
sbt 配置
~/.sbt/repositories
使用代理仓库的凭据
启动器脚本
sbt.override.build.repos
sbt.repository.config
代理 Ivy 仓库
发布
跳过发布
定义仓库
本地发布
凭据
跨发布
覆盖发布惯例
已发布的工件
修改生成的 POM
版本方案
解析器
Maven 解析器
本地 Maven 解析器
预定义的解析器
自定义解析器
基本示例
文件系统
URL
SFTP 和 SSH 仓库
自定义布局
更新报告
过滤报告和获取工件
过滤器基础
ConfigurationFilter
ModuleFilter
ArtifactFilter
DependencyFilter
缓存的解析
设置
依赖项作为图
缓存的解析
注意事项和已知问题
第一次运行
不保证 Ivy 的保真度
SNAPSHOT 和动态依赖项
动机
任务和命令
任务
介绍
功能
定义任务
Hello World 示例(sbt)
定义键
实现任务
定义基本任务
具有输入的任务
任务范围
关于优先级
分离实现
修改现有任务
从多个范围获取值
介绍
示例
ScopeFilter
未指定的过滤器
更多关于过滤器构造的信息
组合 ScopeFilters
更多操作
缺少值
从多个范围获取多个值
高级任务操作
流:每个任务日志记录
条件任务
使用 Def.taskDyn 进行动态计算
使用 Def.sequential
处理失败
failure
result
andFinally
缓存
Cache.cached
先前值
Tracked.lastOutput
Tracked.inputChanged
跟踪文件属性
FileInfo
Tracked.inputChanged
Tracked.outputChanged
Tracked.diffInputs
Tracked.diffOutputs
案例研究:sbt-scalafmt
总结
输入任务
输入键
基本输入任务定义
使用解析器的输入任务
构建解析器
构建任务
InputTask 类型
使用其他输入任务
预应用输入
从 InputTask 获取任务
命令
什么是命令?
介绍
定义命令
通用命令
无参数命令
单参数命令
多参数命令
完整示例
解析和制表符补全
基本解析器
内置解析器
组合解析器
转换结果
控制制表符补全
依赖解析器
状态和操作
与命令相关的数据
与项目相关的数据
项目数据
类路径
运行任务
在任务中使用状态
在任务中更新状态
任务/设置:动机
应用
插件和最佳实践
一般最佳实践
project/ vs. ~/.sbt/
本地设置
.sbtrc
生成的文件
不要硬编码
不要修改文件
使用绝对路径
解析器组合器
插件
使用自动插件
按描述
插件依赖项
全局插件
创建自动插件
projectSettings 和 buildSettings
实现插件依赖项
根插件和触发插件
使用 autoImport 控制导入
插件示例
用法示例
全局插件示例
在构建定义中使用库示例
1a) 手动管理
1b) 自动管理:直接编辑方法
1c) 自动管理:命令行方法
1d) 项目依赖项
2) 使用库
发布插件
最佳实践
插件最佳实践
键命名约定:使用前缀
工件命名约定
(可选) 插件命名约定
不要使用默认包
让你的插件为人所知
重用现有键
使用设置和任务。避免使用命令。
在普通的旧 Scala 对象中提供核心功能
配置建议
你可能不需要自己的配置
何时定义自己的配置
与配置和谐相处
提供原始设置和配置设置
范围建议
在 globalSettings 中提供默认值
使用主任务范围进行设置
在 globalSettings 中重新连接现有键
使用 sbt 设置 GitHub Actions
设置 project/build.properties
阅读 GitHub Actions 手册
基本设置
自定义 JVM 选项
缓存
构建矩阵
示例 .github/workflows/ci.yml 设置
sbt-github-actions
使用 sbt 设置 Travis CI
设置 project/build.properties
阅读 Travis 手册
基本设置
插件构建设置
自定义 JVM 选项
缓存
构建矩阵
通知
处理不稳定的网络或测试
更多内容
示例设置
测试 sbt 插件
scripted 测试框架
步骤 1:快照
步骤 2:SbtPlugin
步骤 3:src/sbt-test
步骤 4:编写脚本
步骤 5:运行脚本
步骤 6:自定义断言
步骤 7:测试测试
步骤 8:获得灵感
sbt new 和模板
尝试新命令
Giter8 支持
Giter8 参数
如何创建 Giter8 模板
为模板许可使用 CC0 1.0
如何扩展 sbt new
模板解析器
templateResolverInfos
跨编译插件
在构建中混合库和 sbt 插件
如何…
类路径
在类路径上包含新类型的托管工件,例如 mar
获取用于编译的类路径
获取运行时类路径,包括项目的已编译类
获取测试类路径,包括项目的已编译测试类
在类路径上使用打包的 jar 而不是类目录
获取配置的所有托管 jar
获取类路径中包含的文件
获取生成类路径条目的模块和工件
自定义路径
更改默认 Scala 源代码目录
更改默认 Java 源代码目录
更改默认资源目录
更改默认的(非托管)库目录
禁用使用项目的基本目录作为源代码目录
添加额外的源代码目录
添加额外的资源目录
在源代码目录中包含/排除文件
在资源目录中包含/排除文件
仅包含某些(非托管)库
生成文件
生成源代码
生成资源
检查构建
显示或搜索命令、任务或设置的帮助信息
列出可用任务
列出可用设置
显示设置/任务依赖关系树
显示设置或任务的描述和类型
显示设置或任务的委托链
显示相关设置或任务
显示项目和构建列表
显示当前会话(临时)设置
显示有关 sbt 和当前构建的基本信息
显示设置的值
显示执行任务的结果
显示用于编译或测试的类路径
显示在项目中检测到的主类
显示在项目中检测到的测试类
交互模式
使用 Tab 键自动完成
显示更多 Tab 键自动完成建议
修改默认的 JLine 键绑定
配置提示字符串
使用历史记录
更改交互式历史文件的位置
对所有项目使用相同的历史记录
禁用交互式历史记录
在进入交互模式之前运行命令
配置和使用日志记录
查看先前执行命令的日志输出
查看特定任务的先前日志输出
显示先前编译的警告
全局更改日志记录级别
更改特定任务、配置或项目的日志记录级别
配置堆栈跟踪的打印
立即打印测试输出,而不是缓冲
添加自定义记录器
在任务中记录消息
在设置中记录消息
项目元数据
设置项目名称
设置项目版本
设置项目组织
设置项目主页和其他元数据
配置打包
在类路径中使用打包的 jar 文件,而不是类目录
添加清单属性
更改包的文件名
修改包的内容
运行命令
在批处理模式下将参数传递给命令或任务
提供多个命令以连续运行
从文件读取命令
为命令或任务定义别名
快速评估 Scala 表达式
配置和使用 Scala
设置用于构建项目的 Scala 版本
禁用对 Scala 库的自动依赖
暂时切换到其他 Scala 版本
使用本地 Scala 安装来构建项目
针对多个 Scala 版本构建项目
在 Scala REPL 中使用项目的依赖项在类路径中,但不包括已编译的项目类
在 Scala REPL 中使用项目的依赖项和已编译的代码在类路径中
在 Scala REPL 中使用插件和构建定义在类路径中
定义在进入 Scala REPL 时评估的初始命令
定义在退出 Scala REPL 时评估的命令
从项目代码中使用 Scala REPL
生成 API 文档
选择 javadoc 或 scaladoc
独立于编译设置用于生成 scaladoc 的选项
将 scaladoc 的选项添加到编译选项
独立于编译设置用于生成 javadoc 的选项
将 javadoc 的选项添加到编译选项
启用对托管依赖项的外部 Scaladoc 的自动链接
启用对托管依赖项的外部 Scaladoc 的手动链接
定义库的 API 文档的位置
定义自定义任务
定义一个在特定子项目中运行测试的任务
如何在启动时执行操作
跟踪文件输入和输出
文件输入
增量构建
文件输出
过滤器
清除输出
文件变更跟踪
持续构建文件监控
部分管道评估/错误处理
排查内存问题
排序
使用 Def.sequential 定义顺序任务
project/build.properties
project/style.sbt
build.sbt
使用 Def.taskDyn 定义动态任务
project/build.properties
project/style.sbt
build.sbt v1
build.sbt v2
在输入任务之后执行操作
src/main/scala/Greeting.scala
build.sbt v1
build.sbt v2
使用 Def.inputTaskDyn 定义动态输入任务
build.sbt v1
build.sbt v2
如何使用命令进行排序
如何定义自定义依赖项配置
有关自定义依赖项配置的注意事项
基本自定义配置示例
project/FuzzPlugin.scala
build.sbt
沙盒配置示例
project/ScalafmtPlugin.scala
如何添加测试配置?
示例
.sbt 构建示例
.sbt 构建(包含 .scala 文件)示例
project/Resolvers.scala
project/Dependencies.scala
project/ShellPromptPlugin.scala
build.sbt
高级配置示例
高级命令示例
索引
值和类型
依赖项管理
设置和任务
构建结构
方法
设置和任务
文件和 IO
依赖项管理
解析
开发者指南(正在进行中)
面向 sbt 1.0
概念
构建定义的源代码兼容性
插件的二进制兼容性
模块化
模块摘要
IO API ( sbt/io )
序列化 API ( sbt/serialization )
实用程序 API ( sbt/util )
库管理 API ( sbt/librarymanagement )
增量编译器 API ( sbt/zinc )
构建 API (待定)
sbt 启动器 ( sbt/launcher )
客户端/服务器 (待定)
网站 ( sbt/website )
sbt 编码规范
总体目标
清理旧的弃用
目标是零警告(除了弃用)
文档
模块化设计
目标小
公共 API 应针对接口进行编码
隐藏实现细节
更少的相互依赖
隐藏外部类
隐藏内部模块
编译器标志
包名和组织名
二进制弹性
MiMa
公共特征应仅包含 def 声明
抽象类也很有用
密封特征和抽象类
完成叶类
类型类和子类继承
避免使用 case 类,使用 sbt-datatype
优先使用方法重载而不是默认参数值
其他公共 API 事项
避免使用字符串类型的编程
避免过度使用 def apply
使用特定数据类型 ( Vector , List 或 Array ),而不是 Seq
避免对 Set 调用 toSeq 或任何具有副作用的操作
避免对 Map 调用 toSeq
如果需要 Java 互操作性,请避免在签名中使用函数和元组
风格很重要
使用 scalafmt
避免使用过程语法
尽可能在伴随对象中定义类型类的实例
用于语法的隐式转换(增强我的库模式)应导入
sbt-datatype
使用插件
数据类型模式
记录
接口
枚举
使用数据类型来保留二进制兼容性
JSON 编解码器生成
协议、记录等的现有参数
设置
语法摘要
编译器接口
获取最具体的源代码
sbt 启动器
sbt 启动器入门
概述
应用程序
服务器
解析应用程序/服务器
创建已启动的应用程序
运行应用程序
执行
Sbt 启动器架构
模块解析
类加载器缓存和隔离
缓存
锁定
服务发现和隔离
sbt 启动器配置
示例
1. Scala 配置
2. 应用程序标识
3. 存储库部分
4. 引导部分
5. Ivy 部分
6. 服务器部分
变量替换
语法
注释
核心原则
构建状态简介
设置架构
任务架构
设置核心
示例
设置
设置系统示例
使用示例
sbt 设置讨论
作用域
构建设置
设置定义
设置初始化
使用 sbt 创建命令行应用程序
Hello World 示例
构建定义:build.sbt
应用程序:Main.scala
启动器配置文件:hello.build.properties
存档页面
Hello, World
sbt new 命令
运行你的应用程序
退出 sbt shell
构建定义
内容深入
组合页面
学习
下载
参与