3

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

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

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

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

4

2 回答 2

2

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

于 2013-02-06T09:55:24.003 回答
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;博士

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

于 2013-02-07T07:53:44.790 回答