package - 仅在未安装时安装 Racket 软件包

标签 package racket

我可以安装 Racket 包:

raco pkg install <pkg-name>

如果该软件包尚未安装,则会安装它。但是,如果该软件包已安装,它会提示该软件包已安装。虽然这很好,但有没有更好的方法来检查软件包是否已安装,并且仅在尚未安装时才尝试安装它?

对于上下文,我想要这个,因为我有一个(非包)Racket 项目,它依赖于正在安装的某些包。我可以将它们放入 info.rkt 文件中,但据我所知,除非我尝试将项目作为包安装,否则它们不会被安装,这对于该域来说没有意义。

那么,有没有办法确定是否安装了 Racket 软件包?此外,我可以使用此信息仅安装尚未安装的软件包吗?

最佳答案

是的,事实上你可以。如果您使用 shell 程序或 ma​​kefile(基本上是从命令行使用 raco pkg 工具),则可以向其传递 --skip-installed 参数。如果尚未安装该软件包,则只​​会尝试安装该软件包。所以你可以在 Mace 文件中执行类似的操作:

all: # Replace spaces here with tabs, because make...
    raco pkg install --skip-installed <important-pkg>
    <rest-of-makefile>

或者,如果您正在寻找“in Racket”解决方案,您可以使用 installed-pkg-table函数获取包含所有已安装软件包的哈希表。从那里,很容易执行 hash-has-key? 来查看包是否在表中。从那里,您可以使用 pkg-install-command安装软件包。您的总代码将如下所示:

(unless (hash-has-key? (installed-pkg-table) "<important-pkg>")
  (pkg-install-command #:deps 'search-auto i))

我应该注意到,在搜​​索 key 和安装包之间,包数据库有可能会发生变化。如果这对您很重要,请查看with-pkg-lock

关于package - 仅在未安装时安装 Racket 软件包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41903723/

相关文章:

android - 找出一个apk的类名

javascript - Node.js 包自引用

function - 在单独的 golang 包中声明一个结构不能返回值,但在具体声明时可以

lisp - 获取 x bool 值的所有可能组合(Racket、Scheme)

scheme - 检测 Scheme 或 Racket 中函数的调用者

scheme - 如何检查列表是否仅包含#t

lisp - 如何在 Racket 中将 sql-timestamp 转换为字符串?

python - 某处是否有不兼容 64 位的 Python 包列表?

Flutter 3.7 基于此命令 `flutter create --template=package <package_name>` 创建与之前(3.3)和文档不同的结果

recursion - 在 Racket 中,我可以像处理 s 表达式一样递归处理语法对象吗?