9

我正在尝试使用新的 sbt 0.13 ( ) 建立一个多项目build.sbtlazy val的名称决定子项目名称的想法对我来说听起来很奇怪。此外,我没有得到连字符,而是以驼峰式结尾:

lazy val myprojectCore = project

当我列出> projects时,我看到了myprojectCore。我怎样才能做到这一点myproject-core


name还有,现在钥匙的用途和关系是什么?

4

5 回答 5

5

我猜推荐的方法是使用驼峰式大小写来统一 Scala 标识符。

我没有关于偏好的确凿证据,但是project从左侧获取变量名的事实以及在 shell 中设置键也使用驼峰式大小写的事实让我这么认为。sbt、Maven 和 scala 项目之间的关系相当复杂。尽管为进行 sbt 构建付出了很多努力,但 scala/scala 项目始终使用 Ant 进行构建。在任何情况下,Maven 工件都应该是连字符的,为此您可以使用namekey.

我可以写:

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)
于 2013-08-30T02:06:25.380 回答
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
于 2013-12-21T09:49:15.640 回答
3

如果有人现在正在寻找这个,使用 sbt1.x系列我们可以执行以下操作。

lazy val myprojectCore = project.withId("myproject-core")
于 2018-01-18T15:45:10.330 回答
2

一种可能:

lazy val `myproject-core` = project

但这是这样做的方法吗?

于 2013-08-29T13:56:02.070 回答
2

我有一个类似的项目结构并创建了项目/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")
  )
于 2013-08-29T23:03:29.223 回答