让 leiningen 缓存包

Getting leiningen to cache packages

clojurescript 项目中,我希望 leiningen 在 CI 构建期间减少对互联网连接的依赖.我希望让它缓存网络磁盘上的包(使用 :local-repo 设置创建一个 "shared cache"),然后将它添加为存储库,这样它首先从那里获取,并且只从clojars 和其他外部站点在 "shared cache".

中找不到时

我阅读了 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[=42= 需要的 clojure 东西],以及
  2. 删除 ~/.m2 后,后续重建似乎根本不使用本地存储库,而是从 clojars 下载。

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

简而言之,如何让leiningen变成

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

Leiningen 已经默认选择 ~/.m2。如果它还没有本地存储在其 ~/.m2 中的请求的 JAR 副本,它只会转到 Clojars。此规则的例外情况是,如果您指定 SNAPSHOT 版本,它将在网络上每天一次(默认情况下)检查它拥有的 SNAPSHOT 版本是否是最新的。

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

回答您的问题:

  1. How can I get Leiningen to create a cache of packages on a network disk?

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

  1. How can I get Leiningen to prefer this cache over external sources?

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


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

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


更新:看到正在使用 Gitlab CI 后,看来您需要添加一个 caching config?

cache:
  paths:
  - ~/.m2