【问题标题】:Conventional place to store files used by Clojure (or JVM) apps存储 Clojure(或 JVM)应用程序使用的文件的常规位置
【发布时间】:2013-02-06 09:25:02
【问题描述】:

我有一个用 Clojure 编写的应用程序。此应用程序正在帮助编写其他应用程序(例如,作为leiningen 的插件)。为此,它需要一个地方来编写一些文件,这些文件或多或少在内部使用,并且实际上不必扔在用户面前(尽管不需要对她隐藏它们)。

我一直在使用clojure.java.io/resource 做类似的事情,但它似乎只允许访问与应用程序捆绑在一起的资源,而不能创建新资源或修改现有资源。

我正在考虑只使用类似~/.myapp/ 的东西,但我怀疑Clojure、或JavaLeiningen 对此有一些约定,包括API 和所有内容,以节省我的一些麻烦。但是,由于我是这方面的新手,我不知道在哪里挖掘。

正如我所说,它是 leiningen 的插件,但我不能真正使用 %project/out/ 文件夹或类似的东西,因为我希望它能够在没有项目的情况下运行。

【问题讨论】:

  • ~/.myapp/ 将是每个用户,而不是系统范围。你能澄清一下意图吗?
  • 我对此没有意见。可能用户范围是更好的选择,特别是因为它不需要任何特殊权限

标签: java file clojure jvm leiningen


【解决方案1】:

我认为~/.lein 下有一个子目录可以使用,可能类似于~/.lein/plugin-name/your_stuff_here

【讨论】:

    【解决方案2】:

    不幸的是,无论是在 java/clojure 世界还是在本地世界中,都没有一个最终公认的约定将程序的中间文件放在哪里。不过,我想,还是有一些基本原则的。

    据我所知,大多数程序将它们需要的所有文件分成分发文件(不应修改的文件:图标和声音等资源或 jar 文件等二进制文件)、配置文件(用户可以修改的文件、直接或通过程序本身)和临时文件(我想很明显它们是什么)。

    分发文件通常通过包管理器安装(主要在 linux 系统上),或者,如有必要,它们可以手动安装在某个预定义目录中,例如 /opt。在 Windows 系统上,这些通常由安装程序安装。这些文件不会直接更改,但通常可以由包管理器在升级时更新。

    配置文件通常存储在用户主目录中(如果程序是用户应用程序)。很遗憾,但是对于这些文件的确切放置位置没有任何约定。这在 unix 系统上很痛苦(~ 混乱),但在 Windows IMO 上更糟,因为文件几乎可以在文件系统中的任何位置结束,因为在 Windows 下配置文件系统的限制性权限并未被广泛接受。

    然而,目前似乎有一种趋势(至少在 linux 世界中)将配置文件存储在 $XDG_CONFIG_HOME 环境变量的子目录中;此变量通常解析为~/.config 路径。我确信使用这个目录进行配置是正确的。这些变量有一系列 ($XDG_{CONFIG,CACHE,DATA}_HOME),每个变量都用于特定类型的文件。我认为这是 freedesktop 标准。我不知道 Windows 是否有这样的东西,但很有可能;如果我有这样的需要,我会尝试找到一些关于此的信息并使用它。

    许多程序允许明确设置配置目录的确切位置,例如IntelliJ IDEA IDE。这也是一种选择。

    临时文件通常存储在系统为临时文件提供的目录中。在 unix 系统下它通常是/tmp,在 Windows 下它可以是例如C:\Users\%USER%\AppData\Local\Temp。在 Java 中,您可以使用系统属性获取临时目录位置。在 Clojure 中,它看起来像

    (System/getProperty "java.io.tmpdir")
    

    如果我没记错的话,clojure 标准库中甚至有一个函数可以让你获取这个值。

    只有真正的临时文件应该存储在那里,因为这个目录可以被清除(在最近的 linux 发行版中,它甚至存储在 RAM 中)。

    TL;DR

    如果您想存储持久的用户范围的配置(工作、缓存等)文件,请使用 unix 系统下的 ~/.config 目录和 Windows 下的一些健全的目录(这需要更多的谷歌搜索);如果您想存储在程序中完成某些工作后不需要的临时文件,请使用标准系统临时目录,您可以通过"java.io.tmpdir" 系统属性获取。

    【讨论】:

    • 谢谢!根据您的区别,我的文件介于 temporaryconfiguration 之间:它们就像一个缓存,准备好非常好,但丢失也没问题。所以我不确定使用/tmp
    • (顺便说一句,我接受了已接受答案中的建议,仅对lein 插件有用。但感谢您提供的非常好的答案!)
    • 有广泛使用的~/.cache目录缓存,其实就是$XDG_CACHE_HOME。大多数浏览器使用它来存储缓存。很高兴你喜欢它)
    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2015-03-20
    • 1970-01-01
    • 2011-08-05
    • 2018-09-22
    • 2020-12-17
    相关资源
    最近更新 更多