我应该在哪里存储自定义CLI npm模块的缓存?

Mic*_*nov 6 caching node.js npm

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

> mymodule init
> mymodule do stuff
Run Code Online (Sandbox Code Playgroud)

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

我应该在文件系统中以文件的形式存储缓存,还是为自定义npm模块存储多个文件,考虑到模块本身可以在多个操作系统上全局安装,并且可以同时在多个项目中使用?

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

tst*_*rzl 6

在某些系统上,您可以~/.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);
    })
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Max*_*ter 5

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

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

  • @MichaelRadionov在你的模块中,检查变量`process.version`以获得你的脚本正在运行的NodeJS的版本.然后,您可以为每个节点版本创建单独的文件夹.例如,对于NodeJS v0.10.25,您将拥有`/ home/user/.mymodule/0.10.25/config.cfg`,对于v0.6.8,您将拥有`/home/user/.mymodule/0.6.8/config. cfg`等 (2认同)