跳到主要内容

软链接和硬链接理解

  • 软链接:像“快捷方式”,指向另一个路径

  • 硬链接:像“同一份文件的另一个名字”,本质还是同一份内容

区别:

  • 硬链接:“共享同一份文件数据”
    • 多个文件名直接指向同一份文件数据
      • 看起来像有多份文件,实际底层数据只有一份
      • 比如A、B、C有3份文件,这3份文件都是指向同一份文件数据
        • 如果删除A文件,那么B、C 文件还是在,因为数据还在
        • 修改其中一个,本质上就是在修改那一份共享数据
  • 软链接:“共享同一个真实位置”
    • 共享一个文件路径,如果真实路径删除了,其他文件引用的路径就会失效
    • 其他文件都是指向共享同一个路径
    • 软链接不是一份独立文件内容,它只是“指向真实路径”

记忆:

  • 软链接 = 快捷方式 = 路径跳转
  • 硬链接 = 别名 = 同一份内容的多个名字

软链接:

  • A、B、C 都只是入口,真正存内容的是 real.txt

  • 所以如果你通过 A 增加内容,比如追加一行,本质上是给 real.txt 增加内容。 那 B、C 再打开时,看到的也会是修改后的内容

bash
A -> real.txt
B -> real.txt
C -> real.txt

JS代码层面理解

硬链接:

  • 多个对象,指向同一个文件数据 (指向同一个堆内存地址)
  • 多个变量引用同一个对象
bash
const obj = { name: 'skill-a' };
const a = obj;
const b = obj;

a.version = 1;
console.log(b.version); // 1

a ----\
> 同一份文件数据
b ----/

软链接

  • 从js角度,软链接就像一个代理对象,这个代理对象返回原始对象的引用
  • 删除了原始对象,那么代理对象就会找不到对应的目标路径,就会报错
js
let originObj = { name: '这是一个原始对象' }

let proxyObj = {
getRealObj: () => originObj
}

相关应用场景​

  • 1、前端开发中应用场景
  • 2、版本部署中,应用场景
  • 3、skills安装,通过软链接方式理解

前端开发中应用场景​

  • 本地联调组件库

    • 好处是改完组件库,业务项目马上能看到效果
    • 业务项目通过软链接引用本地组件库
    • 无需每次发布到npm
  • monorepo理解

    • 多个 package 放在一个仓库里统一管理
    • 包多、重复依赖多,彼此引用频繁、包互相引用
    • 软链接可以帮助本地包之间建立引用关系
  • pnpm理解

    • 硬链接:复用依赖包内容,减少磁盘占用
    • 软链接:组织和管理 node_modules 中各个包的结构
    • 可以简单理解为:
      • 硬链接负责“省空间”
      • 软链接负责“包之间结构”

版本部署中,应用场景​

  • 部署时常用软链接把 current 指向某个发布目录
  • 发布新版本时,只需要把软链接切到新目录
  • 回滚时,再切回旧目录即可

可以更方便切换版本

skills 安装​

  • 当通过npm方式来安装skills时,会选择相关模型添加到对应skills,以及会选择添加skills的方式是软连接还是直接copy目录,推荐是软链接
  • 在agent目录下建立一个“入口”,这个入口实际指向 skills 的真实位置路径
  • 软链接可以让多个 agent 共享同一个来源skills技能
  • 单一来源 :所有 agent 指向同一套 skills
  • 易于更新 :更新一次,所有 agent 同步生效
  • 节省空间 :不重复存储相同文件