这可能是使用npm-config 的好地方。
在运行脚本时(参见 npm-scripts(7)),如果存在 <name>[@<version>]:<key> 的配置参数,则 package.json 的“config”键会在环境中被覆盖
我不会将它们用于每种类型的变量配置设置,但我认为它对于 URL 和端口等简单情况是一个很好的解决方案,因为:
- 您将它们直接放入 package.json。
- 此外,您可以在命令行中指定它们或将它们指定为 ENV 变量。
- 通过 npm 运行的任何东西都可以引用它们(例如,脚本)。
- 您可以使用 `npm config set foo:port 80 为每个用户设置它们
需要注意的是,package.json 中的 config 参数仅在您通过 npm 运行代码时才会自动导出到环境中。所以,如果你只是用节点运行它,比如node ./myapp.js,那么你不能指望process.env.npm_package_config_foo 会包含你的值。但是,您始终可以var pkg = require('./package.json'); 并访问pkg.config 的值。
因为它可能不会立即显而易见,我还要补充一点,npm_package_config 环境变量不会冒泡到依赖于你的 npm 包的应用程序。因此,如果您的依赖包引用process.env.npm_package_config_foo,则依赖包必须在其自己的 package.json 中定义它。我想因为它是一个“npm_package_config”,所以将它们一直推到树上是没有意义的。
那么,我将如何使用一个 npm 配置变量并让它在树上一直工作,在基础包和依赖它的包中?这实际上有点令人困惑,我不得不通过反复试验来解决这个问题。
假设您有一个包connector 和一个包client。 client 依赖于 connector 并且您想为 connector 指定一个可以在 client 中使用或覆盖的配置参数.如果您在 connector 模块中使用process.env.npm_package_config.port,那么当它在 client 模块中被依赖时,该变量将不会被导出,并且最终会是未定义的。
但是,如果您改为使用 process.env.npm_config_connector_port(注意第一个以 npm_package_config 开头,另一个以 npm_config_packagename 开头),那么您至少可以在您的.npmrc 使用 npm config set connector:port 80 并且它将在您运行 npm 的任何地方都“命名空间”为 process.env.npm__config_connector_port,包括您在 client 中运行的依赖于 connector 的脚本,以及您将始终能够在命令行、ENV 或 .npmrc 中覆盖它。您只需要记住,与任何环境变量一样,它可能并不总是被设置。所以,我会使用默认运算符,process.env.npm_config_connector_port 作为第一个(首选)值:
var port = process.env.npm_config_connector_port || sane_default
这里,sane_default 可以从其他推荐的方法之一填充。就个人而言,我喜欢至少将这些配置数据保存在 JSON 文件中,而 package.json 似乎是最好的 JSON 文件来放置它们。将它们存储在数据而不是代码中,然后你就可以轻松使用静态 JSON 内联、动态生成它们或从文件系统、URL 或数据库中提取它们。