带有新sbt 0.13多项目定义的连字子项目名称

时间:2013-08-29 13:40:01

标签: scala sbt

我正在尝试使用新的sbt 0.13(build.sbt)设置multi-projectlazy val的名称确定子项目名称的想法对我来说听起来很奇怪。此外,我没有得到连字符,但最终得到了驼峰案例:

lazy val myprojectCore = project

当我列出> projects时,我会看到myprojectCore。如何制作此myproject-core


此外,name键的目的和关系现在是什么?

5 个答案:

答案 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")