阅读本文你可能需要的前置知识:
- windows命令行使用
- shell脚本使用
- 版本控制管理
序
在这几年的开发过程里遇到了一些问题,在解决问题的过程中学习到了一些非常有用的小技巧,于是准备逐个记录一下。
这些小技巧在成熟的公司或项目里可能会很常见,但对于个人开发者或者初创团队而言往往是一些盲区,有的可能是完全没有接触过,有的可能是没想过可以这么使用。
记录下来,希望可以对其他人有所帮助。
这一篇文章要讲的是目录连接
定义
目录链接这个词是微软在msdn上的翻译,英文叫Directory Junction,在linux上可能叫“符号链接”,它是一个文件夹中的一个链接,这个链接指向另一个文件夹。
换句话说,可以让一个文件夹在多处被使用,可以解决同一台电脑下文件夹的同步问题。
上面这个描述看起来非常像是windows系统的快捷方式,但它与快捷方式不同的是,快捷方式仅仅只是一个可以跳转到指定目标的文件,而目录链接则跟一个普通的目录没有区别,它可以被其他的应用作为一个普通的目录进行检测。
应用
那么这个功能有什么意义呢?
我们思考下面这样的场景:
我们团队里有两个人,一个美术一个程序,合作使用unity开发一个游戏,游戏使用NGUI开发,NGUI在使用图片的时候通常需要使用NGUI提供的打包工具进行图集打包,这个工具的使用范围是Unity内部。
在这时候就出现了几个问题:
- 我们导入的图片资源在实际项目里用不上,但每一次又需要把图片导入项目中
- 如果我们使用了版本管理,不管是SVN也好还是GIT或者其他的也好,每一次导入图片也同时需要把图片同步上传到版本管理里,如果美术也使用了其他的版本管理,那就意味着我们会额外多出来一份不必要的版本
- 每一次美术做完图片,都需要手动再往项目里导入一次,多出来一个手动步骤就很可能多出来一分出错的概率
但是这个几个问题如果使用目录链接就可以很简单地解决:
我们建立一个专门给美术出图的文件夹,所有出的图都分类放到这个文件夹的子目录下;然后把在unity项目中建议这个文件夹的目录连接,那么我们的unity就会自动使用这个文件夹。
- 我们不需要每一次都手动把图片导入项目,美术只需要把图片放到这个文件夹里,我们就能收到指定文件,如果我们做好了分类,那么编写一个自动化脚本调用NGUI的图集工具自动更新所有的图集即可,这就解决了前面1和3两个问题
- 我们也不需要把这部分图片文件加入版本管理,美术可以自由使用他们自己的版本,另一份版本也好、专门的图库也好,只要能进行版本管理即可。
当然,实际开发中遇到的问题可能不会这么简单,这个小技巧的使用范围也不仅限于所举的例子:
- AB包的原始资源非常巨大,改动多,加入版本管理会导致不必要的膨胀,那么可以把AB包的原始资源和代码项目分开,分别进行版本管理,那么资源和代码就形成了两个专用的版本;
- 公司中有一个中台,专门负责SDK的接入,那么所有的SDK都使用同一个导入的文件夹,这样SDK的版本和项目的版本就可以分离
- 等等等等
使用方法
前面说了上千个字,其实这个功能使用起来非常简单,在windows下,只需要在cmd中使用这样的代码就可以创建链接了:
mklink /j 目标目录 源目录
在具体项目中,我们还可以把创建链接的命令制作成脚本,在windows下制作成bat文件,直接运行即可。
举例
-
首先我们创建几个文件夹用于测试,现在几个文件夹都是空的:
-
使用我们的目录连接:
mklink /j "Target/sourceLink" "Source"
-
这时候如果进入“Target”,会发现里面多了个“sourceLink”图标:
如果我们在cmd中使用dir查看目录,会发现里面同样出现了"sourceLink",并且被标记为<JUNCTION>
,表示这是一个目录连接
-
进入sourceLink中创建一个文件,然后到Source中查看,会发现这是同一个文件夹,在任何一个里改动都会造成另一个改动,并且通过两个入口进入目录时显示的路径是不同的:
注意上面两张截图,从两个入口进入时,显示的路径是不同的。
-
删除链接时只需要像删除普通的文件夹那样删除就好了,删除链接本身是不会对源文件造成影响的:
-
如果对链接进行剪切,也会造成源文件夹的所有内容都被剪切到其他地方。
其他平台
除了windows,其他平台也是可以使用目录连接的。
比如MacOS和Linux下可以使用ln
命令进行制作:
ln -s souce linkName
Windows下使用PowerShell一样可以实现:
New-Item -Type Junction -Path LinkName -Value source
扩展
- 其实除了目录连接外,还有另一种硬连接,通常都针对具体的文件,可以对同一个文件建立不同的打开入口,有兴趣的同学也可以自己研究一下。
- 在windows下,使用mklink还有一个
/d
的选项,可以生成“目录符号链接”,但是在创建时需要对目标目录使用绝对路径,如下所示:
这种方式制作的文件其实就是windows下的快捷方式: