私自身のPythonパッケージをパッケージ化しています。私はsetuptoolsとwheelを使ってそれをバンドルしてインストールする(開発モードとテストPyPIリポジトリの両方で)。PyPIに依存関係が存在する場合、Pipは依存関係リンクを無視してホイールからパッケージをインストールします
パッケージをインストールするためのすべてのpipコマンドは、--process-dependency-links
と一緒に使用されます。私は単純化のためにこのオプションを失望させます、そして、このオプションは暗黙のうちにここにあります。
依存関係の1つがPyPIで壊れていますが、開発リポジトリの問題が修正されました。私はどのコミットがこの問題を修正したのか知っています。私はそのSHA-1の合計を知っていますので、ダウンロードするtarballを知っています。だから私は私のsetup.pyファイルでこれをやった:私は(両方setuptoolsのとピップ経由)開発モードでパッケージをインストールしている間
...
install_requires=[
'hbmqtt>0.9.0'
],
dependency_links=[
'https://github.com/beerfactory/hbmqtt/archive/f4330985115e3ffb3ccbb102230dfd15bb822a72.zip#egg=hbmqtt-0.9.1'
],
...
、パッケージはgitのレポからダウンロードされます。それで私のパッケージのソースコードを配布することができます。
python setup.py sdist
twine upload -s --sign-with gpg2 -r testpypi dist/<pkg-name>-<version>.tar.gz
次に、私はPyPIからインストールできます。 --no-cache-dir
と--no-binary :all:
オプションを同時に設定しないと(キャッシュからパッケージがインストールされていないことを確認するためにのみ--no-cache-dir
が必要です)、最初のインストールはOKです。ピップはソースをダウンロードしてからホイールを作ります。依存関係の解決はうまくいって、すべてが正常に見えます。 Pipは適切なバージョンの(私の例では)HBMQTTパッケージをダウンロードしてインストールします。同時にピップはホイールを作り、それをキャッシュします。そのため、2番目のインストール(--no-binary
オプションが明白な理由と--upgrade
と-I
オプションなし)が満たされていないため、失敗します.pipはバージョン0.9.1のHBMQTTパッケージを見つけることができません。 PyPIのHBMQTTの最新バージョンは0.9.0です。したがって、wheelパッケージからインストールしようとすると、pipは依存関係リンクを処理しません。
ホイール(python setup.py bdist_wheel)を作成してテストPyPIにアップロードしようとしているときと同じことが起こります。 PyPIからのインストールは、ダウンロードされた(または私が作った)ホイールファイルと同様に失敗します。
ピップやホイールにトラブルがあると思われます。私はホイールからインストールする責任があるのか分かりません。
私の質問は今何をすべきか?この場合、どのような回避策が存在しますか?私は、HBMQTTリポジトリをforkし、PyPIがパッケージを壊すまで自分のパッケージを作ることしか考えていません。
まあ、この動作は、パッケージがPyPIに存在しないケースにも及ぶことがわかりました。 – krautcat