请在 2024 Clojure 状态调查! 分享您的想法。

欢迎!请访问 关于页面 了解更多关于此如何工作的信息。

0 投票
Clojure CLI
重新标记

当我在同一个项目(具有不同的参数)中运行两个或多个 clojure 实例时,它们最终会竞争相同的缓存文件夹,该文件夹被创建在同一路径中。在这种情况下,我们看到的错误是 无法找到或加载主类 clojure.main。有时还有其他错误。

如果正确理解脚本逻辑,它会选择当前目录作为缓存并使用参数组合的哈希作为唯一标识符,但在我的情况下最终生成的文件夹是相同的。

# Determine whether to use user or project cache
if [[ -f deps.edn ]]; then
  cache_dir=.cpcache
else
  cache_dir="$user_cache_dir"
fi

将非常乐意引入锁定机制以防止竞争情况,或者作为处理程序提供一个指定缓存目录额外参数或校验和的选项。

可能的解决方案

diff --git a/src/main/resources/clojure/install/clojure b/src/main/resources/clojure/install/clojure
index 67272b7..53fd7ec 100755
--- a/src/main/resources/clojure/install/clojure
+++ b/src/main/resources/clojure/install/clojure
@@ -22,6 +22,7 @@ jvm_opts=()
 resolve_aliases=()
 classpath_aliases=()
 repl_aliases=()
+cache_extra=
 mode="repl"
 while [ $# -gt 0 ]
 do
@@ -108,6 +109,11 @@ do
       deps_data="${1}"
       shift
       ;;
+    -Scache)
+      shift
+      cache_extra="${1}"
+      shift
+      ;;
     -Scp)
       shift
       force_cp="${1}"
@@ -197,7 +203,7 @@ if "$help"; then
 	on the JVM, e.g. to start a REPL or invoke a specific function with data.
 	The Clojure tools will configure the JVM process by defining a classpath
 	(of desired libraries), an execution environment (JVM options) and
-	specifying a main class and args. 
+	specifying a main class and args.
 
 	Using a deps.edn file (or files), you tell Clojure where your source code
 	resides and what libraries you need. Clojure will then calculate the full
@@ -234,6 +240,7 @@ if "$help"; then
 	 -Spath         Compute classpath and echo to stdout only
 	 -Spom          Generate (or update) pom.xml with deps and paths
 	 -Stree         Print dependency tree
+	 -Scache CACHE  Provide arbitrary data to include into cache hash
 	 -Scp CP        Do NOT compute or cache classpath, use this one instead
 	 -Srepro        Ignore the ~/.clojure/deps.edn config file
 	 -Sforce        Force recomputation of the classpath (don't use the cache)
@@ -320,7 +327,7 @@ else
 fi
 
 # Construct location of cached classpath file
-val="$(join '' ${resolve_aliases[@]})|$(join '' ${classpath_aliases[@]})|$(join '' ${repl_aliases[@]})|$exec_aliases|$main_aliases|$deps_data|$tool_name|$tool_aliases"
+val="${cache_extra}|$(join '' ${resolve_aliases[@]})|$(join '' ${classpath_aliases[@]})|$(join '' ${repl_aliases[@]})|$exec_aliases|$main_aliases|$deps_data|$tool_name|$tool_aliases"
 for config_path in "${config_paths[@]}"; do
   if [[ -f "$config_path" ]]; then
     val="$val|$config_path"

1 个答案

0 投票

在Jira上有一个问题TDEPS-119,虽然内容不同,但解决这个问题可能也能解决你的问题。

关于该问题有人评论,我知道答案。

> Stanislav Yurin
> 2019年2月26日 00:33

> 抱歉,我在任何地方都找不到那个bash脚本的仓库源码,所以没有附带补丁文件。

以下是仓库链接: https://github.com/clojure/brew-install/blob/1.11.1/src/main/resources/clojure/install/clojure

不幸的是,我不能在问题本身上评论。
...