我正在尝试在 NixOS 23.05 中运行一个超级简单的 Clojure 项目。
project.clj
文件包含:
(defproject fsm "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [[org.clojure/clojure "1.11.1"]
[com.phronemophobic/clj-graphviz "0.6.1"]]
:main ^:skip-aot fsm.core
:target-path "target/%s"
:profiles {:uberjar {:aot :all
:jvm-opts ["-Dclojure.compiler.direct-linking=true"]}})
文件
src/fsm/core.clj
包含:
(ns fsm.core
(:gen-class))
(require '[com.phronemophobic.clj-graphviz :refer [render-graph]])
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!")
(render-graph {:edges [["a" "b"]]})
;; writes to graph.png
(render-graph {:edges [["a" "b"]]}
{:filename "my-graph.png"}))
但是当我输入
lein run
时,我收到错误消息:
Execution error (UnsatisfiedLinkError) at com.sun.jna.NativeLibrary/loadLibrary (NativeLibrary.java:323).
Unable to load library 'gvc':
libgvc.so: cannot open shared object file: No such file or directory
libgvc.so: cannot open shared object file: No such file or directory
Native library (linux-x86-64/libgvc.so) not found in resource path (...)
这在其他 Linux 发行版(Pop OS!/Ubuntu)中工作得很好,所以我相信我缺少 NixOS 配置的一些东西。我对这个分布不熟悉。
libgvc.so
是 GraphViz 的一部分。您需要安装 GraphViz 才能访问该库。随心所欲地这样做。
如果您不使用 Flakes 来部署/运行应用程序,安装 GraphViz 最简单的方法是使用 Nix shell,如下所示:
$ nix-shell -p graphviz
$ lein run
您还可以按照安装
graphviz
的方式将 lein
添加到已安装的软件包列表中。
libgvc.so
是一个共享对象,当您安装 Graphviz 时,应该安装在您的系统上(请参阅已安装的库此处)。我说“应该”是因为我不确定编译 Graphviz 时是否始终包含 libgvc(Graphviz 上下文库)。
在 NixOS 上安装库与在 Ubuntu 上安装库意味着不同的事情。这是因为 Ubuntu 中的 apt
(与 Linux 发行版中的大多数包管理器一样)下载预编译的二进制文件,而 NixOS 中的
nix
检查所需的工件是否存在于 二进制缓存中,如果不存在,则进行编译源代码并将工件上传到该缓存。 从nixpkgs中的这个NixOS模块
可以看到,Graphviz源代码首先从这个Gitlab存储库中获取,然后使用nativeBuildInputs
中声明的工具进行编译。 NixOS 模块还负责确保运行时依赖项在您的系统上可用(请参阅
buildInputs
)。如果您在 nixpkgs 中找到的 graphviz
软件包确实包含libgvc,则该软件包可能没问题,您应该仔细检查您的 NixOS 配置。你应该有这样的东西:
environment.systemPackages = [
pkgs.graphviz
];
如果您在 nixpkgs 中找到的
graphviz
软件包
不包含libgvc,您可以制作包含它的派生。 额外提示:当您想要快速启动 Clojure 项目时,请使用 dev-templates