5

現在、Python でいくつかのプロジェクトを行っており、既存のオープン ソース パッケージの独自のバージョンを使用する方法を理解しようとしています。

たとえば、zc.buildout で tipfy を使用しており、「paypal」パッケージに追加しました。残念ながら、必要な機能がないため、github でフォークして機能を追加しました。元のパッケージのメンテナーにプル リクエストを送りますが、彼らが私の追加を受け入れるかどうかにかかわらず、私のバージョンのパッケージを使用し、zc.buildout が私の依存関係を管理する利便性を維持したいと考えています。どうすればいいですか?

ライブラリの独自のテイクを PyPI にアップロードし、自分の名前を前に付けますか? それはインデックスを不必要に汚染しませんか?

それとも、独自のインデックスとパッケージ リポジトリを作成して維持する必要がありますか? これのフォーマットはどこにありますか? 同じ名前の変更されたパッケージで自分のリポジトリをホストすることは、OSS ライセンスの条件に反しますか? (プロジェクト内のすべてのファイルを新しい名前空間で変更したくありません)

この問題は、Python だけでなく、かなり頻繁に発生すると確信しています。Maven や SBT でも同様のことが起こっていることがわかります...人気のあるパッケージの独自のバージョンを使いたい場合、通常はどうすればよいのでしょうか?

4

6 に答える 6

5

これについては2つの方法があります。ビルドアウトが使用されているコンテキストに応じて、両方を使用します。

  1. mr.developerを使用して、バージョン管理システムからのパッケージを含めます(mr.developerは、gitを含む幅広いシステムをサポートします)。開発時に使用します。

  2. プライベートパッケージリポジトリを構築します。Apacheの単純なディレクトリリストで十分です。find-linksURLをエントリとしてプライベートリポジトリに追加します。

    [buildout]
    ...
    find-links =
        ...
        http://username:password@dist.example.com/projectname
    

    この例では、ユーザー名とパスワード(ビルドアウトが認証されます)、およびプロジェクト固有のサーバー上のパスも含めました。もちろん、すべてのプロジェクトに対して1つの大きなプライベートリポジトリを構築することもできます。

    そのリポジトリに、完全な卵を入れるか、パッケージのtarballだけを入れます。で指定されたリポジトリは、find-linksPyPIの前に検索されます。

    この方法は、デプロイメントのビルドアウトに使用します。このように、ソフトウェアはリリースされたパッケージを使用します。これにより、リリース管理がはるかに明確かつ簡単になります。

OSSパッケージの独自のフォークをホストすることはまったく問題ありません!これは、OSSを使用するときに得られる自由の1つです。このようにGPLコードをフォークし、それをサードパーティに配布する場合は、変更をサードパーティが利用できるようにする必要があることに注意してください。パッケージリポジトリは、これに準拠するための1つの方法です。

于 2010-11-01T09:53:51.287 に答える
2

頭痛の種を抑えるために、このようなカスタム コードをすべてパッケージにバンドルすることを強くお勧めします。いくつかのフォークを作ったとしましょうpackage。ライセンスで許可されている限り、変更されたバージョンのpackageを、あたかも別のディレクトリであるかのように、自分のコードにバンドルするだけです。ローカルの下に配置できるpackageので、簡単に見つけることができます。開発者がpackage必要なものを修正したら、このディレクトリを削除して、もう一度オンライン パッケージへの依存関係にします。

このアプローチの追加のボーナスは、ユーザー/顧客への配布を容易にすることです。

于 2010-11-01T05:00:03.203 に答える
1

ビルドアウトを使用してからしばらく経ちましたが、正しく思い出せば、pip要件ファイルを使用できるpipレシピがあります。次のようなものを含む要件ファイルを作成できます。

-e git+http://<github url>

これにより、インストール時にパッケージがローカルでチェックアウトされます。

于 2010-11-01T10:00:07.167 に答える
0

ライブラリの独自のテイクを PyPI にアップロードし、自分の名前を前に付けますか?

いいえ。

それはインデックスを不必要に汚染しませんか?

明らかに。(また、拡張機能が実際に他の人にとって有用であると想定しています。それは、あなた以外の誰にとってもそれほど有用ではないかもしれません。実際、拡張機能はパッケージを理解できないことを示している可能性があります。)

それとも、独自のインデックスとパッケージ リポジトリを作成して維持する必要がありますか?

一度もない。それは完全にばかげています。変更されたパッケージがあります。PyPI に対して完了する場合を除き、リポジトリは必要ありません。試すことはできますが、なぜわざわざするのですか?


これがあなたがすることです。

拡張する

変更やフォークを行うことなく、特定のパッケージを簡単に拡張できます。

my_paypal.py

from paypal import *

class MyFancyExtension( SomeExistingClass ):
    def override( self, ... )

def my_other_extension( ... ):
    this()
    that()

とても簡単です。拡張機能によって元のパッケージがそのまま保持されるため、多くの場合、フォークするよりも優れています。

于 2010-11-01T10:23:47.700 に答える
0

プロジェクトの setup.py に入力したすべてのパスがdependency_links最初に検索されます。したがって、パッケージをパスにドロップして、dependency_linksそのパスに設定するだけです。

local_packages = ['file:///path/to/packages']

setup(
 ...
 dependency_links=local_packages,
...)

Setuptoolのドキュメントでは、それがどのように機能するかについてもう少し詳しく説明していますが、実際にはそれだけです。

編集: zc.buildout はデフォルトで setuptools dependency_links 変数を使用します。オフにしたい場合

于 2010-11-01T04:59:31.647 に答える