【问题标题】:dependency resolution with sbt for continuous integration使用 sbt 解决依赖关系以实现持续集成
【发布时间】:2021-09-08 06:59:54
【问题描述】:

我是一名开源 Scala 开发人员,希望在推送到 GitHub 并触发持续集成 (CircleCI) 的检查时尽量减少依赖关系的麻烦。我有两个项目,其中一个(A)依赖于另一个(B)。 B同时正在开发中(作为快照)。我的项目 A build.sbt 文件依赖于 B 的这个(快照)版本,当然在我的本地机器上一切正常。当我推送到 GitHub 时,它自然会失败,因为该快照文件对 CircleCI 不可用。

我通常通过将 jar 文件放入我的 lib 目录(并从 build.sbt 中删除依赖项)来解决此问题。我相信这被称为非托管依赖项。

我的问题是:有什么方法可以设置我的 lib 目录,以便 CircleCI 可以解决 lib 目录中的(托管)依赖项?我尝试将 ivy 结构放入 lib,从顶层 com.phasmidsoftware 开始,在其下使用 b_2.13,在 1.0.4-SNAPSHOT 下,依此类推。那是行不通的。我已经为项目 A(称为 Numeric)附加了 build.sbt。

organization := "com.phasmidsoftware"

name := "Number"

version := "1.0.9"

scalaVersion := "2.13.6"

scalacOptions ++= Seq( "-target:jvm-1.8", "-encoding", "UTF-8", "-unchecked", "-deprecation", "-Ywarn-dead-code", "-Ywarn-value-discard", "-Ywarn-unused" )

val scalaTestVersion = "3.2.3"

libraryDependencies += "org.scalatest" %% "scalatest" % scalaTestVersion % "test"

resolvers += "Typesafe Repository" at "https://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
  "com.phasmidsoftware" %% "matchers" % "1.0.4-SNAPSHOT",
  "org.scala-lang.modules" %% "scala-parser-combinators" % "1.2.0-M1",
  "org.apache.commons" % "commons-math3" % "3.6.1",
  "org.slf4j" % "slf4j-api" % "1.7.31",
  "ch.qos.logback" % "logback-classic" % "1.2.3" % "test",
  "org.scalacheck" %% "scalacheck" % "1.14.1" % "test"
)

【问题讨论】:

  • 我不建议将 JAR 推送到 Git,这真的不是一个好习惯。
  • 它们是不相关的项目吗?它们不能是同一个 Git 存储库中的子项目吗?
  • 一个 (B) 是通用的。 A 依赖于 B。我不认为一个普通项目的子项目真的是合理的。
  • 就推动 JAR 而言,我同意。但是没有简单的方法可以让这些 JAR 到 Circle-CI(据我所知)。通过 Maven 发布当然是可能的,但与简单相反!
  • 如果B 是通用的并且将被许多其他项目使用,那么推送到 maven central 是正确的做法,否则将两个项目合并为一个sbt 多模块设置。 - 一种中间方法是在编译代码之前克隆另一个 repo 并在 Circle 上执行sbt publishLocal。 - 还有一种方法可以从 github repo IIRC 添加 abt 依赖项:stackoverflow.com/questions/7550376/…

标签: scala sbt circleci


【解决方案1】:

How can sbt pull dependency artifacts from git?中描述的答案确实是正确的答案。

我将添加一些警告。

  • 确保在 git 存储库的 URI 中使用 git 协议(如另一个答案所示);
  • 该机制通过克隆存储库来工作(分支由 ...#branch 定义)但是,一旦你克隆了它,如果合适,sbt 将不会获取 - 你必须自己明确地这样做。
  • 要记住的另一件事是,克隆被放置在 ~/.sbt/1.0/staging/... 中,其中 1.0 基于 sbt 版本号。
  • 当然,如果您的 libraryDependencies 中有其他项目的引用,请不要忘记删除它。

这是我的 build.sbt 文件的相关部分:

lazy val root = (project in file(".")).dependsOn(matchers)
lazy val matchers = RootProject(uri("git://github.com/rchillyard/Matchers#V1_0_5"))

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 2014-01-12
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2015-11-04
    • 2012-02-02
    相关资源
    最近更新 更多