我正在开发一个npm模块,用户可以通过执行命令与终端进行交互:
> mymodule init
> mymodule do stuff
执行某些命令时,会要求用户提供一些数据,这些数据将由模块使用。由于这些数据在使用模块时不会真正发生变化,并且由于这些命令可以非常频繁地执行,因此在任何时候运行命令时询问用户数据都不是最好的选择。所以我决定缓存这些数据,一旦它应该通过多个模块调用,我看到的最简单的存储方式就是一个文件(数据结构允许将它存储在一个简单的JSON中)。但我非常确定这个文件应该放在用户的机器上。
在文件系统中,我应该以文件的形式存储缓存,或者为自定义npm模块存储多个文件,考虑到模块本身可以在多个操作系统上全局安装,并且可以在多个项目同时进行?
我正考虑将其存储在模块的文件夹中,但在全局安装+多项目使用的情况下可能会很棘手。第二个想法是将它存储在特定于操作系统的tmp存储中,但我也不太确定。我也想知道在这种情况下是否有一些替代文件存储。
答案 0 :(得分:5)
我会在用户的主目录中创建一个隐藏文件夹(以点开头)。例如,/home/user/.mymodule/config.cfg
。用户的主目录不会去任何地方,并且点将确保它不在用户的方式之外,除非他们去寻找它。
这是大多数软件存储用户配置的标准方式,包括SSH,Bash,Nano,Wine,Ruby,Gimp甚至NPM本身。
答案 1 :(得分:3)
首先,你需要知道你在运行什么样的SO:
我建议您进行一系列检查以确定最佳位置。
process.ENV.MYMOD_HOME
是否存在,并使用它process.ENV.LOCALAPPDATA
process.ENV.HOMEPATH
'/home/user'
或'~'
__dirname
在所有情况下都要创建一个目录./mymodule
答案 2 :(得分:3)
在某些系统上,您可以通过创建存储缓存数据的子目录来缓存到~/.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);
})
}
只需声明一个获取app目录的函数即可。这应该可以处理大多数系统,但如果遇到不适合的情况,它应该很容易修复,因为你可以在这里创建一些备用逻辑。假设您希望允许用户稍后在配置文件中指定应用数据的自定义位置,您可以轻松添加该逻辑。目前,对于大多数Unix / Linux系统和Windows Vista及以上版本,这应该适用于大多数情况。
存储在系统临时文件夹中,根据系统的不同,您的缓存可能会在间隔(cron)或重新启动时丢失。使用全局安装路径会导致一些问题。如果您需要每个项目的此数据都是唯一的,那么您可以扩展该功能以允许您将此数据存储在项目根目录中,而不是模块根目录中。最好不要将它存储在模块根目录中,即使它只是作为本地/项目模块安装,因为用户无法在不包含整个模块的情况下将此文件夹包含在其存储库中。
因此,如果您需要存储与项目相关的缓存数据,那么您应该在项目根目录而不是node_modules
中执行此操作。否则,以系统无关的方式将其存储在用户主目录中。