py2app在生成期间获取包的.git子目录

2024-09-27 22:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我们在我们的设施中广泛使用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

所以最近我看到的一个问题是,当为projectfoo构建一个应用程序时,我会看到它将commonLib/.git/中的所有内容都包含到应用程序中,这是额外的膨胀。py2app有一个excludes选项,但这似乎只适用于python模块。首先,我想排除的是什么。在

有人在使用作为git repo的python包导入时遇到过这种情况吗? 我们的设置.py每个项目的文件,commonLib始终是git repo。所以我唯一能想到的是py2app的版本和它的dep,它们显然是随着时间的推移而升级的。在

编辑

我现在使用的是最新的py2app0.6.4。还有,我的设置.py它最初是从py2applet生成的,但从那以后就被手工配置了,并作为每个新项目的模板复制过来。我在这些项目中的每一个都使用PyQt4/sip,所以它也让我怀疑这是否是其中一个配方的问题?在

更新

从第一个答案开始,我试图使用exclude_package_data设置的各种组合来解决这个问题。似乎没有什么能强迫.git目录被排除在外。这是我的设置.py文件通常如下所示:

^{pr2}$

我尝试过类似的方法:

setup(
    ...
    exclude_package_data = { 'commonLib': ['.git'] },
    #exclude_package_data = { '': ['.git'] },
    #exclude_package_data = { 'commonLib/.git/': ['*'] },
    #exclude_package_data = { '.git': ['*'] },
    ...
)

更新2

我发布了我自己的答案,在distutils上做了一个monkeypatch。这很难看,也不受欢迎,但除非有人能给我一个更好的解决方案,我想这就是我所拥有的。在


Tags: 文件项目pygit目录app应用程序package
3条回答

我可以看到两个排除.git目录的选项。在

  1. 从代码的“干净”签出构建应用程序。当部署一个新版本时,我们总是基于一个标记从一个新的svn export构建,以确保我们不会获取虚假的更改/文件。您可以在这里尝试等效的-尽管git等效项看起来是somewhat more involved

  2. 修改setup.py文件以按摩应用程序中包含的文件。这可以使用exclude_package_data功能完成,如docs中所述,或者构建data_files的列表并将其传递给setup

至于为什么它突然开始发生,了解您正在使用的py2app版本可能会有所帮助,了解您的内容也会有所帮助设置.py也许这是如何制作的(手工制作或使用py2applet)。在

我正在为我自己的问题添加一个答案,以记录到目前为止我发现的唯一有效的东西。我的方法是让monkeypatch distutils在创建目录或复制文件时忽略某些模式。这并不是我想做的,但正如我所说,这是目前为止唯一有效的方法。在

## setup.py ##

import re

# file_util has to come first because dir_util uses it
from distutils import file_util, dir_util

def wrapper(fn):
    def wrapped(src, *args, **kwargs):
        if not re.search(r'/\.git/?', src):
            fn(src, *args, **kwargs) 
    return wrapped       

file_util.copy_file = wrapper(file_util.copy_file)
dir_util.mkpath = wrapper(dir_util.mkpath)

# now import setuptools so it uses the monkeypatched methods
from setuptools import setup

希望有人能对此发表评论,告诉我一个更高层次的方法来避免这样做。{I}现在可能会被重用为一个cd1>工具。在

我也有类似的Pyinstaller经验,所以我不确定它是否直接适用。在

在运行导出过程之前,Pyinstaller会创建要包含在分发中的所有文件的“清单”。根据Mark的第二个建议,您可以“按摩”这个清单,以排除您想要的任何文件。包括.git或.git本身的任何内容。在

最后,我坚持在生成二进制文件之前先检查代码,因为不仅仅是.git膨胀(比如用于Qt的UML文档和原始资源文件)。签出保证了一个干净的结果,我在为二进制文件创建安装程序的过程中自动化了这个过程没有遇到任何问题。在

相关问题 更多 >

    热门问题