Mise环境管理Skill mise-environment-management

这个技能是关于使用Mise工具来管理环境变量和项目设置,包括环境配置、路径管理、工具特定环境等。它可以帮助开发人员在不同目录中自动加载和切换环境,提高开发效率。关键词:Mise, 环境管理, 环境变量, DevOps, 工具配置, 项目设置, 目录特定配置。

DevOps 0 次安装 0 次浏览 更新于 3/25/2026

名称: 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: 工具特定环境配置