【问题标题】:Where should I store cache of a custom CLI npm module?我应该在哪里存储自定义 CLI npm 模块的缓存?
【发布时间】:2015-10-28 17:18:07
【问题描述】:

我正在开发一个 npm 模块,用户可以通过终端通过执行命令与它进行交互:

> mymodule init
> mymodule do stuff

当执行某些命令时,用户被要求提供一些数据,这些数据将被模块使用。由于这些数据在使用模块时不会真正改变,而且这些命令可以非常频繁地执行,所以在用户运行命令时询问数据并不是最好的选择。所以我决定缓存这些数据,一旦它应该通过多个模块调用,我看到的最简单的存储它的方法是一个文件(数据结构允许将它存储在一个简单的 JSON 中)。但我很确定这个文件应该放在用户机器上的什么位置。

考虑到模块本身可以全局安装在多个操作系统上并且可以在同时进行多个项目?

我正在考虑将其存储在模块的文件夹中,但在全局安装 + 多项目使用的情况下可能会很棘手。第二个想法是将它存储在操作系统特定的 tmp 存储中,但我也不太确定。我也想知道在这种情况下是否有文件存储的替代方案。

【问题讨论】:

    标签: node.js caching npm


    【解决方案1】:

    我会在用户的主目录中创建一个隐藏文件夹(以点开头)。例如,/home/user/.mymodule/config.cfg。用户的主目录不会去任何地方,并且该点将确保用户不去寻找它。

    这是大多数软件存储用户配置的标准方式,包括 SSH、Bash、Nano、Wine、Ruby、Gimp,甚至 NPM 本身。

    【讨论】:

    • 感谢您的回答。这似乎是一个很好的解决方案,并且有一种方法可以跨操作系统使用这些主文件夹。但是我最近偶然发现的一件事在最初的问题中没有出现,node.js 和 npm 可以使用nvm 安装在同一台机器上的多个命名空间中,现在开发人员广泛使用它。正因为如此,我不确定如何采用这个全局主文件夹存储来进行可能的多个 npm 安装,这些安装分别具有单独的全局命名空间和我的模块。
    • @MichaelRadionov 在您的模块中,检查变量 process.version 以获取运行脚本的 NodeJS 版本。然后,您可以为每个 Node 版本创建一个单独的文件夹。例如,对于 NodeJS v0.10.25,您将拥有 /home/user/.mymodule/0.10.25/config.cfg,对于 v0.6.8,您将拥有 /home/user/.mymodule/0.6.8/config.cfg,等等。
    • 听起来不错,我试试看。
    • @MichaelRadionov 我的解决方案最终对你有用吗?
    • 很遗憾我还没有时间尝试它,但是您添加的关于使用process.version 的内容真的很有帮助,我一定会使用它。谢谢!
    【解决方案2】:

    在某些系统上,您可以通过创建子目录来存储缓存数据来缓存到~/.cache,尽管应用程序在用户主目录中创建隐藏目录更为常见。在现代 Windows 机器上,您可以使用在 C:/Users/someUser/AppData 中创建目录。在 Windows 中使用 . 后缀不会隐藏文件。我建议你做一些与平台无关的事情:

    var path = require('path');
    
    function getAppDir(appName, cb) {
        var plat = process.platform;
    
        var homeDir = process.env[(plat == 'win32') ? 'USERPROFILE' : 'HOME'];
        var appDir;
    
        if(plat == 'win32') {
            appDir = path.join(homeDir, 'AppData', appName);
        }
        else {
            appDir = path.join(homeDir, '.' + appName);
        }
    
        fs.mkdir(appDir, function(err) {
            if(err) return cb(err);
    
            cb(null, appDir);
        })
    }
    

    只需声明一个函数即可获取应用目录。这应该可以处理大多数系统,但是如果您遇到无法解决的情况,它应该很容易修复,因为您可以在这里创建某种替代逻辑。假设您希望允许用户稍后在配置文件中为应用数据指定自定义位置,您可以轻松添加该逻辑。目前,这应该适合大多数 Unix/Linux 系统和 Windows Vista 及更高版本的大多数情况。

    存储在系统临时文件夹中,取决于系统,您的缓存可能会在间隔(cron)或重新启动时丢失。使用全局安装路径会导致一些问题。如果您需要此数据在每个项目中是唯一的,那么您可以扩展该功能以允许您将此数据存储在项目根目录中,而不是模块根目录中。最好不要将它存储在模块根目录中,即使它只是作为本地/项目模块安装,因为这样用户就无法在不包含整个模块的情况下将此文件夹包含在他们的存储库中。

    因此,如果您需要存储与项目相关的缓存数据,那么您应该在项目根目录而不是node_modules 中存储。否则以与系统无关的方式将其存储在用户主目录中。

    【讨论】:

    • 感谢您的详细解答。现在我知道系统 tmp 文件夹是个坏主意。关于每个项目的数据的问题:是的,这是将模块配置文件和其他对项目唯一的信息存储在其根目录中的好方法,但在我的情况下,我想进行跨项目配置,因此用户可以使用一个配置多个项目,甚至没有任何项目。我认为这是一个需要考虑的单独问题,但操作系统主文件夹绝对适合这种情况。
    • 对,我觉得值得一提的是存储每个项目相关数据的最佳实践。如果您对此不关心,只需将其存储在用户主文件夹中即可。如上所述进行操作将使其与系统无关。
    【解决方案3】:

    首先你需要知道你在运行什么样的 SO:

    1. 您最初的想法不错,因为全局模块在所有 SO 和所有虚拟环境中并不是真正的全局。
    2. 在 Windows 中可能无法使用 /home/user。在 Windows 中,您必须检查 process.ENV.HOMEPAHT

    我建议您进行一系列检查以确定最佳位置。

    1. 让用户进行控制。选择您自己的环境变量。假设 MYMOD_HOME。您首先检查process.ENV.MYMOD_HOME 是否存在,然后使用它
    2. 检查windows是否标准process.ENV.LOCALAPPDATA
    3. 检查windows是否标准process.ENV.HOMEPATH
    4. 检查是否存在'/home/user''~'
    5. 否则使用__dirname

    在所有情况下创建一个目录./mymodule

    【讨论】:

    • 谢谢。在 node.js 环境变量的帮助下设置自定义路径的第一步是一个非常好的选择。如果我在步骤 1-4 中找不到主文件夹,您是否建议回退到模块的目录?
    • 是的,我认为在这种情况下这是最好的选择。模块目录可以在用户全局模块中,也可以在虚拟环境的全局模块中。可能不是,但仍然是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2011-07-12
    • 2023-04-07
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多