• sbt:构建工具


    官方中文文档,看到:https://www.scala-sbt.org/1.x/docs/zh-cn/Appending-Values.html

    资料 网址
    官方中文文档 https://www.scala-sbt.org/1.x/docs/zh-cn/Getting-Started.html

    ===

    sbt 常用命令 说明
    help <命令> 显示指定的命令的详细帮助信息。如果没有指定命令,会显示所有命令的简介。
    sbt 执行 sbt 不跟任何命令行参数将会进入交互模式
    package 将 src/main/resources 下的文件和 src/main/scala 以及 src/main/java 中编译出来的 class 文件打包成一个 jar 文件。
    compile
    sbt run 运行项目
    exit
    sbt console 进入 Scala REPL
    reload 重新加载构建定义(build.sbt, project/.scala, project/.sbt 这些文件中定义的内容)。在修改了构建定义文件之后需要重新加载。

    如何在 build.sbt 中定义设置:https://www.scala-sbt.org/1.x/docs/zh-cn/Basic-Def.html

    这些表达式可以用 val,lazy val,def 声明。 build.sbt 不允许使用顶层的 object 和 class。它们必须写到 project/ 目录下作为完整的 Scala 源文件。

    键(Keys)有一个返回 Setting[T] 的 := 方法。你可以像使用 Java 的语法一样调用该方法:

    lazy val root = (project in file("."))
      .settings(
        name.:=("hello")
      )
    

    但是,Scala 允许 name := "hello" 这样调用(在 Scala 中,一个只有单个参数的方法可以使用任何一种语法调用)。

    内置的 keys 实际上是对象 Keys 的字段。build.sbt 会隐式包含 import sbt.Keys._,所以可以通过 name 取到 sbt.Keys.name。

    vals 和 defs 必须以空行和设置(settings)分隔。

    注意: 通常,使用 lazy val 而不是 val 可以避免初始化顺序的问题。
    Scala 中使用 val 语句可以定义函数,def 语句定义方法。( https://www.runoob.com/scala/scala-functions.html

    sbt 描述项目的 map 会将设置(setting)保存为固定的字符串,比如像 name;但是它不得不保存 task 的可执行代码,比如 compile — 即使这段可执行的代码最终返回一个字符串,它也需要每次都重新执行。

    Tasks 和 Settings 的类型:
    从类型系统的角度来讲,通过 task key 创建的 Setting 和通过 setting key 创建的 Setting 有稍微不同。taskKey := 42 的类型是 Setting[Task[T]] 而 settingKey := 42 的类型是 Setting[T]。这对于绝大多数情况并无影响;task key 在执行的时候仍然创建一个类型为 T 的值(value)。
    T 类型和 Task[T] 类型的不同的含义是:一个 setting 不能依赖一个 task,因为一个 setting 只会在项目加载的时候计算一次,不会重新计算。

    sbt 交互模式中的 Keys:
    在 sbt 的交互模式下,你可以输入任何 task 的 name 来执行该 task。这就是为什么输入 compile 就是执行 compile task。compile 就是该 task 的 key。
    如果你输入的是一个 setting key 的 name 而不是一个 task key 的 name,setting key 的值(value)会显示出来。输入一个 task key 的 name 会执行该 task 但是不会显示执行结果的值(value);输入 show 而不是 简单的 可以看到该 task 的执行结果。对于 key name 的一个约定就是使用 camelCase,这样命令行里的 name 和 Scala 的标识符就一样了。
    了解更多关于任何 key 内容,可以在 sbt 交互模式的命令行里输入 inspect 。虽然 inspect 显示的一些信息没有意义,但是在顶部会显示 setting 的 value 的类型和 setting 的简介。

    build.sbt 中的引入:
    你可以将 import 语句放在 build.sbt 的顶部;它们可以不用空行分隔。
    下面是一些默认的引入:

    import sbt._
    import Keys._
    

    另外,如果你有 .scala 文件,这些文件中任何 Build 对象或者 Plugin 对象里的内容都会被引入。

    任务图:https://www.scala-sbt.org/1.x/docs/zh-cn/Task-Graph.html

    声明对其他任务的依赖:
    在 build.sbt DSL中,我们使用 .value method 来表示对另一个任务或 setting 的依赖性。 value method 是特殊的,只能在 := 的参数中调用(或 += 或 ++= )。
    .value 不是正常的 Scala method 调用。 build.sbt DSL 使用宏将它们提升到任务主体之外。 在任务引擎评估 scalacOptions 的打开 ,无论它出现在主体中的哪一行, update 和 clean 任务都已完成。

    Scope (https://www.scala-sbt.org/1.x/docs/zh-cn/Scopes.html#使用+scoped+key+标识的例子)

    {.}/test:fullClasspath 将构建为 {.} 的 project 轴设置为全局构建。{.} 可以在 Scala 代码中写成 ThisBuild。

    Keys 会调用一个重载的 in 方法设置 scope。传给 in 方法的参数可以是任何 scope 轴的实例。比如说,你可以将 name 局限在 Compile configuration 中,尽管没有真实的理由要这样做:
    name in Compile := "hello"
    或者你可以把 name 局限在 packageBin task 中(没有什么意义!仅仅是个例子):
    name in packageBin := "hello"
    或者你可以把 name 局限在多个 scope 轴中,例如在 Compile configuration 的 packageBin task 中:
    name in (Compile, packageBin) := "hello"
    或者你可以用 Global 表示所有的轴:
    name in Global := "hello"
    (name in Global 隐式的把 scope 轴的值 Global 转换为 scope 所有轴的值均为 Global;task 和 configuration 默认是 Global,因此这里的效果是将 project 设置成 Global, 也就是说,定义了 /:name 而不是 {file:/home/hp/checkout/hello/}default-aea33a/*:name)
    如果你之前不熟悉 Scala,提醒一下:in 和 := 仅仅是方法,不是魔法,理解这点很重要。Scala 让你用一种更好的方式编写它们,但是你也可以用 Java 的风格:
    name.in(Compile).:=("hello")
    毫无理由使用这种丑陋的语法,但是它阐明这实际上是方法。

    如果一个 key 通常的作用域有问题,你需要指定 scope。例如,compile task 默认是在 Compile 和 Test configuration 的 scope 中,而且在这些 scope 之外它并不存在。

    为了改变 key compile 的值,你需要写成 compile in Compile 或者 compile in Test。用普通的 compile 会在当前 project 的 scope 中定义一个新的 task,而不是覆盖 configuration 的 scope 标准的 compile task。

    如果你遇到像 “引用未定义的设置” 这样的错误,通常是你指定 scope 失败了,或者你指定了一个错误的 scope。你使用的 key 可能定义在其他的 scope 中。sbt 会尝试在错误消息里面提示你的想法是什么;如 “你是指 compile:compile?”

    一种方式是你可以这样认为,name 只是 key 的 一部分。实际上,所有的 key 都有 name 和 scope 组成(scope 有三个轴)。换句话说,packageOptions in (Compile, packageBin) 是表示 key name 的完整的表达式。 其简写 packageOptions 也是一个 key name,但是是不同的(对于没有 in 方法的 key,会隐式的假设一个 scope:当前的 project,global config,global task)。

  • 相关阅读:
    JavaSE学习笔记(二十六)—— IO流概述&字节流
    JavaSE学习笔记(二十五)—— File类
    JavaSE学习笔记(二十四)—— 异常
    JavaSE学习笔记(二十三)—— Collections工具类
    JavaSE学习笔记(二十二)—— Map集合
    JavaSE学习笔记(二十一)—— Set集合
    Gin框架
    Go gRPC Hello World
    Go
    Gin框架
  • 原文地址:https://www.cnblogs.com/cag2050/p/13821032.html
Copyright © 2020-2023  润新知