我正在尝试使用新的 sbt 0.13 ( ) 建立一个多项目build.sbt
。lazy val
的名称决定子项目名称的想法对我来说听起来很奇怪。此外,我没有得到连字符,而是以驼峰式结尾:
lazy val myprojectCore = project
当我列出> projects
时,我看到了myprojectCore
。我怎样才能做到这一点myproject-core
?
name
还有,现在钥匙的用途和关系是什么?
我猜推荐的方法是使用驼峰式大小写来统一 Scala 标识符。
我没有关于偏好的确凿证据,但是project
从左侧获取变量名的事实以及在 shell 中设置键也使用驼峰式大小写的事实让我这么认为。sbt、Maven 和 scala 项目之间的关系相当复杂。尽管为进行 sbt 构建付出了很多努力,但 scala/scala 项目始终使用 Ant 进行构建。在任何情况下,Maven 工件都应该是连字符的,为此您可以使用name
key.
我可以写:
val scalaxbPlugin = project.in(file("sbt-scalaxb")).
settings(commonSettings: _*).
settings(
sbtPlugin := true,
name := "sbt-scalaxb",
description := """sbt plugin to run scalaxb"""
).
dependsOn(app)
这是我以前的:
val scalaxbPlugin = Project("sbt-scalaxb", file("sbt-scalaxb")).
settings(commonSettings: _*).
settings(
sbtPlugin := true,
description := """sbt plugin to run scalaxb"""
).
dependsOn(app)
以前的答案几乎完全确定了它,但确实需要在字里行间阅读以了解其要点。
我使用 sbt 0.13.1
。
让我们从查阅 sbt 的源代码开始。
来自sbt.Project
(带有一些格式):
/**
* Creates a new Project.
* This is a macro that expects to be assigned directly to a val.
* The name of the val is used as the project ID and
* the name of the base directory of the project.
*/
def project: Project = macro Project.projectMacroImpl
宏的project
实现与 scaladoc 所说的差不多。它解析为以下代码,其中project-name
是项目的名称。
Project([project-name], new File([project-name]))
因此,无论 Scala 本身接受什么,都可以作为项目名称。
关于name
设定。
来自sbt.Keys
:
val name = SettingKey[String]("name", "Project name.", APlusSetting)
在sbt.Defaults
'projectCore
方法中:
name := thisProject.value.id
和
val thisProject = SettingKey[ResolvedProject]("this-project",
"Provides the current project for the referencing scope.", CSetting)
它应该让您了解project
宏如何影响项目名称,反之亦然。
鉴于以下情况build.sbt
:
lazy val `hey-hoo` = project in file(".")
在一个目录中,sbt 控制台给出:
jacek:~/sandbox/stackoverflow/proj1
$ sbt
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/stackoverflow/proj1/project
[info] Set current project to hey-hoo (in build file:/Users/jacek/sandbox/stackoverflow/proj1/)
[hey-hoo]> show this-project
[info] Project(id: hey-hoo, base: /Users/jacek/sandbox/stackoverflow/proj1, aggregate: List(), dependencies: List(), configurations: List(compile, runtime, test, provided, optional))
[hey-hoo]> show name
[info] hey-hoo
[hey-hoo]> projects
[info] In file:/Users/jacek/sandbox/stackoverflow/proj1/
[info] * hey-hoo
如果有人现在正在寻找这个,使用 sbt1.x
系列我们可以执行以下操作。
lazy val myprojectCore = project.withId("myproject-core")
一种可能:
lazy val `myproject-core` = project
但这是这样做的方法吗?
我有一个类似的项目结构并创建了项目/Build.scala。我将在下面包含我的完整文件。请注意 id="mod-overlay" 等设置。这些结果对我来说如下:
> projects
[info] In file:/Users/randolph.kahle/development/source/stash/arch/overlays/
[info] * arch-overlay
[info] mod-overlay
[info] mod-overlay-doc
[info] mod-overlay-test
这是 Build.scala 文件:
import sbt._
import Keys._
object ProjectBuild extends Build {
lazy val root = Project(
id = "arch-overlay",
base = file(".")
) aggregate(moduleOverlay, moduleOverlayDocumentation, moduleOverlayTest)
lazy val moduleOverlay = Project(
id = "mod-overlay",
base = file("urn.org.netkernelroc.mod.architecture.overlay")
)
lazy val moduleOverlayDocumentation = Project(
id = "mod-overlay-doc",
base = file("urn.org.netkernelroc.mod.architecture.overlay.doc")
)
lazy val moduleOverlayTest = Project(
id = "mod-overlay-test",
base = file("urn.org.netkernelroc.mod.architecture.overlay.test")
)