SBT构建文件的说明

时间:2018-04-18 03:42:34

标签: scala sbt

问题

.sbt文件是scala还是sbt专有语言?请帮助破译sbt构建定义。

lazy val root = <--- Instance of the SBT Project object? Why "lazy"? Is "root" the reserved keyword for sbt to identify the project in the build.sbt?
    (project in file("."))  <--- Is this defining a Project object regarding the current directory having the SBT expected project structure?
    .settings(              <--- Is this a scala function call of def settings in the Project object?
        name := "NQueen",
        version := "1.0",
        scalaVersion := "2.11.8",
        mainClass in Compile := Some("NQueen")        
    )

libraryDependencies ++= Seq(  <--- libraryDependencies is a reserved keyword of type scala.collection.Seq using which sbt downloads and packages them as part of the output jar?
    "org.apache.spark" %% "spark-core" % "2.3.0",  <--- Concatenating and creating the full library name including version. I suppose I need to look into respective documentations to find out what to specify. 
    "org.apache.spark" %% "spark-mllib" % "2.3.0"
)

// <--- Please explain what this block does and where I can find the explanations.
assemblyMergeStrategy in assembly := {
 case PathList("META-INF", xs @ _*) => MergeStrategy.discard
 case x => MergeStrategy.firs
}

资源

请提供良好的资源来了解设计,机制以及.sbt的工作原理。我查看了SBT入门和文档但是作为Scala定义本身,很难理解。如果是make,ant或maven,那么事情如何拼凑在一起,设计/机制如此清晰,但需要为SBT找到好的文档或教程。

参考

我查看了下面的参考资料,试图理解。

1 个答案:

答案 0 :(得分:1)

对于初次使用的用户来说,这可能非常困难,而且不能完全理解所有的定义。随着时间的推移,它会变得更加清晰。

让我先简化一下build.sbt。它包含一些不必要的部分,没有它们将更容易解释

name := "NQueen"
version := "1.0"
scalaVersion := "2.11.8"
mainClass in Compile := Some("NQueen")        

libraryDependencies ++= Seq(  
    "org.apache.spark" %% "spark-core" % "2.3.0", 
    "org.apache.spark" %% "spark-mllib" % "2.3.0"
)

assemblyMergeStrategy in assembly := {
 case PathList("META-INF", xs @ _*) => MergeStrategy.discard
 case x => MergeStrategy.firs
} 

并提出您的问题:

  

.sbt文件是scala还是sbt专有语言?

嗯,这两者都是。您可以在.sbt文件中执行大多数scala操作。您可以导入和使用外部依赖项,编写自定义代码等。但您可以执行某些操作(例如,定义类)。
它也可能看起来像一种专用的不同语言,但实际上,它只是用scala编写的DSL(:=in%%,{{ 1}}都是用scala编写的函数)

  

libraryDependencies是scala.collection.Seq类型的保留关键字,使用sbt下载并将它们打包为输出jar的一部分?

%不是保留关键字。您可以将其视为配置项目的一种方式 写libraryDependencies你基本上设置了libraryDependencies := Seq(..)的值 但你的意思是正确的。它是应该下载的依赖项列表。

  

连接并创建包含版本的完整库名称。我想我需要查看相应的文档以找出要指定的内容。

请注意,libraryDependencies%%是函数。您可以使用这些函数指定应下载哪些模块并添加到类路径中 你可以在mvnrepository中找到许多依赖项(及其版本) 例如,对于spark:https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.11/2.3.0

  

请解释这个区块的作用以及我可以在哪里找到解释。

%是来自sbt-assembly插件的设置 该插件允许您将应用程序打包到具有所有依赖项的单个jar中 你可以在这里阅读合并策略:https://github.com/sbt/sbt-assembly#merge-strategy