web-dev-qa-db-ja.com

DebianパッケージはどのようにしてPyPIからPythonモジュールをインストールできますか

この質問は this one を補完しようとします。 PyPIのサードパーティモジュールを使用するpythonアプリがあります。アプリをdebianパッケージにパッケージ化したいが、debian/ubuntuリポジトリにないpython依存関係を処理する方法がわからない(debianパッケージとしてもパックされている)

ソリューション#1:
モジュールをPyPIからdebianパッケージに直接ビルドします。

ソリューション#2:
stdebを使用して必要なすべてのPyPIモジュールのdebianパッケージを作成し、debian/ubuntuリポジトリに追加します。

DebianパッケージをできればvirtualenvにインストールするときにPyPIの依存関係をインストールしたいので、実際にはSolution#3が必要です!

Solution#3とは何ですか? DEBIAN/preinstメンテナースクリプトを微調整する必要がありますか?

18
andri_ch

Debian IRCチャンネルでメンテナーと話をしました irc://irc.debian.org#debian-mentors 、まったく同じことを求めて、一般的なコンセンサスを求めましただった:

ソリューション#1:

単一のコードベースとしてソースファイルをコピーしてパッケージに依存関係を統合することは、veryに難色を示します。依存関係、更新、バージョニングなどを処理するパッケージングシステムの目的に反します。

ソリューション#3:

バイナリ(.deb)のインストール時に非Debianパッケージをオンザフライでダウンロードすることは、重大なセキュリティリスクであり、間違いなくノーです。インストール時にダウンロードおよびインストールされるため、debを抽出して依存関係をinspectすることさえできません。これは、リポジトリシステムを完全にバイパスするアプローチです。関係のあるユーザーは、背後で(そしてrootとして覚えてください!)、信頼できないソースから追​​加の信頼できないソフトウェアをダウンロードするパッケージに満足しません。はい、それはDEBIAN/postinst(またはpreinst)をいじる必要があり、wget(または、あなたの場合はpip install)を発行する必要があります。しかし、それはプロプライエタリなクローズドソースソフトウェアですので、とにかくセキュリティはありません。

ソリューション#1.5:

あなたはそれについて言及しませんでしたが、build time、つまりsourceパッケージ( .orig.tar.gz.debian.tar.gz.dsc triad)、「バイナリ」パッケージ(.deb)を作成するときにPyPiからダウンロードする。 pip installの命令はdebian/rulesに入り(バイナリパッケージではなく、小文字のdebianに注意してください)、debuildまたはdpkg-buildpackageを発行すると実行されます。

これは、#1と#3の中間です。 #3の問題のいくつかを軽減します(しかし解決しません!):少なくとも最終製品を検査でき、.debはインストール時にインターネットアクセスを必要としません。すべてのリスクと負担は最終ユーザーからパッケージメンテナーに移されます。しかし、ほとんどのパッケージングシステムインフラストラクチャをバイパスするため、#1と同じ問題があります。結局、依存関係(バージョン、更新、要件、競合)の処理が、最初にdpkg/aptが作成された理由です! :)

ソリューション#2:

One True Right Way™。依存関係用のDebianパッケージを作成し、パッケージ内の要件としてリストし、すべての.debsまたはソースパッケージを出荷します。

そこから、いくつかのオプションがあります。

  • Submit Debianに含めるソースパッケージ(ソフトウェアとその依存関係の両方)。受け入れられると、Ubuntuのようなすべての派生物を含め、すべてのDebianユーザーが自動的に利用できるようになります。

  • ソースパッケージを Launchpad にアップロードして、 PPA を作成します。これにより、すべてのUbuntuユーザー(およびLinux Mintなどの派生物)が簡単に追加およびインストールできます。

  • Debianベースのシステムのユーザーが/etc/apt/sources.list.dに追加し、aptインフラストラクチャを使用してダウンロード、インストール、更新を継続できるように、Webサイトで独自のdebianリポジトリをホストします(上記のように!)

  • .debファイルをホストして、直接ダウンロードしてインストールします。 aptも自動更新も考慮されていません。

PyPi依存関係(およびpythonソフトウェアも!)をパッケージ化するhowについては、プロセスを簡単にする多くのツールとリファレンスがあります。

  • stdeb 、あなたが言ったように。オールディーとグッディー。

  • Pybuildstdebに代わるDebianの新しい素晴らしいツール。

そして、多くの便利なリファレンス:

助けが必要?それらをチェックしてください:

19
MestreLion

Pypiからパッケージを取得してdebパッケージにするpypi2debがあります。

2
LtWorf

関連するコマンドラインコードを.debパッケージのpostinstスクリプトに追加するだけでよいと思います。 この回答 にあり、詳細は debian公式ガイド にあります。

2
TheSchwa

それらはそうではありません。Perlのcpanに似ています。リポジトリにある場合はapt-getでインストールできますが、pipでインストールできない場合は/ usr/localにpipをインストールする必要があります。

Pipでインストールするには、次のようにします。

apt-get install python-pip 
pip install foopackage 

例えば:

pip install MultipartPostHandler2
0
Sérgio