名称: mise-environment-management 用户可调用: false 描述: 当使用Mise管理环境变量和项目设置时使用。涵盖环境配置、direnv替换和每目录设置。 允许工具:
- 读取
- 写入
- 编辑
- Bash
- Grep
- Glob
Mise - 环境管理
使用Mise管理环境变量、项目设置和目录特定配置。
基本环境变量
定义环境变量
# mise.toml
[env]
NODE_ENV = "production"
DATABASE_URL = "postgresql://localhost/myapp"
API_KEY = "development-key"
LOG_LEVEL = "info"
加载环境
# 激活mise环境
mise activate bash # 或 zsh, fish
# 或使用 mise exec
mise exec -- node app.js
# 或 mise run
mise run start
高级环境配置
模板变量
[env]
PROJECT_ROOT = "{{ config_root }}"
DATA_DIR = "{{ config_root }}/data"
LOG_FILE = "{{ config_root }}/logs/app.log"
环境文件加载
[env]
_.file = ".env"
_.file = [".env", ".env.local"]
条件环境变量
[env]
# 基于其他变量设置
DATABASE_URL = "postgresql://{{ env.DB_HOST | default(value='localhost') }}/{{ env.DB_NAME }}"
路径管理
添加到 PATH
[env]
_.path = [
"{{ config_root }}/bin",
"{{ config_root }}/scripts",
"/usr/local/bin"
]
库路径
[env]
LD_LIBRARY_PATH = "{{ config_root }}/lib:$LD_LIBRARY_PATH"
DYLD_LIBRARY_PATH = "{{ config_root }}/lib:$DYLD_LIBRARY_PATH"
工具特定环境
Python虚拟环境
[tools]
python = "3.12"
[env]
_.python.venv = { path = ".venv", create = true }
VIRTUAL_ENV = "{{ config_root }}/.venv"
Node.js环境
[tools]
node = "20.10.0"
[env]
NODE_ENV = "development"
NODE_OPTIONS = "--max-old-space-size=4096"
NPM_CONFIG_PREFIX = "{{ config_root }}/.npm-global"
Go环境
[tools]
go = "1.21"
[env]
GOPATH = "{{ config_root }}/.go"
GOBIN = "{{ config_root }}/.go/bin"
GO111MODULE = "on"
替换 direnv
基本 direnv 替换
# 代替 .envrc
# export DATABASE_URL=postgresql://localhost/myapp
# export NODE_ENV=development
# 使用 mise.toml
[env]
DATABASE_URL = "postgresql://localhost/myapp"
NODE_ENV = "development"
允许目录
# mise.toml - 标记为受信任
[settings]
experimental_monorepo_root = true # 信任子目录
监视文件更改
Mise 在 mise.toml 更改时自动重新加载,类似于 direnv。
分层配置
全局设置
# ~/.config/mise/config.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "您的姓名"
GIT_AUTHOR_EMAIL = "you@example.com"
项目设置
# ~/projects/myapp/mise.toml
[env]
PROJECT_NAME = "myapp"
DATABASE_URL = "postgresql://localhost/myapp"
本地覆盖
# ~/projects/myapp/mise.local.toml (gitignored)
[env]
DATABASE_URL = "postgresql://localhost/myapp-dev"
DEBUG = "true"
敏感数据
环境文件
# mise.toml
[env]
_.file = ".env.local" # Gitignored 文件包含秘密
# .env.local (添加到 .gitignore)
API_KEY=secret-key-here
DATABASE_PASSWORD=secret-password
使用系统环境
[env]
# 引用现有环境变量
API_KEY = "$API_KEY"
DATABASE_URL = "$DATABASE_URL"
安全秘密管理
# 不要将秘密提交到 mise.toml
# 相反,从外部秘密管理器引用
# 使用 1Password CLI 的示例
mise exec -- op run -- node app.js
# 或从加密文件加载
mise exec -- sops exec-env .env.encrypted -- node app.js
Mise 环境变量
内置变量
Mise 自动提供这些变量:
$MISE_ORIGINAL_CWD # 调用 mise 的目录
$MISE_CONFIG_ROOT # 包含 mise.toml 的目录
$MISE_PROJECT_ROOT # 项目根目录
$MISE_DATA_DIR # Mise 数据目录
$MISE_CACHE_DIR # Mise 缓存目录
在配置中使用
[env]
PROJECT_ROOT = "{{ env.MISE_PROJECT_ROOT }}"
CONFIG_FILE = "{{ env.MISE_CONFIG_ROOT }}/config.yaml"
配置验证
检查当前环境
# 显示当前环境
mise env
# 显示特定变量
mise env DATABASE_URL
# 导出为 shell 命令
mise env -s bash > .env.sh
source .env.sh
验证配置
# 检查加载的配置文件
mise config
# 显示解析的设置
mise settings
最佳实践
分离公共和私有配置
# mise.toml (已提交)
[env]
NODE_ENV = "development"
LOG_LEVEL = "info"
API_URL = "https://api.example.com"
# mise.local.toml (gitignored)
[env]
API_KEY = "secret-key"
DATABASE_PASSWORD = "secret-password"
使用描述性变量名称
# 好:清晰、描述性名称
[env]
DATABASE_CONNECTION_POOL_SIZE = "10"
API_REQUEST_TIMEOUT_MS = "5000"
FEATURE_FLAG_NEW_UI = "true"
# 避免:模糊缩写
[env]
DB_POOL = "10"
TIMEOUT = "5000"
FLAG = "true"
文档化必需变量
# mise.toml
[env]
# 数据库配置(必需)
DATABASE_URL = "postgresql://localhost/myapp"
# API 密钥(在 mise.local.toml 中设置)
# API_KEY = "your-key-here"
# 可选功能标志
FEATURE_ANALYTICS = "false"
使用路径模板
# 好:相对于配置根目录
[env]
DATA_DIR = "{{ config_root }}/data"
LOGS_DIR = "{{ config_root }}/logs"
# 避免:硬编码路径
[env]
DATA_DIR = "/Users/me/project/data"
常见模式
多环境设置
# mise.toml - 基本配置
[env]
APP_NAME = "myapp"
LOG_FORMAT = "json"
# mise.development.toml
[env]
NODE_ENV = "development"
DEBUG = "true"
DATABASE_URL = "postgresql://localhost/myapp_dev"
# mise.production.toml
[env]
NODE_ENV = "production"
DEBUG = "false"
DATABASE_URL = "postgresql://prod-server/myapp"
# 切换环境
ln -sf mise.development.toml mise.local.toml
# 或
ln -sf mise.production.toml mise.local.toml
数据库配置
[env]
DATABASE_HOST = "localhost"
DATABASE_PORT = "5432"
DATABASE_NAME = "myapp"
DATABASE_USER = "postgres"
DATABASE_URL = "postgresql://{{ env.DATABASE_USER }}:{{ env.DATABASE_PASSWORD }}@{{ env.DATABASE_HOST }}:{{ env.DATABASE_PORT }}/{{ env.DATABASE_NAME }}"
功能标志
[env]
# 功能切换
FEATURE_NEW_DASHBOARD = "true"
FEATURE_BETA_API = "false"
FEATURE_EXPERIMENTAL_CACHE = "true"
# 功能推出百分比
FEATURE_NEW_CHECKOUT_ROLLOUT = "25"
CI/CD 环境
# mise.toml
[env]
NODE_ENV = "{{ env.CI | default(value='development') }}"
SKIP_PREFLIGHT_CHECK = "{{ env.CI | default(value='false') }}"
反模式
不要提交秘密
# 坏:秘密在已提交文件中
[env]
API_KEY = "sk-secret-key-12345"
DATABASE_PASSWORD = "password123"
# 好:从安全位置引用
[env]
_.file = ".env.local" # Gitignored
不要复制全局配置
# 坏:在每个项目中重复全局设置
# ~/project-a/mise.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "您的姓名"
# ~/project-b/mise.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "您的姓名"
# 好:使用全局配置
# ~/.config/mise/config.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "您的姓名"
不要硬编码环境名称
# 坏:硬编码检查
[tasks.deploy]
run = '''
if [ "$NODE_ENV" = "production" ]; then
./deploy-prod.sh
fi
'''
# 好:使用配置
[tasks.deploy]
env = { DEPLOYMENT_TARGET = "production" }
run = "./deploy.sh"
高级模式
动态环境加载
[env]
# 基于 git 分支加载环境
BRANCH = "{{ exec(command='git branch --show-current') }}"
DEPLOY_ENV = "{{ env.BRANCH | replace(from='main', to='production') | replace(from='develop', to='staging') }}"
计算变量
[env]
PROJECT_NAME = "myapp"
NAMESPACE = "{{ env.PROJECT_NAME }}-{{ env.ENVIRONMENT }}"
REDIS_URL = "redis://{{ env.NAMESPACE }}-redis:6379"
环境继承
# 基本配置
[env]
LOG_LEVEL = "info"
CACHE_TTL = "3600"
# 在特定上下文中覆盖
[env.production]
LOG_LEVEL = "warn"
CACHE_TTL = "7200"
相关技能
- task-configuration: 在任务中使用环境变量
- tool-management: 工具特定环境配置