コミュニティリポジトリでパッケージを公開する: PyPI または Anaconda.org#

pyOpenSci は、あなたのパッケージが PyPI のようなパブリックコミュニティリポジトリや Anaconda.org の biocondaconda-forge のような conda チャンネルからインストールできるディストリビューションを持っていることを要求します。

以下では、Pythonパッケージの様々な公開オプションについて詳しく説明します。

ポイント

  • pipとcondaの両方を使って同じ環境にパッケージをインストールすると、パッケージが競合する可能性があります。

  • ローカル環境を管理するために conda (または pip) を使用しているかもしれないユーザーの競合を最小にするために、Anaconda.org の PyPI と conda-forge チャンネルの両方にパッケージを公開することを検討してください。

以下では、PythonパッケージのPyPI公開とconda公開の違いについて詳しく説明します。

Image showing the progression of creating a Python package, building it and then publishing to PyPI and conda-forge. You take your code and turn it into distribution files (sdist and wheel) that PyPI accepts. Then there is an arrow towards the PyPI repository where ou publish both distributions. From PyPI if you create a conda-forge recipe you can then publish to conda-forge.

Once you have published both package distributions (the source distribution and the wheel) to PyPI, you can then publish to conda-forge. The conda-forge requires a source distribution on PyPI in order to build your package on conda-forge. You do not need to rebuild your package to publish to conda-forge.#

PyPIとは#

PyPI はオンラインのPythonパッケージリポジトリで、Pythonパッケージの検索やインストール、公開に利用できます。テスト用のPyPIリポジトリもあり、最終的にPyPIで公開する前に、パッケージの公開をテストすることができます。

ほとんどのPythonパッケージはPyPIで見つけることができ、 pip を使ってインストールすることができます。

パッケージのインストールにpipを使う場合とcondaを使う場合の最大の違いは、condaは(複数の)言語に関係なくどんなパッケージでもインストールできるということです。 一方、 pip は Python パッケージしかインストールできません。

PyPIへのパッケージ公開のチュートリアルはこちら。

Tip

パッケージビルドのページで、 Pythonパッケージを作るときに作成する2つのパッケージ配布タイプ について説明しました: SDist (.tar.gzまたは.zipとしてパッケージ化) とWheel (.whl) は、実際にはzipファイルです。 標準ビルドツール を使ってパッケージをビルドすると、これらのファイル "バンドル" は両方ともPyPIで公開されます。

condaとAnaconda.orgとは?#

condaはオープンソースのパッケージと環境管理ツールです。condaは Anacondaリポジトリ からツールをインストールするために使用できます。

Anaconda.org にはパッケージのためのパブリックとプライベートのリポジトリがあります。 これらのリポジトリはチャンネルとして知られています(後述)。

condaの進化の簡単な歴史

condaエコシステムは、科学的なPythonプロジェクトにおけるソフトウェアの依存関係を管理するためのサポートを提供し、そのプロセスを簡素化するために数年前に発展しました。

科学的なPythonプロジェクトのコアの多くは、C++などの他の言語で書かれたツールや拡張機能に依存したり、その周りを取り巻いたりしています。科学エコシステムの開発の初期段階では、これらのPython以外の拡張機能やツールはPyPIで十分にサポートされておらず、公開が困難でした。近年、開発者が wheel distribution format を使ってPython以外のコードをPythonディストリビューションにバンドルできるような、複雑なビルドのサポートが増えました。

Condaは、これらの依存関係を管理し、必要なパッケージが正しくインストールされるようにするメカニズムを提供します。

Tip

condaはもともとPythonのパッケージをサポートするために作られたが、今ではあらゆる言語で使われています。この言語間サポートにより、C/C++ (gdal) 、Julia、Rなど、他の言語で書かれたツールを簡単に取り込んだり、利用したりできるパッケージもあります。これらのパッケージをすべてミックスした環境を作るのは、通常、condaのような本格的なパッケージマネージャを使った方が簡単で、一貫性があります。

condaチャンネル#

condaでビルドされたパッケージは、チャンネルと呼ばれるリポジトリに格納されます。 condaパッケージマネージャは異なるチャンネルからパッケージをインストールすることができます。

多くの人がcondaを使ってパッケージをインストールする際に使う、いくつかのコアなパブリックチャンネルがあります:

  • defaults: これは Anaconda が管理するチャンネルです。 Anaconda ディストリビューションをインストールするとインストールされる Python パッケージのバージョンです。 どのパッケージが defaults チャンネルにあるかは Anaconda (会社) が決定します。

  • conda-forge: this is a community-driven channel that focuses on scientific packages. This channel is ideal for tools that support geospatial data. Anyone can publish a package to this channel.

  • bioconda: this channel focuses on biomedical tools.

