在软件项目中,经常需要写一些脚本来自动化执行一些任务。这里就有一个问题,脚本中的相对路径应该以什么为基准?目前我见过的常用方法有两种:
以当前工作目录(CWD)为基准。这种方法是最简单直接的,但是缺点也很明显。首先是在终端执行脚本的时候,就必须在正确的目录下执行。其次就是当其他进程调用脚本时,也必须确保 CWD 设置正确。事实上,CWD 可以看作是操作系统提供的一个进程级别的全局变量。本身依赖于全局变量就不是一件非常优雅的事情。
以脚本文件所在目录为基准。这种方法克服了上一种方法的缺点,但是却带来了一个新的问题:如果脚本文件被移动,那么脚本中的相对路径也要随之修改。
那么,有没有一种不依赖于 CWD,又能允许脚本随意移动的方法呢?这就是 Git 所采用的方法:使用一个特殊的文件或者目录作为锚定点。在 Git 中,一个 Git 仓库的根目录下会有一个 .git
目录。当执行git
命令的时候,Git 会从当前目录开始一层一层往上,找到第一个含有.git
目录的目录作为仓库的根目录。
我们可以借鉴这个思路,选取一个特殊的文件作为项目根目录的标记,例如.HERE_IS_ROOT
,然后在脚本中寻找这个文件。下面是一个 Python 的例子:
from pathlib import Path
root_dir = Path(__file__).resolve().parent
while not (root_dir / '.HERE_IS_ROOT').exists():
root_dir = root_dir.parent