# 软链接策略 > 使用符号链接(Symbolic Link)实现软件版本管理和无缝切换的最佳实践。 ## Overview 软链接策略是一种软件版本管理技术,通过创建指向不同版本目录的符号链接,实现: - 简化启动命令 - 实现无缝版本升级 - 避免配置文件中的硬编码路径 ## Core Concept ``` /opt/frp/ ├── frp_0.65.0_darwin_arm64/ # 实际安装目录 ├── frp_0.66.0_darwin_arm64/ # 新版本目录 └── current -> frp_0.65.0_darwin_arm64/ # 软链接指向 current ``` ## Why Use Symlinks? | 优势 | 说明 | |------|------| | 简化路径 | 启动命令使用 `/opt/frp/current/frpc` 而非长版本号路径 | | 快速升级 | 只需修改软链接,无需更新配置或启动脚本 | | 版本回滚 | 出现问题时快速切换回旧版本 | | 保持兼容性 | 配置文件中使用稳定路径,升级不受影响 | ## Implementation ### 创建软链接 ```bash # 创建指向特定版本的软链接 ln -sfn /opt/frp/frp_0.65.0_darwin_arm64 /opt/frp/current # 验证 ls -la /opt/frp/current # lrwxr-xr-x 1 user staff 35 Apr 14 10:00 /opt/frp/current -> frp_0.65.0_darwin_arm64 ``` ### 升级版本 ```bash # 1. 下载并解压新版本 wget https://github.com/fatedier/frp/releases/download/v0.66.0/frp_0.66.0_darwin_arm64.tar.gz tar -xzf frp_0.66.0_darwin_arm64.tar.gz # 2. 停止旧版本服务 launchctl stop com.frpc.client # 或 pkill frpc # 3. 切换软链接 ln -sfn /opt/frp/frp_0.66.0_darwin_arm64 /opt/frp/current # 4. 验证 ls -la /opt/frp/current # 确认指向新版本 # 5. 启动服务 launchctl start com.frpc.client ``` ### 回滚版本 ```bash # 停止服务 launchctl stop com.frpc.client # 切换回旧版本 ln -sfn /opt/frp/frp_0.65.0_darwin_arm64 /opt/frp/current # 启动服务 launchctl start com.frpc.client ``` ## Launchd Integration ```xml ProgramArguments /opt/frp/current/frpc -c /opt/frp/current/frpc.toml ``` ## Best Practices ### Directory Structure ``` /opt// ├── _v1.0.0/ ├── _v1.1.0/ ├── _v1.2.0/ ├── current -> _v1.2.0/ └── configs/ # 可选:配置文件独立存放 ├── v1.0.0.toml ├── v1.1.0.toml └── current.toml -> v1.2.0.toml ``` ### Naming Convention - 版本目录:`_v..__` - 软链接名称:`current`(行业标准)或 `-latest` ### Security Considerations 1. **保持链接目标存在**:删除旧版本前确保软链接已切换 2. **使用绝对路径**:`ln -sfn` 使用绝对路径避免相对路径问题 3. **验证后再启动**:切换后验证软链接,再启动服务 ## Use Cases - **FRP**:版本升级无需修改 launchd plist - **Docker**:使用 `:latest` 标签的软链接等价物 - **Node.js**:nvm 使用软链接管理多版本 - **Python**:pyenv 使用软链接切换版本 ## Related Concepts - [[frp]] — 软链接策略的典型应用场景 - [[launchd]] — 使用软链接路径的服务管理 - [[内网穿透]] — 需要版本管理的服务 ## References - `man ln` - `man readlink`