我正在编写一个 nodejs cli 实用程序(旨在全局安装的 NPM 模块),它需要存储一些用户提供的值。在系统上存储这些值的最佳方式是什么?
例如,我是否应该在 say: 下创建自己的配置文件/etc/{my-utility-name}/conf.json
并在我的install
脚本中初始化这个目录+文件
我正在编写一个 nodejs cli 实用程序(旨在全局安装的 NPM 模块),它需要存储一些用户提供的值。在系统上存储这些值的最佳方式是什么?
例如,我是否应该在 say: 下创建自己的配置文件/etc/{my-utility-name}/conf.json
并在我的install
脚本中初始化这个目录+文件
查看问题和评论,我认为有两个问题需要解决:
保存位置:如果有用户特定的设置,那么按照 Linux 中的常见模式,最好将其保存在用户主目录的隐藏目录中。因此,您最好将其保存在目录 $HOME/.{yourAppName}/someFile
例如:Pidgin 将其保存在:/home/kushal/.purple/... (文件夹名称的“.”前缀使其隐藏)
您可以将其保存在:/home/$HOME/.myawesomeNPMModule/...
注意:如果您还针对 Windows 平台,则需要进行平台检查并决定使用哪个路径。
在 Windows Vista 及更高版本中,它位于 $WIN_INSTALLATION_DRIVE\Users\$USER_NAME\AppData\Local\YourAppName...
在 Windows XP 中,它位于 $WIN_INSTALLATION_DRIVE\Documents and Settings\$USER_NAME\Local Settings\Application Data\Local\YourAppName\...
是的,跨平台使生活变得困难,或者至少添加了一些 IF 语句。;)
如何保存:您可以轻松地将凭据保存在 JSON 文件中。现在,由于您需要保护数据并且不被非法访问读取,因此最好的方法是对其进行加密。NodeJs Crypto 模块非常易于使用,您可以在几行代码中使用它来加密/解密您的设置文件。您的应用程序将只知道加密密码,因此您的应用程序将只能解密它。
我会推荐 AES-192 来加密文件。
希望能帮助到你!!
我发现 yeoman 项目有一个名为configstore的包。我试过了,API 非常简单易用,并且消除了对操作系统兼容性的任何担忧。
获取和设置配置非常简单:
const Configstore = require('configstore')
const config = Configstore(packageName, defaults)
config.set(key, value)
config.get(key)
Yeoman 是一个经过良好测试的大型项目,因此他们在项目中构建和使用它的事实应该表明这是一个安全稳定的包,可以在您自己的项目中使用。
如果您的设置数量有限,则可以使用 JSON 文件。如果您有更复杂的设置或配置,请考虑使用 SQLite 文件之类的文件,以便于检索。
无论如何,将该文件保存在不需要提升权限的目录中。此外,如果它对用户来说是唯一的,则可以考虑将文件保存在用户的主目录下。
我编写了cli-config API 来管理 NodeJS 应用程序配置,包括:
访问 https://github.com/tohagan/cli-config 了解更多详情。
组合包文件中的配置选项,defaults.config
然后~/.<appname>.config
是命令行选项,然后强制debug
选项为true
. 使用浅合并,因此仅合并顶级属性。
var config = require('../cli-config')
.getConfig({dirname: __dirname, override: {debug: true}});
从包中深度合并嵌套配置设置,defaults.config
然后是./config.json
命令行选项。如果./config.json
不存在,则从中克隆一个副本,defaults.config
以便用户将来可以使用它来覆盖defaults.config
。
var config = require('../cli-config').getConfig({
dirname: __dirname,
clone: true,
configFile: './config.json',
merge: 'deep'
});
命令行解析器返回一个可用于覆盖系统设置或用户设置选项的对象。您可以使用cli选项配置此解析器。有关命令行解析选项的更多详细信息,请参阅minimist。
var config = require('../cli-config').getConfig({
dirname: __dirname,
cli: {
boolean: {
'd': 'debug',
'v': 'verbose'
}
}
});
将 config.debug 和 config.verbose 选项设置为 true。
$ myapp -d -v