Apakah proyek python membutuhkan MANIFEST.in, dan apa yang harus ada di dalamnya?

120

Panduan "Distribusikan Python" (ada di python-distribute.org, tetapi pendaftaran itu telah kedaluwarsa) memberi tahu saya untuk menyertakan doc/txtfile dan .pyfile dikecualikan dalam MANIFEST.infile

The dokumentasi sourcedist memberitahu saya hanya menggunakan sdist MANIFEST.indan hanya mencakup file yang menentukan dan untuk menyertakan .pyfile. Itu juga memberitahu saya untuk menggunakan: python setup.py sdist --manifest-onlyuntuk menghasilkan MANIFEST, tetapi python memberitahu saya ini tidak ada

Saya menghargai ini berasal dari berbagai versi python dan sistem distribusinya berantakan total, tetapi dengan asumsi saya menggunakan python 3 dan setuptools (yang baru yang mencakup distribusikan tetapi sekarang disebut setuptools, bukan setuptools lama yang tidak digunakan lagi untuk alat distribusi saja untuk dibawa kembali ke distribusikan dan distribusikan diganti namanya menjadi setuptools .....)

dan saya mengikuti struktur folder dan setup.pyfile 'standar' ,

  1. Apakah saya membutuhkan MANIFEST.in?
  2. Apa yang harus ada di dalamnya?
  3. Kapan semua sistem dan metode paket yang berbeda ini akan dibuat menjadi satu proses sederhana?
Neil Walker
sumber

Jawaban:

117

Re: "Apakah saya membutuhkan MANIFEST.in?

Tidak, Anda tidak harus menggunakan MANIFEST.in. Keduanya, distutilsdan setuptoolstermasuk dalam paket distribusi sumber semua file yang disebutkan dalam setup.py- modul, file paket python, README.txtdan test/test*.py. Jika hanya ini yang ingin Anda miliki dalam paket distribusi, Anda tidak perlu menggunakan MANIFEST.in.

Jika Anda ingin memanipulasi (menambah atau menghapus) file default untuk disertakan, Anda harus menggunakan MANIFEST.in.

Re: Apa yang harus ada di dalamnya?

Prosedurnya sederhana:

  1. Pastikan, di dalam Anda setup.pyAnda menyertakan (melalui setupargumen) semua file yang Anda rasa penting untuk menjalankan program (modul, paket, skrip ...)

  2. Memperjelas, jika ada beberapa file untuk ditambahkan atau beberapa file untuk dikecualikan. Jika tidak ada yang dibutuhkan, maka tidak perlu digunakan MANIFEST.in.

  3. Jika MANIFEST.indiperlukan, buatlah. Biasanya, Anda menambahkan tests*/*.pyfile di sana , README.rstjika Anda tidak menggunakan README.txt, docsfile dan mungkin beberapa file data untuk rangkaian pengujian, jika perlu.

Sebagai contoh:

include README.rst
include COPYING.txt

Untuk mengujinya, jalankan python setup.py sdist, dan periksa tarball yang dibuat di bawah dist/.

Kapan semua sistem paket yang berbeda ini ...

Membandingkan situasi hari ini dan 2 tahun lalu - situasinya jauh lebih baik - setuptoolsadalah cara yang harus ditempuh. Anda dapat mengabaikan fakta, distutilssedikit rusak dan rendah tingkat dasar untuk setuptoolssebagai setuptoolswajib mengurus menyembunyikan hal ini dari Anda.

EDIT : Beberapa proyek terakhir yang saya gunakan pbruntuk membangun paket distribusi dengan tiga jalur setup.pydan sisanya berada dalam setup.cfgdan requirements.txt. Tidak perlu peduli MANIFEST.indan hal-hal aneh lainnya. Meskipun paket tersebut akan membutuhkan lebih banyak dokumentasi. Lihat http://docs.openstack.org/developer/pbr/

Jan Vlcinsky
sumber
1
Dalam pengalaman saya yang terbatas, tampaknya jika Anda ingin memasukkan file bukan di dalam modul python (dir dengan init .py), Anda harus menggunakan MANIFEST.in dan menggunakan perintah sdist(means: source distribution ). Jika Anda menganggap bahwa bdistdan bdist_wheeladalah biner dan hanya dimaksudkan untuk dipasang di jalan python Anda, ini masuk akal. (Kemana perginya file dan direktori non-modul ini? Masuk /usr/local/lib/python2.7/dist-packages/? Tentunya tidak.) Namun perlu disebutkan karena membingungkan melihat arsip dibuat dan tidak menyertakan file.
Bruno Bronosky
7
Untuk menghindari yang tak terhindarkan package_datadan data_filesrekomendasi, yang berada di luar ruang lingkup, saya akan melanjutkan. package_datadaftar file yang terinstal dengan paket Anda dist-packages/yourpackageyang akan dilewati karena tidak memiliki nama * .py. data_filesdaftar file yang diinstal di luar paket Anda. Setiap entri menentukan jalur target yang diawali dengan sys.prefixjika itu relatif atau dibuat secara langsung (izin mengizinkan) jika dimulai dengan a /.
Bruno Bronosky
2
@JanVlcinsky penting untuk mengetahui apa itu dan [yang lebih penting] tidak termasuk dalam format distribusi yang berbeda. Saya memiliki proyek publik yang hanya saya distribusikan melalui distribusi sumber karena saya menyertakan file boto.sample.cfg (yang berisi kredensial AWS IAM palsu) di luar paket (di root) dan distribusi biner tidak akan menyertakannya. Saya membuat build biner pribadi untuk diterapkan ke produksi yang memiliki data_files = [('/ etc /', ['boto.cfg'])]. Jika Anda ingin mendistribusikan file non-py, Anda harus tahu cara kerjanya.
Bruno Bronosky
2
@MichaelGoerz Sejujurnya, mereka seharusnya tidak melakukannya. Jawaban ini kuno, dan menyarankan pbrjuga ide yang buruk.
Arne
1
@Ame Saya setuju, hal-hal pindah. Saat ini saya mengubah sebagian besar proyek saya dari pbr ke puisi
Jan Vlcinsky
7

Pertanyaan lama, jawaban baru:

Tidak, Anda tidak perlu MANIFEST.in. Namun, untuk setuptoolsmelakukan apa yang Anda (biasanya) maksudkan, Anda perlu menggunakan setuptools_scm, yang berperan MANIFEST.indi 2 tempat utama:

  • Ini memastikan semua file yang relevan dikemas saat menjalankan sdistperintah (di mana semua file yang relevan didefinisikan sebagai "semua file di bawah kendali sumber")
  • Saat menggunakan include_package_datauntuk menyertakan data paket sebagai bagian dari buildatau bdist_wheel. (sekali lagi: file di bawah kendali sumber)

Pengertian historis dari MANIFEST.inadalah: ketika Anda tidak memiliki sistem kendali sumber, Anda memerlukan mekanisme lain untuk membedakan antara "file sumber" dan "file yang kebetulan ada di direktori kerja Anda". Namun, proyek Anda berada di bawah kendali sumber (kan ??) jadi tidak perlu MANIFEST.in. Info selengkapnya ada di artikel ini .

Klaas van Schelven
sumber