Мы широко используем py2app на нашем предприятии для создания автономных пакетов .app для простого внутреннего развертывания без проблем с зависимостями. Что-то, что я недавно заметил и понятия не имею, как это началось, заключается в том, что при создании .app py2app начал включать каталог .git нашей основной библиотеки.
Например, commonLib — это наш корневой пакет библиотеки Python, который представляет собой репозиторий git. В этом пакете находятся различные подпакеты, такие как база данных, утилита и т. д.
commonLib/
|- .git/ # because commonLib is a git repo
|- __init__.py
|- database/
|- __init__.py
|- utility/
|- __init__.py
# ... etc
В данном проекте, скажем, Foo, мы будем выполнять импорт, например from commonLib import xyz
, чтобы использовать наши общие пакеты. Сборка через py2app выглядит примерно так: python setup.py py2app
Итак, недавняя проблема, которую я вижу, заключается в том, что при создании приложения для проекта Foo я увижу, что оно включает все в commonLib/.git/ в приложение, что является дополнительным раздуванием. py2app имеет опцию exclude, но, похоже, это только для модулей python. Я не могу понять, что нужно, чтобы исключить подкаталог .git, или, на самом деле, что заставляет его быть включенным в первую очередь.
Кто-нибудь сталкивался с этим при использовании импорта пакета python, который является репозиторием git? В наших файлах setup.py для каждого проекта ничего не изменилось, а commonLib всегда был репозиторием git. Таким образом, единственное, что я могу представить как переменную, — это версия py2app и ее приложений, которые, очевидно, со временем обновлялись.
Изменить
На данный момент я использую последнюю версию py2app 0.6.4. Кроме того, мой setup.py был впервые сгенерирован из py2applet некоторое время назад, но с тех пор был настроен вручную и скопирован в качестве шаблона для каждого нового проекта. Я использую PyQt4/sip для каждого из этих проектов, поэтому я также задаюсь вопросом, не проблема ли это с одним из рецептов?
Обновлять
Из первого ответа я пытался исправить это, используя различные комбинации настроек exclude_package_data
. Кажется, ничто не заставляет каталог .git исключаться. Вот пример того, как обычно выглядят мои файлы setup.py:
from setuptools import setup
from myApp import VERSION
appname = 'MyApp'
APP = ['myApp.py']
DATA_FILES = []
OPTIONS = {
'includes': 'atexit, sip, PyQt4.QtCore, PyQt4.QtGui',
'strip': True,
'iconfile':'ui/myApp.icns',
'resources':['src/myApp.png'],
'plist':{
'CFBundleIconFile':'ui/myApp.icns',
'CFBundleIdentifier':'com.company.myApp',
'CFBundleGetInfoString': appname,
'CFBundleVersion' : VERSION,
'CFBundleShortVersionString' : VERSION
}
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
Я пробовал такие вещи, как:
setup(
...
exclude_package_data = { 'commonLib': ['.git'] },
#exclude_package_data = { '': ['.git'] },
#exclude_package_data = { 'commonLib/.git/': ['*'] },
#exclude_package_data = { '.git': ['*'] },
...
)
Обновление №2
Я опубликовал свой собственный ответ, который делает обезьяний патч на distutils. Это уродливо и нежелательно, но пока кто-то не предложит мне лучшее решение, я думаю, это то, что у меня есть.