dotenv mono
如果这个项目为您提供了帮助,请为我们提供明星?
描述
这是什么?
为了防止代码重复并增强可重复使用性,包括所有环境变量在内的集中配置可能很方便。而不是为每个软件包生成.env文件,我们可以在项目的根部使用一个.env文件。
这是一个允许MonorePo应用程序和软件包共享和加载集中式dotenv的软件包。它基于dotenv软件包。
它还包括一些额外的功能,例如操纵和节省Dotenv文件的更改,默认的集中文件以及具有订购和优先级的文件加载程序。
默认情况下启用了插件dotenv-expand。
结构示例
├── .env
├── .env.production
├── .env.defaults
├── packages
│ ├── ui-library
│ ├── other-library
├── apps
│ ├── web
│ │ ├── .storybook
│ ├── docs
它如何工作?
包装搜索第一个.ENV文件,与某些优先级标准匹配,通过行走parent the Parent Directories。
优先事项
从当前的流程目录开始,该软件包找到了第一个文件,该文件匹配了最优先级的最佳文件程序和文件名标准。 UP文件夹的深度越大,其优先级就越少。
可以在使用优先属性属性的配置上自定义优先级,请参见以下示例。
注意:NODE_ENV的允许值通常是测试,开发和生产。
| 优先事项 | 文件名 |
|---|---|
| 75 | .env。$(node_env).local |
| 50 | .env.Local |
| 25 | .env。$(node_env) |
| 1 | .env |
例子
给定以下文件夹结构,并带有DotEnv文件:
├── .env
├── .env.production
├── apps
│ ├── .env.development
│ ├── web
│ ├── docs
│ │ ├── .env
│ │ ├── .env.local
有以下优先顺序:
| 小路 | 优先事项 | 深度 |
|---|---|---|
| .env | 1 | 2 |
| .env.生产 | 25 | 2 |
| 应用/.env.开发 | 25 | 1 |
| 应用/文档/.env | 1 | 0 |
| apps/docs/.env.local | 50 | 0 |
然后,我们将有以下结果方案:
| 当前的工作目录 | env | 匹配 |
|---|---|---|
| / | 发展 | .env |
| / | 生产 | .env.生产 |
| 应用/网络 | 发展 | .env |
| 应用/网络 | 发展 | 应用/.env.开发 |
| 应用/文档 | 发展 | apps/docs/.env.local |
安装
从NPM或YARN安装库,只是运行以下命令行之一:
| NPM | 纱 |
|---|---|
| NPM安装dotenv-mono-保存 | 纱线添加dotenv-mono |
在Next.js上安装
对于next.js的自定义高级配置,您可以在项目目录的根(package.json旁边)中创建next.config.js或next.config.mjs文件。
在文件顶部添加以下行:
require ( \"dotenv-mono\" ) . load ( ) ;
例子
require ( \"dotenv-mono\" ) . load ( ) ; /** * @type { import(\'next\').NextConfig } */ const nextConfig = { /* config options here */ } ; module . exports = nextConfig ;
在故事书上安装
主配置文件是.storybook/main.js。该文件控制Storybook服务器的行为,因此您必须在更改它时重新启动Storybook的过程。
在文件上添加以下几行:
const dotenv = require ( \"dotenv-mono\" ) . load ( ) ; const config = { /* config options here */ env : ( config ) => { return { ... config , ... dotenv . env , } ; } , } ; module . exports = config ;
用法
加载
将环境变量从dotenv导出到工作过程中的简单方法。以下是基于您的偏好的几种潜在实施方法。
// Inline require ( \"dotenv-mono\" ) . load ( /* config */ ) ; // Using the function const { dotenvLoad } = require ( \"dotenv-mono\" ) ; dotenvLoad ( /* config */ ) ; // Using import import { dotenvLoad } from \"dotenv-mono\" ; const dotenv = dotenvLoad ( ) ; // Dotenv instance // Using the class const { Dotenv } = require ( \"dotenv-mono\" ) ; const dotenv = new Dotenv ( /* config */ ) ; dotenv . load ( ) ;
具有dotenv输出
如果您需要一种快速的方法将Dotenv软件包替换为Dotenv-Mono ,并且还需要具有复古兼容的功能,则可以使用Config方法直接将其直接备份到DOTENV软件包之类的输出。
// Inline const output = require ( \"dotenv-mono\" ) . config ( /* config */ ) ; // Using the function const { dotenvConfig } = require ( \"dotenv-mono\" ) ; const output = dotenvConfig ( /* config */ ) ;
带有扩展名的加载文件
// Use `.dotenv.server` or `.dotenv.server.local`, etc... load ( { extension : \"server\" } ) ;
加载特定的文件
// You can specify the file path load ( { path : \"../../configs/.env\" } ) ;
没有Dotenv-Expand扩展
load ( { expand : false } ) ;
更改默认文件名
load ( { defaults : \".env.def\" } ) ;
更改优先级
// If `.dotenv.overwrite` is present use it with max priority load ( { priorities : { \".env.overwrite\" : 100 , } , } ) ;
进行更改
const dotenv = require ( \"dotenv-mono\" ) . load ( ) ; dotenv . save ( { \"MY_ENV_1\" : \"enjoy\" } ) ; // Without loading into the working process const { Dotenv } = require ( \"dotenv-mono\" ) ; const dotenv = new Dotenv ( ) ; dotenv . loadFile ( ) ; // Skip loading into the process dotenv . save ( { \"MY_ENV_1\" : \"enjoy\" , \"MY_ENV_2\" : \"\'enjoy quotes\'\" , \"MY_ENV_3\" : 999 , } ) ;
预付
就像在CLI/控制台上的DotEnv软件包上一样,您可以使用-require(-r)命令行选项来预加载dotenv。通过这样做,您无需在应用程序代码中要求并加载DotEnv。
$ node -r dotenv-mono/load your_script.js
下面的配置选项以格式Dotenv_config_ <选项> = value的命令行参数支持。
$ node -r dotenv-mono/load your_script.js dotenv_config_path=/custom/path/to/.env dotenv_config_debug=true
此外,您可以使用环境变量来设置配置选项。命令行参数将在这些之前。
$ DOTENV_CONFIG_ < OPTION > =value node -r dotenv-mono/load your_script.js
$ DOTENV_CONFIG_ENCODING=latin1 DOTENV_CONFIG_DEBUG=true node -r dotenv-mono/load your_script.js dotenv_config_path=/custom/path/to/.env
CLI
您可以将Dotenv-Mono用作命令行工具来运行使用.ENV文件加载的环境变量的命令。这类似于dotenv-cli,但具有Dotenv-Mono的所有增强功能。
# Basic usage - load .env and run a command dotenv-mono -- node your_script.js # Load specific .env file dotenv-mono -e .env.production -- node your_script.js # Load multiple .env files dotenv-mono -e .env.local -e .env.production -- node your_script.js # Set additional variables dotenv-mono -v NODE_ENV=production -v DEBUG=true -- node your_script.js # Print a variable value dotenv-mono -p NODE_ENV # Debug mode - see what files would be loaded dotenv-mono --debug -e .env.production # Use all dotenv-mono features dotenv-mono --cwd /path/to/project --extension server --depth 3 -- node server.js
CLI选项
| 选项 | 描述 |
|---|---|
| – 帮助 | 打印帮助消息 |
| – 调试 | 输出要处理的文件,但实际上没有解析或运行命令 |
| -e <Path> | 将文件<路径>解析为.env文件,然后在环境中添加变量(多个允许) |
| -v <Name> = <value> | 使用<value>将变量<名称>放入环境中(多个允许) |
| -p <varible> | <variable>的打印值向控制台 |
| – 不扩散 | 跳过变量扩展 |
| – 跨越 | 覆盖系统变量 |
| -CWD <Path> | 指定当前的工作目录 |
| – 深度<数字> | 指定找到文件夹树时达到的最大深度 |
| – 编码<enc> | 指定包含环境变量的文件的编码 |
| – Extension <Ext> | 指定以加载仅在特定应用/软件包上使用的特定dotenv文件 |
| – 默认<文件> | 指定Dotenv文件名 |
| – 优先级<json> | 指定文件名优先级的标准,以加载为dotenv文件 |
方法
config
| 环境 | 描述 | 默认 |
|---|---|---|
| CWD | 指定当前的工作目录 | process.cwd() |
| 调试 | 打开/关闭日志记录以帮助调试为什么未设置某些键或值 | 错误的 |
| 默认值 | 指定默认值dotenv文件名(它不能覆盖任何环境变量) | .env.defaults |
| 深度 | 指定最大深度以从儿童目录中找到文件夹 | 4 |
| 编码 | 指定包含环境变量的文件的编码 | UTF8 |
| 扩张 | 打开/关闭Dotenv-Expand插件 | 真的 |
| 扩大 | 指定以加载仅在特定应用/软件包上使用的特定dotenv文件(ex .env.server …) | |
| 覆盖 | 覆盖机器上已经设置了带有.env文件值的所有环境变量 | 错误的 |
| 小路 | 如果包含环境变量的文件位于其他地方,则指定自定义路径 | |
| 优先事项 | 指定文件名优先级的标准,以加载为dotenv文件 | 请参阅优先级 |
dotenv方法
负载环境
它将按照标准读取您的.env文件,解析内容,将其分配给process.env。
注意:此方法与以前的加载函数不同。因为它要求通过构造函数在类实例上加载配置。
public load(loadOnProcess: boolean): Dotenv;
加载文件
它将按照标准读取您的.env文件,解析内容,准备以编程方式读取或更改。
public loadFile(): Dotenv;
节省
将输入的数据与加载或LoadFile的加载数据合并,并保存原始Dotenv文件上的更改。
注意:如果存在.env.defaults,则不会被覆盖,您可以将更改保存在主dotenv文件上(.env,.env.local等…)
public save(changes: Record<string, any>): Dotenv;
解析
在此处查看dotenv文档
public parse<T extends Record<string, any> = Record<string, any>>(src: string | Buffer): T;
?如何贡献
有一个主意吗?找到一个错误?请提出问题或提取请求。欢迎捐款,并非常感谢!每一点都有帮助,并且将永远给予信用。
