【问题标题】:Getting leiningen to cache packages让 leiningen 缓存包
【发布时间】:2025-12-09 09:40:01
【问题描述】:

clojurescript 项目中,我希望 leiningen 在我们的 CI 构建期间减少对互联网连接的依赖。我希望让它缓存网络磁盘上的包(使用:local-repo 设置创建“共享缓存”),然后将其添加为存储库,使其首先从那里获取并且仅从 在“共享缓存”中找不到 clojars 和其他外部站点。

我阅读了this,删除了我的~/.m2 文件夹,并将以下内容添加到我的project.clj

:profiles {:local-cache
           {:local-repo "/shared/disc/clojars-cache"
            :repositories {"local" {:uri "file:///shared/disc/clojars-cache"
                                    :releases {:checksum :ignore}}}}}

使用lein with-profile +local-cache cljsbuild 的初始构建确实填充了缓存,但是

  1. 我的 ~/.m2/repository 文件夹被重新创建并填充了一些东西,虽然它似乎只是 leiningen 需要的 clojure 东西,并且
  2. 删除~/.m2 后,后续重建似乎根本不使用本地存储库,而是从 clojars 下载。

显然我遗漏了一些东西......或者我可能以完全错误的方式处理这个问题。

简而言之,我怎样才能让 leiningen

  1. 在网络磁盘上创建包缓存,并
  2. 让它更喜欢这个缓存作为包的来源(而不是像 clojars 这样的外部来源)?

【问题讨论】:

    标签: caching clojure clojurescript leiningen


    【解决方案1】:

    默认情况下,Leiningen 已经更喜欢转到~/.m2。只有在其~/.m2 中本地还没有请求存储的 JAR 副本时,它才会转到 Clojars。此规则的例外情况是,如果您指定 SNAPSHOT 版本,它将通过网络检查其拥有的 SNAPSHOT 版本是否为最新版本(默认情况下)。

    如果您根本不想让 Leiningen 上网,您可以将 :offline? 键设置为 true

    回答您的问题:

    1. 如何让 Leiningen 在网络磁盘上创建包缓存?

    Leiningen 已经在~/.m2 中创建了一个包缓存。您可以将该目录符号链接到您的网络磁盘,或者像现在一样使用:local-repo,尽管听起来:local-repo 不适合您?

    1. 如何让 Leiningen 更喜欢这个缓存而不是外部资源?

    Leiningen 已经这样做了。听起来:local-repo 要么不起作用,要么配置不正确,要么 Leiningen 无法写入该目录?


    回过头来看看更广泛的问题,您希望在 CI 构建中防止不必要的网络流量。默认情况下,Leiningen 已经缓存了每个依赖项。您还没有说您使用的是哪个 CI 工具,但它们都应该能够在运行之间缓存 ~/.m2 文件夹。根据工具的不同,您必须为每个项目或每台机器下载一次您的 deps。我建议坚持这一点,而不是尝试通过网络共享 deps,因为这可能会导致难以调试测试失败。

    如果这对您不起作用,您能否提供有关您的设置的更多详细信息,以及为什么您希望 Leiningen 在 CI 构建中减少对网络的依赖?


    UPDATE:看到Gitlab CI被使用了,看来需要加个caching config

    cache:
      paths:
      - ~/.m2
    

    【讨论】:

    • 基本上您确认leiningen 应该 像我预期的那样工作,但事实并非如此。当我删除 ~/.m2:local-repo 指向的文件夹并运行构建时,两者都被创建。在 :local-repo 我找到所有使用的包(Clojure 和 ClojureScript 包),在 ~/.m2 我只找到 Clojure 包(即 leiningen 本身使用的包,如 figwheelring)。我使用的是 Gitlab CI,每个构建都有自己的 Docker 容器,所以运行之间的共享并不容易。
    • 我已经用关于 gitlab 缓存的文档更新了这篇文章。有用吗?
    • 确实如此。我读过并使用过artefact,但不是cache。似乎 Gitlab CI 不允许缓存源树之外的东西,所以我使用:local-repo ".local-m2" 将缓存移动到源树中(这确实有效,这让我想知道:local-repo 的绝对路径是否为我最初使用的是不受支持/错误的)。我认为this 是编写 Gitlab CI YAML 文件的更好资源。