让 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
的初始构建确实填充了缓存,但是
- 我的
~/.m2/repository
文件夹被重新创建并充满了东西,尽管它似乎只是 leiningen[=42= 需要的 clojure 东西],以及
- 删除
~/.m2
后,后续重建似乎根本不使用本地存储库,而是从 clojars 下载。
显然我遗漏了一些东西......或者我可能以完全错误的方式处理这个问题。
简而言之,如何让leiningen变成
- 在网络磁盘上创建包缓存,并且
- 让它更喜欢这个缓存作为包的来源(而不是像 clojars 这样的外部来源)?
Leiningen 已经默认选择 ~/.m2
。如果它还没有本地存储在其 ~/.m2
中的请求的 JAR 副本,它只会转到 Clojars。此规则的例外情况是,如果您指定 SNAPSHOT 版本,它将在网络上每天一次(默认情况下)检查它拥有的 SNAPSHOT 版本是否是最新的。
如果根本不想让莱宁根上网,可以将:offline?
键设置为true
。
回答您的问题:
- How can I get Leiningen to create a cache of packages on a network disk?
Leiningen 已经在 ~/.m2
中创建了包缓存。您可以将该目录符号链接到您的网络磁盘,或者像现在一样使用 :local-repo
,尽管听起来 :local-repo
不适合您?
- 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
在 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
的初始构建确实填充了缓存,但是
- 我的
~/.m2/repository
文件夹被重新创建并充满了东西,尽管它似乎只是 leiningen[=42= 需要的 clojure 东西],以及 - 删除
~/.m2
后,后续重建似乎根本不使用本地存储库,而是从 clojars 下载。
显然我遗漏了一些东西......或者我可能以完全错误的方式处理这个问题。
简而言之,如何让leiningen变成
- 在网络磁盘上创建包缓存,并且
- 让它更喜欢这个缓存作为包的来源(而不是像 clojars 这样的外部来源)?
Leiningen 已经默认选择 ~/.m2
。如果它还没有本地存储在其 ~/.m2
中的请求的 JAR 副本,它只会转到 Clojars。此规则的例外情况是,如果您指定 SNAPSHOT 版本,它将在网络上每天一次(默认情况下)检查它拥有的 SNAPSHOT 版本是否是最新的。
如果根本不想让莱宁根上网,可以将:offline?
键设置为true
。
回答您的问题:
- How can I get Leiningen to create a cache of packages on a network disk?
Leiningen 已经在 ~/.m2
中创建了包缓存。您可以将该目录符号链接到您的网络磁盘,或者像现在一样使用 :local-repo
,尽管听起来 :local-repo
不适合您?
- 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