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

Node.js 我应该在哪里存储自定义CLI npm模块的缓存?,node.js,caching,npm,Node.js,Caching,Npm,我正在开发一个npm模块,用户可以通过终端执行命令与之交互: > mymodule init > mymodule do stuff 当执行某些命令时,用户被要求提供一些数据,模块将使用这些数据。由于该数据在使用模块时不会真正更改,而且这些命令可以非常频繁地执行,因此在用户运行命令时向其请求数据并不是最佳选择。所以我决定缓存这些数据,一旦它通过多个模块调用,我看到的最简单的存储方式就是文件(数据结构允许将其存储在简单的JSON中)。但是我很确定这个文件应该放在用户的机器上的什么地方

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

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

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


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

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


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

首先,您需要知道运行的是哪种类型:

  • 您最初的想法不错,因为全局模块在所有SO和所有虚拟环境中都不是真正的全局模块
  • 使用/home/user可能无法在Windows中工作。在windows中,您必须检查process.ENV.homephat
  • 我建议您进行一系列检查,以确定最佳地点

  • 让用户来控制。选择您自己的环境变量。我的家。首先检查是否存在
    process.ENV.MYMOD\u HOME
    ,并使用它
  • 检查windows标准是否
    process.ENV.LOCALAPPDATA
  • 检查windows标准
    process.ENV.HOMEPATH是否
  • 检查是否存在
    '/home/user'
    '~'
  • 否则,请使用
    \u目录名

  • 在所有情况下,在某些系统上创建一个目录
    /mymodule

    ,您可以通过创建一个子目录来存储缓存数据来缓存到
    ~/.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及更高版本的大多数情况

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


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

    谢谢您的回答。这似乎是一个很好的解决方案,有一种方法可以跨操作系统处理这些主文件夹。但是我最近偶然发现了一件事,这在最初的问题中没有提到,node.js和npm可以使用安装在同一台机器上的多个名称空间中,这是当今开发人员广泛使用的。正因为如此,我不知道如何采用这个全局主文件夹存储,以便在可能的多个npm安装中分别使用单独的全局名称空间和我的模块。@MichaelRadiov,在您的模块中,检查变量
    process.version
    ,以获取运行脚本的NodeJ的版本。然后,可以为每个节点版本创建单独的文件夹。例如,对于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
    的内容非常有用,我一定会使用它。谢谢谢谢你的详细回答。现在我明白了系统tmp文件夹是个坏主意。关于每个项目的数据问题:是的,在根目录中存储模块配置文件和项目特有的其他信息是一种很好的方法,但在我的例子中,我希望跨项目进行配置,这样用户可以对多个项目使用一种配置,甚至不使用任何项目。我认为这是一个需要考虑的独立问题,但OS主文件夹定义