1

私が取り組んでいるプロジェクトでは、多くのビルドステップにファブリックを使用しており、フォールバックとしてオフラインビルドが必要です。

私は現在、tarballsで提供されているpythonパッケージのインストールで立ち往生しています。

問題は、新しく抽出されたディレクトリにアクセスsetup.py installしてそこで実行するのに問題があることです。

@task
def deploy_artifacts():
    """Installs dependencies from local path, useful for offline builds"""
    #TODO: Handle downloading files and do something like this bellow
    tmpdir = tempfile.mkdtemp()
    artifacts_path = ''
    if not 'http' in env.artifacts_path:
        artifacts_path = env.artifacts_path

    with lcd(artifacts_path):

        for f in os.listdir(artifacts_path):
            if 'gz' in f:
                put(f, tmpdir)
                tar = os.path.join(tmpdir, f)
                target_dir = os.path.join(tempfile.gettempdir(), normalize(f))
                if not files.exists(target_dir):
                    run('mkdir %s' % target_dir)
                else: 
                    run('rm -rf %s' %target_dir)
                    run('mkdir %s' % target_dir)
                run('tar xf %s -C %s' % (tar, target_dir))
                run('rm %s' % tar)
                with cd(target_dir):
                    sudo('python setup.py install')

私は何億回もmanページを読んでいたのtarですが、欲しいものを手に入れるにはほど遠いものでした。

このような状況に直面した方もいらっしゃいますか?このシナリオに他の(読む:より良い)アプローチはありますか?

4

1 に答える 1

1

あなたがやろうとしていることに(原則として)何も問題はありません。たぶん、そこにたどり着くまでに小さな一歩を踏み出すだけです。一時ディレクトリを使用するのではなく、慣例により他に何も書き込まれない既知のアクセス許可を持つ体系的な場所にすべてを配置すると、デバッグが容易になる場合があります。少なくとも、ファブリックと手動の介入を組み合わせて使用​​して、何が問題なのかを確認できます。

長期的には、いくつかの選択肢があると思います。簡単にするために、オンライン バージョンとオフライン バージョンが同じように動作するようにします。つまり、どちらの場合もeasy_install / pipを使用してパッケージを取得します。

これを行う 1 つの方法は、 PyPiのミラーを構築することです。十分なストレージ容量 (30Gb) がある場合、これを行う正しい方法は、PEP381 (Mirroring Infrastructure for PyPI) を実装するソフトウェアを使用することです。これを行うクライアント ( pep381client ) が既に存在します。同様のことを行う他の多くのプロジェクトが利用可能です ( basketweaverdjangopypi2chishop )。

別の方法として、軽量のプロキシ スキームを検討することもできます。私はpip2pipipliを探していました。それらが easy_install で直接動作するかどうかはわかりませんが、試してみる価値はあります。

また、pip を使用している場合は、tarball から直接インストールできたことにも注意してください。

于 2012-10-13T13:17:55.723 に答える