(我预见到这个问题可能发生在3个月前,并被告知要努力避免它.昨天,我被它咬了,很难,现在它花了我真钱,我很想解决它.)
如果我将我的一个Python源文件移动到另一个目录中,我需要记住告诉Mercurial它移动了(hg move).
当我使用Mercurial将新软件部署到我的服务器时,它会小心地删除旧的Python文件并在新目录中创建它.
但是,Mercurial并不知道同一目录中的pyc文件,并将其遗留下来.旧的pyc优先于同一目录中的其他模块使用新的python文件.
随之而来的不是欢闹.
当我移动python文件时,如何说服Mercurial自动删除旧的pyc文件?还有其他更好的做法吗?试图记住从所有Mercurial存储库中删除pyc文件是行不通的.
Hte*_*hno 16
如何在服务器端使用更新挂钩?把它放在存储库的.hg目录hgrc文件中:
[hooks]
update = find . -name '*.pyc' | xargs rm
Run Code Online (Sandbox Code Playgroud)
每当您在服务器上更新时,这将删除所有.pyc文件.如果你担心重建所有.pyc文件的成本,你总是可以在钩子中更聪明一点,只删除没有.py的.pyc,但这可能有点过分.
你需要:
1)真正的部署基础架构,即使它只是一个shell脚本,它可以完成所有任务.从源代码控制克隆/签出更新的副本不是部署策略.
2)任何部署系统都应该完全清理目录结构.我通常的偏好是每个部署都发生在一个名为date + timestamp的新目录中,而一个符号链接(名称如"current")更新为指向新目录.如果出现问题,这会在每台服务器上为您提供面包屑.
3)修复运行Python代码的任何内容.新的.py源文件应始终优先于缓存的.pyc文件.如果这不是您所看到的行为,那就是一个错误,您需要弄清楚它为什么会发生.
我实际上做了什么:
1) 我正在考虑 Nicholas Knight 关于使用正确部署策略的建议。我一直在阅读有关Buildout和Collective.hostout 的内容以了解更多信息。我需要决定这样的重量级策略对于我的项目相对简单的需求是否值得。
2)我在短期内采用了Ry4an的更新挂钩概念,直到我决定为止。
3)我忽略了 Ry4an 关于过度杀伤的警告,并编写了一个 Python 脚本来仅删除杂散的 .pyc 文件。
#!/usr/bin/env python
""" Searches subdirectories of the current directory looking for .pyc files which
do not have matching .py files, and deletes them.
This is useful as a hook for version control when Python files are moved.
It is dangerous for projects that deliberately include Python
binaries without source.
"""
import os
import os.path
for root, dirs, files in os.walk("."):
pyc_files = filter(lambda filename: filename.endswith(".pyc"), files)
py_files = set(filter(lambda filename: filename.endswith(".py"), files))
excess_pyc_files = filter(lambda pyc_filename: pyc_filename[:-1] not in py_files, pyc_files)
for excess_pyc_file in excess_pyc_files:
full_path = os.path.join(root, excess_pyc_file)
print "Removing old PYC file:", full_path
os.remove(full_path)
Run Code Online (Sandbox Code Playgroud)
我的更新挂钩现在调用此命令,而不是其他人建议的“查找”命令。
| 归档时间: |
|
| 查看次数: |
7489 次 |
| 最近记录: |