【问题标题】:build.sbt - iteration over sub projects for common settings in monorepobuild.sbt - 迭代子项目以获取 monorepo 中的常见设置
【发布时间】:2021-10-20 12:46:10
【问题描述】:

我正在使用 SBT 实现一个 monorepo。我想迭代我的子项目以初始化它们(因为它们具有相同的配置)并防止代码重复。

在我的build.sbt

lazy val root = (project in file("."))
    .aggregate(projects: _*)
    .settings(
        crossScalaVersions := Nil,
        publish / skip := true
    )

lazy val projects = Seq("projectA", "projectB", "projectC")
    .map((projectName: String) => (project in file(projectName))
        .settings(
            name := projectName,
            commonSettings,
            libraryDependencies ++= ModulesDependencies.get(projectName))
        .project
    )

我收到了错误:

 error: project must be directly assigned to a val, such as `val x = project`. Alternatively, you can use `sbt.Project.apply`

根据错误消息,我也尝试改用sbt.Project.apply(projectName, file(projectName)).settings(...),但我也遇到了一些有趣的错误。

据我了解,SBT 似乎希望我声明为 lazy val projectA = (project in file("projectA")).settings(...),这可以正常工作,但我必须为我的所有子项目复制此代码。

我尝试实现的这个迭代是否可行?

【问题讨论】:

    标签: scala loops sbt


    【解决方案1】:

    实用方法可能有助于解决一些重复问题,例如

    def createProject(projectName: String) = {
      Project(projectName, file(projectName))
        .settings(
          name := projectName,
          commonSettings,
          libraryDependencies ++= ModulesDependencies.get(projectName)
        )
    }
    
    lazy val projectA = createProject("projectA")
    lazy val projectB = createProject("projectB")
    lazy val projectC = createProject("projectC")
    
    lazy val root = (project in file("."))
      .aggregate(projectA, projectB, projectB)
      .settings(
        crossScalaVersions := Nil,
        publish / skip := true
      )
    

    【讨论】:

    • 我确实喜欢你找到了一种减少重复的方法。我想我会坚持这一点。但似乎不可能在迭代中调用这个 createProject 方法
    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2013-09-20
    • 2017-11-26
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多