aactivator
aactivator
是一个简单的工具,可以在进入和退出项目环境时自动加载("激活")和取消加载项目环境。
aactivator 的主要特点包括:
- 在加载之前未见过的目录时进行提示。
- 拒绝加载可被他人修改的文件。
- 对
bash
和zsh
都提供一流支持。 - 经过良好测试,对两种支持的 shell 都进行了集成测试。
aactivator 支持 Python 2.7、3.4+;除标准库外没有其他依赖。
aactivator 接口
aactivator 为项目提供了一个简单的接口,通过项目根目录下的两个文件实现:
-
.activate.sh
,在进入时由 shell 加载。如果使用 Python 虚拟环境,通常最好将
.activate.sh
符号链接到虚拟环境内的bin/activate
文件。 例如,ln -s venv/bin/activate .activate.sh
。这个符号链接可以直接提交到 git(只需确保使用相对符号链接,如前面的命令所示)。 -
.deactivate.sh
,在退出时由 shell 加载。对于 Python 项目,这通常只是一个包含
deactivate
的单行文件,不过可以根据特定项目需求进行修改。
注意,这两个文件都不需要是可执行的,也不需要包含 shebang。这是因为它们是被加载(在当前 shell 中运行)而不是执行的。
安装到你的 shell
我们建议将 aactivator
添加到你的 shell 配置中。在日常使用中它不会打扰你,只有当你 cd
进入支持 aactivator 的项目目录时,你才会注意到它在工作。
首先,你需要在系统某处安装 aactivator
二进制文件。你有几个选择:
-
只需将
aactivator.py
脚本 复制到系统的某个位置,并使其可执行(chmod +x aactivator.py
)。它除了 Python 标准库外没有其他依赖。 -
通过 pip 安装(
pip install aactivator
)。你可以选择系统级安装、安装到家目录或安装到虚拟环境中(由你选择)。 -
安装 Debian 软件包。这是系统级自动安装的最佳选择,并提供其他便利功能,如 man 页面。 你可以在 GitHub 的 Releases 标签下找到预构建的 Debian 软件包。
安装好 aactivator
后,你需要在登录时启用它。只需将以下行添加到家目录中的 .bashrc
(或 zsh 的 .zshrc
)文件中:
eval "$(aactivator init)"
(如果你没有将 aactivator
安装到 $PATH
中的某个位置,可能需要在 aactivator
前加上二进制文件的完整路径)。
动机
自动加载虚拟环境对大型项目来说是一个巨大的福音。这意味着你可以直接执行像 pytest
这样的工具,而且项目还可以为贡献者注册命令行工具(通过 setuptools 的 console_scripts
入口点)。
安全考虑
我们尽力确保这不会成为一个巨大的任意代码执行漏洞。主要有两重保护:
-
aactivator
在加载之前未见过的目录时会询问。你可以选择不加载一次、永不加载或加载。对于你不信任的项目代码,不应选择加载。然而,值得记住的是,运行测试、构建虚拟环境或运行该项目的任何代码时都存在同样的考虑。 加载虚拟环境与这些操作一样危险。
-
aactivator
拒绝加载可被他人修改的环境文件。它通过从当前目录向上递归直到遇到文件系统边界,并检查文件(及其所有父目录)是否只能被你和root
修改来实现这一点。
aactivator 的替代方案
已经存在一些 aactivator
的替代方案。例如:
与 aactivator 相比,这些替代方案至少存在以下一个问题:
- 在加载目录前不询问(或记住)权限
- 离开项目目录时不会取消激活
- 通过覆盖
cd
内置命令来工作(这意味着像popd
或其他改变目录的方法无法正常工作) - 缺乏对
zsh
的支持 - 不执行重要的安全检查(参见上面的"安全"部分)