http://neko-daisuki.ddo.jp/~SumiTomohiko/index.htmlこの広告は、90日以上更新していないブログに表示しています。setuptoolsこの記事についてこの記事は、id:SumiTomohiko:20070623:1182602060の続きです。これが最後の記事になります。setuptoolsを拡張し、再利用するdistutilsの拡張を作成するdistutilsに新しいコマンドを追加したり、setupの引数を追加するのは困難です。setuptoolsぱっめーじはこれを少し簡単にします。これは、distutilsの拡張を別のプロジェクトとして配布できるようにし、その拡張を必要としているプロジェクトがsetup_requires引数でそれらを参照するようにするだけで、可能になります。setuptoolsを使えば、「エントリポイント」を定義するだけで、distutilsの拡張プロジェクトは新しいコマンドとsetup()引数でフックすることができるようになります。コマンドまたは引数名を、ハンドラをインポートする場所の指定に対応づけるマップがあります(エントリポイントの背景について、上の「サービスとプラグインを動的に発見する」の節を参照してください)。コマンドを追加するdistutils.commandsグループにエントリポイントを定義することで、新しいセットアップコマンドを追加できます。},)(もちろん、mypackage.some_moduleにあるfooクラスはsetuptools.Commandクラスの派生クラスであることを前提としています)このようなエントリポイントを持つプロジェクトがいったんsys.path上で実行されたら(すなわち、site-packagesインストールディレクトリで"install"か"develop"した場合)、このコマンドはsetuptoolsに基づいたどのセットアップスクリプトでも有効になります。setuptoolsは自動的にdistutilsにラッパーを追加し、sys.path上の有効になっている配布物でエントリポイントを探せるようにします。setuptoolsのプロジェクトのセットアップスクリプトはコマンドのエントリポイントを定義しているのです!setup()の引数を追加するときには、新しいコマンドはsetup()の呼び出しに新しい引数を必要とするでしょう。これは、distutils.setup_keywordsグループにエントリポイントを定義することで可能になります。},)ここでの考え方は、与えられた場合、setup()の引数の妥当性を検証するために呼び出される関数を、エントリポイントが定義する、ということです。Distributionオブジェクトは初期値がNoneである属性を持っており、setup()の呼び出しがNone以外の値を設定していたときだけ、値を検証する関数が呼び出されます。Distributionオブジェクトと属性の名前、属性の値です。引数が不正な場合は、DistutilsSetupError(distutils.errorモジュール)を生成しなければなりません。関数はNone以外の値のときだけ呼び出され、この方法で定義された引数のデフォルトの値はNoneであることを、覚えていてください。このため、あとで属性にアクセスしたとき、その値がNoneである可能性があることに、新しいコマンドは常に気をつけていなければなりません。ふたつ以上の有効な配布物が同じsetup()の引数のエントリポイントを定義したら、それらすべてが呼び出されます。これにより、引数のどんな値が妥当か合意している限り、複数のdistutilsの拡張が共通の引数を定義することができるようになります。あなたの拡張を使用するどのセットアップスクリプトもsetup_requires引数であなたのプロジェクトを記述している限り、これは拡張の中でエントリポイントを定義するとき重要です。新しいEGG-INFOファイルを追加する拡張可能なアプリケーションやフレームワークは、pkg_resourcesメタデータAPIを通して簡単にアクセスできるように、プラグインのEGG-INFOディレクトリに含まれるアプリケーションかフレームワーク固有のメタデータと一緒に、サードパーティがプラグインを開発できるようにしたいと思うでしょう。これを可能にするもっとも簡単な方法は、(setup_requiresを通して)新しいセットアップキーワードを定義し、egg_infoコマンドが実行されたときにEGG-INFOファイルにそのメタデータを書き込む、プラグインのプロジェクトのセットアップスクリプトから使用されるdistutilsの拡張を作成することです。egg_infoコマンドはegg_info.writersグループで拡張ポイントを探し、ファイルに書き込むためにそれらを呼び出します。ここに、setupの引数foo_barを定義する、distutilsの拡張の例があります。foo_barは、この引数を使用するすべてのプロジェクトのEGG-INFOディレクトリのfoo_bar.txtに書き込まれる行のリストです。セットアップのキーワードが文字のシーケンスであることを検証するルーチンと、セットアップの引数を探し、それをファイルに書き込むルーチンです。egg_infoコマンドのインスタンスと書き込むファイルの名前(すなわちfoo_bar.txt)、書き込むファイルの完全な名前です。一般的には、書き込む関数はファイルに書き込む際、コマンドオブジェクトのdry_runの設定を尊重し、コンソールの出力にはdistutils.logオブジェクトを使用します。この要求に沿うもっとも簡単な方法は、ファイルを操作するときに、cmdオブジェクトのwrite_file()メソッドとdelete_file()メソッド、write_or_delete_file()メソッドを排他的に使用することです。詳細は、各メソッドのドキュメント文字列を参照してください。他のバージョン管理システムに対応するもしCVSとSubversion以外のバージョン管理システムからファイルを探すsetuptoolsのプラグインをつくろうとしていたら、setuptools.file_findersグループにエントリポイントを追加してできます。エントリポイントは関数であり、ひとつのディレクトリ名を受け取り、そのディレクトリ(とすべてのサブディレクトリ)の中でバージョン管理システムによって管理されているすべてのファイル名を返します。]}それから、あなたのプラグインを使いたいと思った人は誰でも、単にこれをインストールするだけで、ローカルのsetuptoolsは必要なファイルを探せるようになります。他のバージョン管理システムを使用するプロジェクトと一緒に、バージョン管理システムのプラグインを配布する必要はなく、setup_requiresにそのプラグインを指定する必要はありません。sdistコマンドでソース配布物を作成したら、setuptoolsは自動的にSOURCES.txtファイルにどのファイルが見つかったか書き込みます。これにより、ソースの配布物を受け取る人たちは、バージョン管理システムをまったく必要としません。誰かがそのシステムでチェックアウトしたパッケージで作業をしていたら、彼らはもともとの作者が使っているのと同じプラグインを必要とするでしょう。バージョン管理システムのファイルを検索する関数を記述する際に、重畳な点がいくつかあります:あなたの関数は渡されたディレクトリ名を付加して、相対パスを返さなければなりません。絶対パスと、渡されたディレクトリの親ディレクトリを参照する相対パスは許されていません。あなたの関数は、ディレクトリ名として、カレントディレクトリを意味する空文字列を受け付けなければなりません。相対パスだけを返します。このため、カレントディレクトリの下にあるsome/dirと名付けられたサブディレクトリを返すときは、./some/dirや/somewhere/some/dirと変換してはならず、常に単純にsome/dirとします。あなたの関数はいかなるエラーも生成してはなりませんし、必要なプログラム(すなわち、バージョン管理システムそのものに属するプログラム)がないときも行儀よく動作しなければなりません。distutils.log.warn()を使用して、ユーザにプログラムがないことを教えることはできます。コマンドを継承するごめんなさい、この節はまだ書いていません。更新履歴を除く、これより下の多くの節もそうです。新しいドキュメントが追加されるか更新されたとき、このページを見たいと思うでしょう。