【问题标题】:Copy all SBT dependencies to local folder将所有 SBT 依赖项复制到本地文件夹
【发布时间】:2015-09-28 13:12:55
【问题描述】:

我正在码头化我的 Play!框架应用程序,目前,我的构建需要 15 分钟以上才能完成。该过程的很大一部分实际上是下载依赖项,因为我的构建器还没有缓存的概念。我认为,将我的项目所需的所有依赖项复制到本地文件夹是一个好主意,这样它就不必一次又一次地下载所有内容。但是,问题是,我不知道该怎么做?我知道 SBT 具有允许您指定本地存储库的功能,但我不知道允许我将所有内容复制到某个文件夹的功能。

【问题讨论】:

    标签: scala playframework docker sbt


    【解决方案1】:

    更新(2015-07-13):

    好的,所以你想要的是将所有依赖项保留在你想要的文件夹中,你可以在运行 sbt 时尝试这个,

    sbt -Dsbt.ivy.home=/your/local/path/.ivy 
    

    然后它将所有依赖文件或下载的任何文件保存在/your/local/path/.ivy/cache中构建您的应用程序。

    如果您想将它们保留在您的项目中,

    sbt -Dsbt.ivy.home=/some/path/to/your-project/.ivy 
    

    然后文件将存储在/some/path/to/your-project/.ivy/cache文件夹中。

    对了,docker不支持缓存?嗯,您为什么不尝试一些不错的 CI 服务,例如 Semaphore CI,然后让它将您的应用程序部署到 Docker? (我与 Semaphore 没有任何个人或任何其他联系。这只是我使用的服务,我尝试了大约五种不同的 CI 工具,并且最喜欢那个)。

    更新(2015-07-12):哦,抱歉,您的问题不是关于使用本地存储库,而是将所有内容复制到其中。

    这可能不是您所要求的,但可能可以解决您的问题。

    updateOptions := updateOptions.value.withCachedResolution(true)
    

    注意:这是一个实验性功能。

    详情:sbt doc - Cached-Resolution

    ================================================

    你可以指定仓库

    resolvers += name at location
    

    喜欢

    resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
    

    所以对于本地 maven repo,你可以简单地做

    resolvers += Resolver.mavenLocal
    

    然而,就我而言,当我这样做时,它试图访问PROJECT_HOME/{user.home}/.m2/repository,这是不正确的。

    我想要的是$HOME/.m2/repository,这是 maven 本地存储库的位置。所以我把下面这行放在build.sbt而不是Resolver.mavenLocal中,似乎可以工作。

    resolvers += "mavenLocal" at s"${sys.props("user.home")}/.m2/repository"
    

    详情:sbt doc - Library-Dependencies

    【讨论】:

    • 我还没有看到任何可以让我完全下载所有依赖项的功能。这就是我所追求的。还是谢谢你的回答。
    • @MartijnR 好吧,我在 build.sbt resolvers += "mavenLocal" at s"${sys.props("user.home")}/.m2/repository" 中执行此操作,当它在 mavenLocal 找到依赖库时,它似乎不会再次下载依赖库。
    • 是的,问题是。我正在使用 docker,这意味着没有保留缓存。复制我的整个 Maven 缓存是愚蠢的,因为它包含很多不相关的东西。 :(
    • @MartijnR 好的,知道了。我已经更新了我的答案,您想要的是将文件保存在项目文件夹中的某个文件夹或您想要的任何其他文件夹中,这可能就是答案。所以请阅读更新的内容。 :)
    • 这实际上是我现在使用的解决方案。希望有更好的方法。我现在在自己的计算机上编译项目并创建一个包含常春藤缓存的 tar.gz 文件并将其托管在 S3 上。当我的 docker 想要构建时,它会从那里拉出并将其用于构建。一个非常草率的解决方案,但这是我能做的最好的。 Git 不允许推送巨大的 ivy 缓存,所以这是唯一的解决方案。
    【解决方案2】:

    试试 sbt pack 插件https://github.com/xerial/sbt-pack 它有 packCopyDependencies 任务。也许这就是你要找的。​​p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-29
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多