7

私たちの施設では 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

from commonLib import xyzFoo などの特定のプロジェクトで、共通のパッケージを使用するようにインポートを行います。py2app によるビルドは次のようになります。python setup.py py2app

したがって、私が目にしている最近の問題は、プロジェクト Foo のアプリをビルドするときに、 commonLib/.git/ 内のすべてがアプリに含まれていることがわかります。これは余分な肥大化です。py2app には excludes オプションがありますが、それは python モジュール用のようです。.git サブディレクトリを除外するのに何が必要なのか、または実際には何が原因で最初に含まれているのか、よくわかりません。

git リポジトリである python パッケージのインポートを使用しているときに、これを経験した人はいますか? 各プロジェクトの setup.py ファイルに変更はなく、commonLib は常に git リポジトリです。したがって、変数であると考えることができるのは、明らかに時間の経過とともにアップグレードされた py2app とその deps のバージョンだけです。

編集

現在、最新の py2app 0.6.4 を使用しています。また、私の setup.py は、しばらく前に py2applet から最初に生成されましたが、それ以来手動で構成され、すべての新しいプロジェクトのテンプレートとしてコピーされています。私はこれらのプロジェクトのすべてに PyQt4/sip を使用しているので、レシピの 1 つに問題があるのではないかと思いますか?

アップデート

最初の回答から、さまざまな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でmonkeypatchを行う独自の回答を投稿しました。それは醜く、好まれませんが、誰かが私にもっと良い解決策を提供できるまで、これが私が持っているものだと思います.

4

4 に答える 4

3

これまでに機能することがわかった唯一のことを文書化するために、私自身の質問に回答を追加しています。私のアプローチは、ディレクトリの作成時またはファイルのコピー時に特定のパターンを無視するように 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

うまくいけば、誰かがこれについてコメントし、これを避けるためのより高いレベルのアプローチを教えてくれます. しかし、今のところ、exclude_data_patterns(re_pattern)プロジェクトで再利用できるように、これをユーティリティ メソッドにラップする予定です。

于 2012-03-30T19:37:29.647 に答える
1

.git ディレクトリを除外するための 2 つのオプションを確認できます。

  1. コードの「クリーンな」チェックアウトからアプリケーションをビルドします。新しいバージョンをデプロイするときは、タグに基づいて常に新しいバージョンからビルドして、svn export偽の変更/ファイルを取得しないようにします。ここで同等のものを試すことができますが、git の同等のものは やや複雑に見えます。

  2. setup.pyアプリケーションに含まれるファイルをマッサージするようにファイルを変更します。これは、 docsexclude_package_dataで説明されている機能を使用して行うか、 のリストを作成してに渡します。data_filessetup

突然発生し始めた理由については、使用している py2app のバージョンを知っていると、setup.py の内容と、おそらくこれがどのように作成されたか (手動または py2applet を使用) を知っていると役立つ場合があります。

于 2012-03-29T05:08:13.527 に答える