如果您使用依赖于 libA(稳定)的 libT“测试”libA-dev,那么您并没有真正测试 libA-dev,因为它会在生产环境中运行。真正测试 libA-dev 的唯一方法是全力以赴,让 libT 依赖于 libA-dev。如果这破坏了您的单元测试,那么这是一件好事——它向您展示了需要修复的内容。
如果您没有单元测试,那么现在是开始制作它们的时候了(首先使用稳定的 libA 和 libT!)。
我建议使用“版本控制系统”(例如 bzr、hg、svn、git)。然后你可以创建你的项目的分支,“stable”和“devA”。
要在分支 devA 上工作,您首先要运行
export PYTHONPATH=/path/to/devA
通过确保 PYTHONPATH 环境变量排除其他分支,您可以确保 Python 只使用您想要的模块。
当需要从 dev --> stable 合并代码时,版本控制软件也将提供一种简单的方法来做到这一点。
版本控制还可以让您更加大胆——尝试重大更改并不可怕。如果事情没有解决,恢复是非常容易的。在这和 PYTHONPATH 技巧之间,您总是能够返回到已知的工作代码。
如果您觉得上面的方法根本不适合您,并且您必须使用 libT-which-depends-on-libA 来测试 libA-dev,那么您需要重命名所有模块并修改所有导入语句明确区分 libA-dev 和 libA。例如,如果 libA 有一个名为 moduleA.py 的模块,则将其重命名为 moduleA_dev.py。
命令
rename -n 's/^(.*)\.py/$1_dev.py/' *.py
将“_dev”添加到所有 *.py 文件中。(使用“-n”标志,重命名命令只会向您显示预期的重命名。删除“-n”以实际进行。)
要恢复重命名,请运行
rename -n 's/^(.*)_dev\.py/$1.py/' *.py
接下来,您需要将代码中对 moduleA 的所有引用更改为 moduleA_dev。命令
find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA/moduleA_dev/g' {} \;
将更改 LibA-dev 中的每个 *.py 文件,更改“moduleA”->“moduleA_dev”。
小心这个命令。这很危险,因为如果您有一个名为 moduleAB 的变量,那么它将被重命名为 moduleA_devB,而您真正想要的可能是 moduleAB_dev。
要恢复此更改(受上述警告的约束),
find /path/to/LibA-dev/ -type f -name '*.py' -exec sed -i 's/moduleA_dev/moduleA/g' {} \;
一旦你分离了命名空间,你就打破了循环依赖。一旦你对你的 libA-dev 感到满意,你可以更改 moduleA_dev.py --> moduleA.py 并更改代码中对 moduleA_dev --> moduleA 的所有引用。