科学的パッケージの多くが defaults Anaconda チャンネルに存在しなかったため、conda-forge が出現しました。

Graphic with the title Python package repositories. Below it says Anything hosted on PyPI can be installed using pip install. Packaging hosted on a conda channel can be installed using conda install. Below that there are two rows. The top row says conda channels. Next to it are three boxes one with conda-forge, community maintained; bioconda and then default - managed by the anaconda team. Below that there is a row that says PyPI servers. PyPI - anyone can publish to PyPI. And test PyPI. A testbed server for you to practice.

Condaチャンネルは、パッケージをインストールできる様々なリポジトリです。 conda-forge はコミュニティによって管理されているため、誰でもレシピを投稿することができます。 PyPIもコミュニティによって管理されているリポジトリです。 誰でもPyPIにパッケージを投稿し、PyPIをテストすることができます。 conda-forge とは異なり、PyPI に投稿されたパッケージを手動でチェックすることはありません。#

conda channels, PyPI, conda, pip - パッケージを公開する場所#

なぜPythonパッケージをインストールするのに様々なパッケージリポジトリがあるのか不思議に思うかもしれません。

さらに重要なことは、Pythonパッケージを公開するのに適切なリポジトリをどのように選べばいいのか悩んでいることでしょう。

どちらの質問に対する答えも、依存関係のコンフリクトに関係しています。

画像はXKCDのコミックで、Pythonの環境とツール、インストールの網を描いています。一番下にはこう書いてあります - 私のパイソン環境は劣化しすぎて、私のラップトップはスーパーファンドサイトに指定された。

Python と Python パッケージを異なるリポジトリからインストールすると、あるバージョンのパッケージが別のパッケージのバージョンと動作しないといった環境の衝突につながる可能性があります。 環境をクリーンに保ち、動作させるためには、同じリポジトリからパッケージをインストールするのがベストです。 そのため、pipを使ってすべてをインストールする。 あるいはcondaを使う。 できることなら、pipとcondaの両方のパッケージを同じ環境にインストールしないようにしましょう。#

Pythonパッケージの依存関係の競合を管理する#

Python環境は、Pythonツールが異なるリポジトリからインストールされることがあるため、競合に遭遇する可能性があります。 大まかに言えば、Python環境は、ツールが同じパッケージリポジトリからインストールされるとき、依存関係の衝突の可能性が小さくなります。 そのため、pip と conda の両方からインストールされたパッケージを含む環境は、依存関係の衝突が起こりやすくなります。

Similarly installing packages from the default anaconda channel mixed with the conda-forge channel can also lead to dependency conflicts.

多くのパッケージは conda defaults チャンネルから直接インストールします。 しかし、このチャンネルは Anaconda によって管理されているため、このチャンネルで利用可能なパッケージは、Anaconda が安定したインストールの中核となるべきと判断したものに限定されます。 conda-forge チャンネルは defaults チャンネルを補完するために作成されました。 誰でもこのチャンネルで公開するパッケージを投稿することができます。 このように、 conda-forge チャネルは、ユーザが開発したコミュニティパッケージの広範なスイートを conda からインストールできるようにします。

教訓: 可能であれば、PyPI と conda-forge の両方で公開し、より多くのユーザがあなたのパッケージを利用できるようにしましょう。#

メンテナにとって重要なことは、もしユーザがローカル環境の管理にcondaを使いたいと考えているのであれば(多くのユーザがそうしている)、PyPIとconda-forge channelの両方に公開することを検討すべきだということです (_詳しくは後述します) 。

conda-forgeへの投稿方法#

pyOpenSciはあなたのパッケージをconda-forgeに追加する必要はありませんが、追加することを検討することを推奨します!

パッケージが PyPI に登録されたら、conda-forge にパッケージを追加する手順は簡単です。 conda-forge メンテナチームが提供している詳細な手順に従うことができます

conda-forgeにパッケージを追加するチュートリアルはこちらをご覧ください。

ステップバイステップのチュートリアルをご覧になりたい方は、こちらをクリックしてください。

パッケージが追加されると、GitHub の feedstock リポジトリにパッケージ名が追加されます。

conda-forge パッケージリポジトリの管理#

いったんあなたのパッケージが conda-forge チャンネルに登録されれば、それを維持するのは簡単です。 新しいバージョンのパッケージを PyPI にプッシュするたびに、conda-forge リポジトリのパッケージを更新する継続的インテグレーションビルドが開始されます。 ビルドが完了すると、更新を確認するための通知が届きます。

プルリクエストの内容に満足したら、プルリクエストをマージすることができます。 すぐにマージできるPRとは、通常、プルリクエストにある更新されたYAMLファイルに記載されているあなたのプロジェクトの依存関係(実行時要件として知られています)が、新しいリリースのPyPIメタデータと一致していることを確認することです。