(Я предвидел эту проблему, мог бы произойти 3 месяца назад и был сказан быть прилежным для предотвращения его. Вчера, я был укушен им, трудно, и теперь, когда это стоило мне реальных денег, я стремлюсь зафиксировать его.)
Если я перемещаю один из своих исходных файлов Python в другой каталог, я должен не забыть говорить Подвижный, что он переместился (hg move
).
Когда я развертываю новое программное обеспечение на своем сервере с Подвижным, это тщательно удаляет старый файл Python и создает его в новом каталоге.
Однако Подвижный не знает о pyc файле в том же каталоге и оставляет его. Старый pyc используется преимущественно по новому файлу Python другими модулями в том же каталоге.
То, что следует, НЕ является весельем.
Как я могу убедить Подвижный автоматически удалить свой старый pyc файл, когда я перемещаю файл Python? Есть ли другая лучшая практика? Попытка не забыть удалять pyc файл из всех Подвижных репозиториев не работает.
Что я сделал на самом деле:
1) Я рассматриваю предложение Николаса Найта об использовании правильной стратегии развертывания. Я читал о Buildout и Collective.hostout, чтобы узнать больше. Мне нужно решить, стоит ли использовать такие тяжеловесные стратегии для относительно простых требований моего проекта.
2) Я взял на вооружение концепцию update hook от 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)
Теперь мои крючки обновления вызывают его, а не команды "find", предложенные другими.
Как насчет использования ловушки обновления на стороне сервера? Поместите это в файл hgrc
каталога репозитория .hg
:
[hooks]
update = find . -name '*.pyc' | xargs rm
Это приведет к удалению всех файлов .pyc при каждом обновлении на сервере. Если вас беспокоит стоимость восстановления всех файлов .pyc, вы всегда можете немного поумнее в ловушке и удалить только те .pyc, для которых нет .py, но это, вероятно, излишне.
Вам необходимо:
1) Реальная инфраструктура развертывания, даже если это просто сценарий оболочки, который все делает. Клонирование / извлечение обновленной копии из системы управления версиями не является стратегией развертывания.
2) Любая система развертывания должна полностью очищать структуру каталогов. Я обычно предпочитаю, чтобы каждое развертывание происходило в новом каталоге, названном с датой + отметкой времени, а символическая ссылка (с таким именем, как «текущий») обновлялась, чтобы указывать на новый каталог. Это дает вам хлебные крошки на каждом сервере, если что-то пойдет не так.
3) Исправить все, что запускает код Python. Новые исходные файлы .py всегда должны иметь приоритет над кешированными файлами .pyc. Если это не то поведение, которое вы наблюдаете, это ошибка, и вам нужно выяснить, почему это происходит.
Я использую файл .hgignore
для пропуска версий всех моих .pyc и .py~ (временные файлы редактора). Например, вот моя версия :
# use glob syntax.
syntax: glob
.directory
*.pyc
*~
*.o
*.tgz
*.tbz2
*.gz
*.bz2
Также добавление хука при обновлении для их удаления - тоже интересный трюк, если вы хотите не только игнорировать шум, но и удалить его из локальной рабочей области.