我们在我们的设施中广泛使用 py2app 来生成自包含的 .app 包,以便于内部部署而不会出现依赖性问题。我最近注意到但不知道它是如何开始的,那就是在构建 .app 时,py2app 开始包含我们主库的 .git 目录。
例如,commonLib 是我们的根 python 库包,它是一个 git repo。在这个包下是各种子包,如数据库、实用程序等。
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 有一个 excludes 选项,但这似乎只适用于 python 模块。我无法完全弄清楚排除 .git 子目录需要什么,或者实际上是什么导致它首先被包含在内。
有没有人在使用作为 git repo 的 python 包导入时遇到过这种情况?每个项目的 setup.py 文件没有任何变化,commonLib 一直是一个 git 存储库。所以我唯一能想到的变量是 py2app 的版本及其明显随着时间的推移而升级的 deps。
编辑
截至目前,我正在使用最新的 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 上做了一个猴子补丁。它丑陋且不受欢迎,但在有人可以为我提供更好的解决方案之前,我想这就是我所拥有的。