我应该在哪里存储自定义CLI npm模块的caching?
我正在开发一个npm模块,用户可以通过执行命令通过terminal与它交互:
> mymodule init > mymodule do stuff
当执行某些命令时,用户被要求input一些数据,这些数据将被模块使用。 由于这些数据在使用模块时并不会真正改变,而且由于这些命令可以相当频繁地执行,所以在任何时候运行命令都不问问用户数据的最佳select。 所以我决定caching这些数据,一旦它通过多个模块调用,最简单的方法来存储它,我看到的是一个文件(数据结构允许它存储在一个简单的JSON)。 但我很确定这个文件应该放在用户的机器上。
考虑到模块本身可以全局安装在多个操作系统上,并且可以在多个项目中同时使用,我应该在文件系统中的哪个位置以文件或多个文件的forms存储caching?
我正在考虑将其存储在模块的文件夹中,但在全局安装+多项目使用的情况下可能会非常棘手。 第二个想法是将其存储在操作系统特定的tmp存储中,但是我也不太确定。 我也想知道在这种情况下是否有一些文件存储的替代品。
在某些系统上,你可以通过创build一个子目录来caching~/.cache
来存储你的caching数据,尽pipe它在用户主目录下创build一个隐藏目录的应用程序更为常见。 在现代Windows机器上,您可以使用在C:/Users/someUser/AppData
创build一个目录。 在Windows中使用一个.
后缀不会隐藏文件。 我build议你做一些平台不可知论的东西,如:
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); }) }
只要声明一个函数来获取应用程序目录。 这应该可以处理大多数系统,但是如果遇到这种情况,应该很容易解决,因为在这里可以创build一些替代逻辑。 比方说,你想让用户稍后在configuration文件中指定应用程序数据的自定义位置,你可以很容易地添加该逻辑。 现在,这应该适用于大多数Unix / Linux系统和Windows Vista以上的大多数情况。
存储在系统临时文件夹中,具体取决于系统,caching可能在间隔(cron)或重新引导时丢失。 使用全球安装path会导致一些问题。 如果您需要这些数据在每个项目中都是唯一的,那么您可以扩展该function,以便将此数据存储在项目根目录中,而不是模块根目录中。 最好不要将它存储在模块根目录中,即使它只是作为本地/项目模块来安装,因为那样用户就不能在不包含整个模块的情况下将这个文件夹包含在它的存储库中。
因此,如果需要存储与项目相关的caching数据,则应该在项目根目录下而不是在node_modules
。 否则以系统不可知的方式将其存储在用户主目录中。
我会在用户的主目录中创build一个隐藏文件夹(以点开头)。 例如,/ /home/user/.mymodule/config.cfg
。 用户的主目录不在任何地方,并且点将确保它不在用户的方式,除非他们去寻找它。
这是大多数软件商店用户configuration的标准方式,包括SSH,Bash,Nano,Wine,Ruby,Gimp,甚至NPM本身。
首先,你需要知道你正在运行什么样的SO:
- 你原来的想法并不差,因为全球模块在所有的虚拟环境中都不是真正的全球化。
- 在Windows中使用/ home / user可能不起作用。 在Windows中,你必须检查process.ENV.HOMEPAHT
我build议你一连串的检查,以确定最好的地方。
- 让用户来控制。 select你自己的envvariables。 发件人MYMOD_HOME。 你会检查是否存在
process.ENV.MYMOD_HOME
,并使用它 - 检查windows标准
process.ENV.LOCALAPPDATA
- 检查windows标准
process.ENV.HOMEPATH
- 检查是否存在
'/home/user'
或'~'
- 否则使用
__dirname
在所有情况下,创build一个目录./mymodule