在SBT中定义子项目之间的插件依赖关系?

 用户9o05le1po7 发布于 2023-01-29 19:52

如果您有一个带有"项目P和两个子项目A和B"的多项目构建配置,则归结为以下配置:

build.sbt

lazy val A, B = project

根据设计,"如果没有为构建中的根目录定义项目,则sbt会创建一个默认的项目来聚合构建中的所有其他项目." 这意味着你将有一个隐含的根项目,比如说P(但名称是任意的):

[plugin-project-and-another]> projects
[info] In file:/Users/jacek/sandbox/so/plugin-project-and-another/
[info]     A
[info]     B
[info]   * plugin-project-and-another

这为我们提供了预期的项目结构.关于定义B和之间的插件依赖性A.

在SBT项目定义插件的唯一方法就是使用project目录这就是plugins项目的构建定义- "一个插件定义为<主要项目> /项目/项目." 这意味着定义项目插件依赖项的唯一方法A是使用以下方法:

项目/ plugins.sbt

addSbtPlugin("org.example" % "example-plugin" % "1.0")

lazy val plugins = project in file(".") dependsOn(file("../A"))

在这个构建配置中,plugins项目依赖于另一个SBT项目,而这个项目恰好是我们A的插件项目.

A/build.sbt

// http://www.scala-sbt.org/release/docs/Extending/Plugins.html#example-plugin
sbtPlugin := true

name := "example-plugin"

organization := "org.example"

version := "1.0"

A/MyPlugin.scala

import sbt._

object MyPlugin extends Plugin
{
    // configuration points, like the built in `version`, `libraryDependencies`, or `compile`
    // by implementing Plugin, these are automatically imported in a user's `build.sbt`
    val newTask = taskKey[Unit]("A new task.")
    val newSetting = settingKey[String]("A new setting.")

    // a group of settings ready to be added to a Project
    // to automatically add them, do
    val newSettings = Seq(
        newSetting := "Hello from plugin",
        newTask := println(newSetting.value)
    )

    // alternatively, by overriding `settings`, they could be automatically added to a Project
    // override val settings = Seq(...)
}

这两个文件 - build.sbt以及MyPlugin.scala目录中的A- 构成了插件项目.

唯一缺少的是定义项目的插件A设置B.

B/build.sbt

MyPlugin.newSettings

这就是你在SBT中可以做的事情.如果您想拥有多项目构建配置并且(子)项目之间具有插件依赖性,除了上面描述的内容之外,您没有太多选择.

话虽如此,让我们看看项目中的插件A是否可访问.

[plugin-project-and-another]> newTask
Hello from plugin
[success] Total time: 0 s, completed Feb 13, 2014 2:29:31 AM
[plugin-project-and-another]> B/newTask
Hello from plugin
[success] Total time: 0 s, completed Feb 13, 2014 2:29:36 AM
[plugin-project-and-another]> A/newTask
[error] No such setting/task
[error] A/newTask
[error]          ^

您可能已经注意到,newTask(来自项目的插件A)可以在(默认)根项目和项目中使用B,但不能在A.

1 个回答
  • 如果您有一个带有"项目P和两个子项目A和B"的多项目构建配置,则归结为以下配置:

    build.sbt

    lazy val A, B = project
    

    根据设计,"如果没有为构建中的根目录定义项目,则sbt会创建一个默认的项目来聚合构建中的所有其他项目." 这意味着你将有一个隐含的根项目,比如说P(但名称是任意的):

    [plugin-project-and-another]> projects
    [info] In file:/Users/jacek/sandbox/so/plugin-project-and-another/
    [info]     A
    [info]     B
    [info]   * plugin-project-and-another
    

    这为我们提供了预期的项目结构.关于定义B和之间的插件依赖性A.

    在SBT项目定义插件的唯一方法就是使用project目录这就是plugins项目的构建定义- "一个插件定义为<主要项目> /项目/项目." 这意味着定义项目插件依赖项的唯一方法A是使用以下方法:

    项目/ plugins.sbt

    addSbtPlugin("org.example" % "example-plugin" % "1.0")
    
    lazy val plugins = project in file(".") dependsOn(file("../A"))
    

    在这个构建配置中,plugins项目依赖于另一个SBT项目,而这个项目恰好是我们A的插件项目.

    A/build.sbt

    // http://www.scala-sbt.org/release/docs/Extending/Plugins.html#example-plugin
    sbtPlugin := true
    
    name := "example-plugin"
    
    organization := "org.example"
    
    version := "1.0"
    

    A/MyPlugin.scala

    import sbt._
    
    object MyPlugin extends Plugin
    {
        // configuration points, like the built in `version`, `libraryDependencies`, or `compile`
        // by implementing Plugin, these are automatically imported in a user's `build.sbt`
        val newTask = taskKey[Unit]("A new task.")
        val newSetting = settingKey[String]("A new setting.")
    
        // a group of settings ready to be added to a Project
        // to automatically add them, do
        val newSettings = Seq(
            newSetting := "Hello from plugin",
            newTask := println(newSetting.value)
        )
    
        // alternatively, by overriding `settings`, they could be automatically added to a Project
        // override val settings = Seq(...)
    }
    

    这两个文件 - build.sbt以及MyPlugin.scala目录中的A- 构成了插件项目.

    唯一缺少的是定义项目的插件A设置B.

    B/build.sbt

    MyPlugin.newSettings
    

    这就是你在SBT中可以做的事情.如果您想拥有多项目构建配置并且(子)项目之间具有插件依赖性,除了上面描述的内容之外,您没有太多选择.

    话虽如此,让我们看看项目中的插件A是否可访问.

    [plugin-project-and-another]> newTask
    Hello from plugin
    [success] Total time: 0 s, completed Feb 13, 2014 2:29:31 AM
    [plugin-project-and-another]> B/newTask
    Hello from plugin
    [success] Total time: 0 s, completed Feb 13, 2014 2:29:36 AM
    [plugin-project-and-another]> A/newTask
    [error] No such setting/task
    [error] A/newTask
    [error]          ^
    

    您可能已经注意到,newTask(来自项目的插件A)可以在(默认)根项目和项目中使用B,但不能在A.

    2023-01-29 19:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有