【问题标题】:Add a compile time only sub-project dependency in sbt在 sbt 中添加仅编译时的子项目依赖项
【发布时间】:2016-05-30 09:54:35
【问题描述】:

我有一个多项目包含一个私有宏子项目,其用途仅限于实现其他子项目的方法体。它也不应该在其他子项目的运行时类路径上,也不应该以任何形式在其他子项目的已发布 POM 中可见。这样其他 sbt 项目就可以在不知道宏子项目的情况下使用该项目中的库。

对于外部依赖,我发现这个SO Q&A 工作得很好,但是对于子项目,当我尝试做与dependsOn 类似的事情时,sbt 抱怨找不到配置“compileonly”。

ivyConfigurations += config("compileonly").hide

val macro = Project("macro", file("macro"))

val lib = Project("lib", file("lib")).dependsOn(macro % "compile->compileonly")

【问题讨论】:

    标签: scala sbt dependency-management scala-macros


    【解决方案1】:

    那个错误是因为项目没有那个配置。

    val CompileOnly = config("compileonly").hide    
    
    ivyConfigurations += CompileOnly
    
    val macro = Project("macro", file("macro")).configs(CompileOnly) // add config
    
    val lib = Project("lib", file("lib")).dependsOn(macro % CompileOnly)
    

    但问题是

    macro#macro_2.10;0.1-SNAPSHOT: 配置在宏#macro_2.10;0.1-SNAPSHOT: 'compileonly' 中不公开。它是 lib#lib_2.10;0.1-SNAPSHOT 编译所必需的

    解决办法是

    val CompileOnly = config("compileonly")
    
    val macro = Project("macro", file("macro")).configs(CompileOnly)
    
    val lib = Project("lib", file("lib")).dependsOn(macro % CompileOnly)
      .settings(ivyConfigurations += CompileOnly.hide)
    

    您可能还想熟悉provided 配置。这是一个标准的 Maven/Ivy 配置,这意味着 jar 将在运行时在类路径上提供(例如,像 JDK 或 servlet 容器),但不在编译时提供。

    【讨论】:

    • 当我使用这种方法时,compile 任务失败。编译lib 时找不到macro 项目中的任何类。
    【解决方案2】:
    val lib = Project("lib", file("lib")).dependsOn(macro % "compile-internal") 
    

    昨晚刚刚讨论过……

    【讨论】:

    • 好地方,@pfn!它不仅适用于子项目依赖项。它也可以用于外部依赖。此外,它还具有用于测试的“内部测试”补间。
    猜你喜欢
    • 2014-02-26
    • 2016-04-05
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2011-08-27
    • 2020-01-20
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多