【问题标题】:How to add test-scoped artifacts of sbt project to another's test classpath?如何将 sbt 项目的测试范围工件添加到另一个测试类路径?
【发布时间】:2015-08-05 23:44:57
【问题描述】:

有两个 sbt 项目:commonprojectX

项目commontest 范围内有一些依赖项,我想在projectX 中的test 类路径中看到这些依赖项,其中common 作为依赖项。

这是projectXbuild.sbt 的摘录,test->test 配置映射如Configurations 中所述:

libraryDependencies ++= Seq(
  "org" %% "common" % "0.1" % "compile->compile;test->test"
)

projectX 中执行test:compile 时出现以下错误:

[错误] (*:update) sbt.ResolveException: 未解决的依赖: org#common_2.10;0.1:配置在 org#common_2.10;0.1 中不公开: '测试'。 org#projectX_2.10;0.0.1-SNAPSHOT 测试需要它

如何将项目common中的test-scoped依赖添加到项目projectX中的test类路径中?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    我以前从未见过该错误并且无法重现它,但看起来测试工件没有经过publishLocaled,因为默认情况下它们不是。

    根据Selecting default artifacts

    默认情况下,发布的工件是主要的二进制jar,一个jar 包含主要来源和资源,以及一个包含 API 文档。您可以为测试类添加工件, 源或 API,或者您可以禁用一些主要工件。

    添加所有测试工件:

    publishArtifact in Test := true
    

    这就是发布 test 配置的工件应该做的事情。

    将以下内容添加到 common 项目的 build.sbtpublishLocal 以将测试打包并发布到本地 Ivy2 存储库:

    publishArtifact in Test := true
    

    随着更改,您应该在 publishLocal 的日志中看到以下内容 - 请注意与测试相关的工件:

    > common/publishLocal
    [info] Packaging /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1-sources.jar ...
    [info] Packaging /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1-tests-sources.jar ...
    [info] Done packaging.
    [info] Done packaging.
    [info] Updating {file:/Users/jacek/sandbox/multi-module-test-scope-25003683/}common...
    [info] Wrote /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1.pom
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] :: delivering :: org#common_2.10;0.1 :: 0.1 :: release :: Mon Jul 28 23:00:41 CEST 2014
    [info]  delivering ivy file to /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/ivy-0.1.xml
    [info] Packaging /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1-javadoc.jar ...
    [info] Done packaging.
    [info] Packaging /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1.jar ...
    [info] Done packaging.
    [info] Test Scala API documentation to /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/test-api...
    [info] Compiling 1 Scala source to /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/test-classes...
    model contains 2 documentable templates
    [info] Test Scala API documentation successful.
    [info] Packaging /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1-tests-javadoc.jar ...
    [info] Done packaging.
    [info] Packaging /Users/jacek/sandbox/multi-module-test-scope-25003683/common/target/scala-2.10/common_2.10-0.1-tests.jar ...
    [info] Done packaging.
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/docs/common_2.10-javadoc.jar
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/srcs/common_2.10-tests-sources.jar
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/jars/common_2.10-tests.jar
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/jars/common_2.10.jar
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/srcs/common_2.10-sources.jar
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/poms/common_2.10.pom
    [info]  published common_2.10 to /Users/jacek/.ivy2/local/org/common_2.10/0.1/docs/common_2.10-tests-javadoc.jar
    [info]  published ivy to /Users/jacek/.ivy2/local/org/common_2.10/0.1/ivys/ivy.xml
    [success] Total time: 2 s, completed Jul 28, 2014 11:00:43 PM
    

    【讨论】:

    • 不幸的是我已经设置了这个选项publishArtifact in Test := true,但它并没有改变任何东西。另请注意,我不需要 common 的测试类 - 我只需要类路径具有它的依赖项。 Artifact 也肯定会发布。
    • 查看您的日志,我感觉您在多模块设置中复制了它。没有模块。这是 2 个独立的独立项目,其中 projectX 依赖于 common
    • multi-module-test-scope-25003683 的名称具有误导性,因为我开始使用 dependsOn 的多模块项目,然后意识到您以不同的方式使用依赖项。这两个项目共享目录,但它们通过本地 Ivy2 存储库相互依赖。
    • 至于测试类路径......你不能依赖 CLASSPATH 而是工件。因此,要在项目之间建立依赖关系,您必须依赖它们的工件。由于projectX 依赖于测试工件,而后者又依赖于其他工件,它们都构成了测试CLASSPATH。
    【解决方案2】:

    通过从 Maven 风格切换到 Ivy 风格的发布和解析(Ivy 文件而不是 pom 文件和 Ivy 风格的存储库),我已经成功地解决了这个问题。顺便说一句,如果您使用 Nexus 代理,建议在 Nexus 中将 Maven 存储库和 Ivy 存储库(以及 Maven 组和 Ivy 组)完全分开。

    也就是说,我不知道您为什么在 publishLocal 中遇到这个问题 - 如果您的 source 项目构建中有 publishArtifact 行,那肯定可以工作文件正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 2015-04-29
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多