我正在尝试使用新的sbt 0.13(build.sbt
)设置multi-project。 lazy val
的名称确定子项目名称的想法对我来说听起来很奇怪。此外,我没有得到连字符,但最终得到了驼峰案例:
lazy val myprojectCore = project
当我列出> projects
时,我会看到myprojectCore
。如何制作此myproject-core
?
此外,name
键的目的和关系现在是什么?
答案 0 :(得分:5)
我猜测推荐的方法是使用camel case来统一Scala标识符。
我没有关于偏好的确凿证据,但project
从左侧获取变量名称的事实以及设置键也在shell中使用驼峰的事实让我也这样觉得。 sbt,Maven和scala项目之间的关系相当复杂。尽管做了多次sbt构建的努力,scala / scala项目总是使用Ant来构建。在任何情况下,Maven工件都应该是连字符,为此您可以使用name
键。
我可以写:
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)
答案 1 :(得分:3)
以前的答案几乎把它完全钉了下来,但是真的需要在两行之间进行阅读以获得它的要点。
我使用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
答案 2 :(得分:2)
一种可能性:
lazy val `myproject-core` = project
但这是做到这一点的方法吗?
答案 3 :(得分:2)
我有一个类似的项目结构并创建了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")
)
答案 4 :(得分:2)
如果有人正在寻找这个,我们可以使用sbt 1.x
系列进行以下操作。
lazy val myprojectCore = project.withId("myproject-core")