1. sbt new 和模板

sbt new 和模板 

sbt 0.13.13 添加了一个名为 new 的新命令,用于从模板创建新的构建定义。new 命令可以通过称为 模板解析器 的机制进行扩展。

尝试 new 命令 

首先,您需要 sbt 的启动器版本 0.13.13 或更高版本。通常,sbt 启动器的确切版本并不重要,因为它将使用 project/build.properties 中的 sbt.version 指定的版本;但是,对于新的 sbt 启动器 0.13.13 或更高版本是必需的,因为该命令在没有 project/build.properties 的情况下起作用。

接下来,运行

$ sbt new scala/scala-seed.g8
....
name [hello]:

Template applied in ./hello

这使用 Giter8 运行了模板 scala/scala-seed.g8,提示输入“name”的值(默认值为“hello”,我们接受了按 [Enter]),并在 ./hello 下创建了一个构建。

scala-seed 是“最小”Scala 项目的官方模板,但它绝对不是唯一的模板。

Giter8 支持 

Giter8 是一个模板项目,最初由 Nathan Hamblen 在 2010 年启动,现在由 foundweekends 项目维护。Giter8 的独特之处在于它使用 GitHub(或任何其他 git 仓库)来托管模板,因此它允许任何人参与模板创建。以下是一些官方来源提供的模板

有关更多信息,请参阅 Giter8 wiki 上的 Giter8 模板。sbt 通过随附 Giter8 模板解析器,为 Giter8 模板提供开箱即用的支持。

Giter8 参数 

您可以在命令的末尾追加 Giter8 参数,例如,要指定特定分支,可以使用

$ sbt new scala/scala-seed.g8 --branch myBranch

如何创建 Giter8 模板 

有关如何创建新的 Giter8 模板的详细信息,请参阅 创建自己的模板

$ sbt new foundweekends/giter8.g8

使用 CC0 1.0 进行模板许可 

我们建议使用 CC0 1.0 对软件模板进行许可,该许可放弃所有版权和相关权利,类似于“公共领域”。

如果您居住在伯尔尼公约涵盖的国家/地区,例如美国,版权将在未经注册的情况下自动产生。因此,如果您不声明许可条款,人们将没有法律权利使用您的模板。棘手的是,即使是 MIT 许可和 Apache 许可等宽松许可也需要在模板用户的软件中对您的模板进行归属。为了消除对模板片段的所有权利主张,请在 CC0 下分发它,CC0 是公共领域的国际等效项。

License
-------
Written in <YEAR> by <AUTHOR NAME> <AUTHOR E-MAIL ADDRESS>
[other author/contributor lines as appropriate]
To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see <https://creativecommons.org/publicdomain/zero/1.0/>.

如何扩展 sbt new 

本页的其余部分解释了如何扩展 sbt new 命令以提供对 Giter8 模板以外事物的支持。如果您不感兴趣扩展 new,您可以跳过此部分。

模板解析器 

模板解析器是一个偏函数,它查看 sbt new 之后的参数,并确定它是否可以解析为特定模板。这类似于 resolvers 从 Internet 解析 ModuleID

Giter8TemplateResolver 采用第一个不以连字符(-)开头的参数,并检查它是否看起来像 GitHub 仓库或以“.g8”结尾的 git 仓库。如果它与其中一个模式匹配,它将把参数传递给 Giter8 进行处理。

要创建您自己的模板解析器,请创建一个库,该库具有 template-resolver 作为依赖项

val templateResolverApi = "org.scala-sbt" % "template-resolver" % "0.1"

并扩展 TemplateResolver,该解析器定义为

package sbt.template;

/** A way of specifying template resolver.
 */
public interface TemplateResolver {
  /** Returns true if this resolver can resolve the given argument.
   */
  public boolean isDefined(String[] arguments);
  /** Resolve the given argument and run the template.
   */
  public void run(String[] arguments);
}

将库发布到 sbt 社区仓库或 Maven Central。

templateResolverInfos 

接下来,创建一个 sbt 插件,将 TemplateResolverInfo 添加到 templateResolverInfos

import Def.Setting
import Keys._

/** An experimental plugin that adds the ability for Giter8 templates to be resolved
 */
object Giter8TemplatePlugin extends AutoPlugin {
  override def requires = CorePlugin
  override def trigger = allRequirements

  override lazy val globalSettings: Seq[Setting[_]] =
    Seq(
      templateResolverInfos +=
        TemplateResolverInfo(ModuleID("org.scala-sbt.sbt-giter8-resolver", "sbt-giter8-resolver", "0.1.0") cross CrossVersion.binary,
          "sbtgiter8resolver.Giter8TemplateResolver")
    )
}

这种间接性允许模板解析器拥有与构建的其余部分独立的类路径。