W jaki sposób pakiet Debian może instalować moduły Python z PyPI

20

To pytanie próbuje uzupełnić to pytanie . Mam aplikację w języku Python, która korzysta z zewnętrznych modułów PyPI. Chcę spakować moją aplikację do pakietu debian, ale nie wiem, jak obsługiwać zależności Pythona, które nie znajdują się w repozytoriach debian / ubuntu (również pakowane jako pakiety debian)

Rozwiązanie 1:
Zbuduj moduły z PyPI bezpośrednio w moim pakiecie debian.

Rozwiązanie nr 2:
utwórz pakiety debian dla wszystkich modułów PyPI, których potrzebuję, używając stdeb i dodaj je do repozytoriów debian / ubuntu.

Potrzebuję rozwiązania nr 3, ponieważ chcę zainstalować zależności PyPI podczas instalowania mojego pakietu debian, najlepiej w virtualenv!

Jakie byłoby rozwiązanie nr 3 ? Czy muszę dostosować skrypt DEBIAN / preinst opiekun?

andri_ch
źródło
Czy możesz opisać, dlaczego musisz utworzyć pakiet Debian? Czy Twoja aplikacja Python potrzebuje zasobów innych niż Python?
Jonathan
@Jonathan Chcę, aby użytkownicy mogli zainstalować moją aplikację z Centrum oprogramowania Ubuntu. Myślę, że do tego potrzebuję * .deb. Moja aplikacja Python nie potrzebuje zasobów innych niż Python, tylko moduły Python innych firm.
andri_ch,
Pakiety @Jonathan Debian są standardową metodą instalacji w Ubuntu. W .debLaunchpad można łatwo dystrybuować plik, konfigurować prywatne repozytorium lub PPA.
MestreLion,

Odpowiedzi:

20

Rozmawiałem z niektórymi opiekunami na kanale Debian IRC irc: //irc.debian.org#debian-mentors , prosząc o dokładnie to samo, a ogólny konsensus był następujący:

Rozwiązanie nr 1:

Integrowanie zależności w pakiecie poprzez kopiowanie ich plików źródłowych, ponieważ jedna baza kodów jest bardzo niezadowolona. Byłoby to sprzeczne z celem systemu pakowania, który obsługuje zależności, aktualizacje, wersjonowanie itp.

Rozwiązanie nr 3:

Pobieranie pakietów innych niż debian w locie podczas instalowania pliku binarnego ( .deb) jest poważnym zagrożeniem dla bezpieczeństwa, zdecydowanie nie-nie. Nie byłoby nawet możliwe sprawdzenie zależności przez wyodrębnienie deb, ponieważ są one pobierane i instalowane w czasie instalacji. To podejście całkowicie omija system repozytoriów. Żaden zainteresowany użytkownik nie byłby zadowolony z pakietu, który za kulisami (i jak rootpamiętaj!) Pobiera dodatkowe niezaufane oprogramowanie z niezaufanych źródeł. Tak, wymagałoby to majstrowania przy DEBIAN/postinst(lub preinst) i wydania wget(lub, w twoim przypadku,pip install), a takie podejście przyjęli Flash, Oracle Java, Steam i inni. Ale to zastrzeżone oprogramowanie z zamkniętym kodem źródłowym, więc ich bezpieczeństwo i tak nie ma.

Rozwiązanie nr 1.5:

Nie wspominając, ale można zintegrować zależności tylko w czasie kompilacji , czyli w źródłowym pakietu (The .orig.tar.gz, .debian.tar.gz, .dsctriady), pobierając od PyPI podczas tworzenia „binarny” pakiet (z .deb). Instrukcje dla pip installpójdą do debian/rules(zwróć uwagę na małe litery debian, w przeciwieństwie do pakietu binarnego) i zostaną wykonane po wydaniu debuildlub dpkg-buildpackage.

Jest to środek między 1 a 3. Łagodzi (ale nie rozwiązuje!) Niektóre problemy z punktu 3: przynajmniej możesz sprawdzić produkt końcowy i .debnie wymagałby on dostępu do Internetu w czasie instalacji. Wszystkie ryzyka i obciążenia są przenoszone z użytkownika końcowego na opiekuna pakietu. Ma jednak takie same problemy jak nr 1, ponieważ omija większość infrastruktury systemu pakowania. W końcu obsługa zależności (wersje, aktualizacje, wymagania, konflikty) jest powodem, dla którego dpkg/ aptzostał stworzony! :)

Rozwiązanie nr 2:

The One True Right Way ™ . Tworzysz pakiety Debiana dla swoich zależności, wymieniasz je jako wymagania w pakiecie i wysyłasz wszystkie .debspakiety źródłowe lub źródłowe.

Stamtąd masz wiele opcji:

  • Prześlij pakiety źródłowe, zarówno swoje oprogramowanie, jak i jego zależności, w celu włączenia do Debiana. Jeśli zostaną zaakceptowane, będą automatycznie dostępne dla wszystkich użytkowników Debiana, w tym dla wszystkich pochodnych, takich jak Ubuntu.

  • Prześlij pakiety źródłowe do Launchpada , tworząc w ten sposób PPA, który każdy użytkownik Ubuntu (i jego pochodne, takie jak Linux Mint) mógłby łatwo dodać i zainstalować

  • Hostuj własne repozytorium Debiana na swojej stronie internetowej, które użytkownicy z dowolnego systemu opartego na Debianie mogą dodawać do nich /etc/apt/sources.list.di korzystać z aptinfrastruktury do pobierania, instalowania i aktualizowania (jak wyżej!)

  • Hostuj .debpliki do bezpośredniego pobrania i instalacji. Nie aptdotyczyło to ani automatycznych aktualizacji.

Jeśli chodzi o sposób pakowania zależności PyPi (a także oprogramowania Python!), Istnieje wiele narzędzi i referencji, które ułatwiają ten proces:

  • stdeb , jak wspomniałeś. Staruszek i skarbie.

  • Pybuild , nowe, niesamowite narzędzie Debiana, które zastępuje stdeb.

I wiele przydatnych referencji:

Potrzebuję pomocy? Sprawdź te:

MestreLion
źródło
2

Jest to, pypi2debaby pobrać pakiet z pypi i przekształcić go w pakiet deb.

Porucznik
źródło
0

Nie są, jest jak cpan w perlu, jeśli masz w repozytoriach, możesz zainstalować za pomocą apt-get, jeśli nie, możesz zainstalować za pomocą pip, różnica powinna polegać na tym, że pip instaluje się w / usr / local.

Aby zainstalować za pomocą pip, możesz:

apt-get install python-pip 
pip install foopackage 

na przykład:

pip install MultipartPostHandler2
Sérgio
źródło
To nie odpowiada na pytanie PO. Pytanie brzmi, w jaki sposób pakiet Debian powinien zainstalować pakiet Python z PyPi, aby „apt-get <pakiet niestandardowy>” lub „dpkg -i <pakiet niestandardowy>” ściągał zależności Python z PyPi.
SevakPrime
Nie są, jest jak cpan w perlu, jeśli masz w repozytoriach, możesz zainstalować za pomocą apt-get, jeśli nie, możesz zainstalować za pomocą pip, różnica powinna polegać na tym, że pip instaluje się w / usr / local, ale może tak będzie lepiej usuń moją odpowiedź.
Sérgio
Twój komentarz stanowi odpowiednią odpowiedź na pytanie PO. Powinieneś umieścić ten komentarz w swojej odpowiedzi, aby zostać poddanym głosowaniu. (Na przykład zobacz odpowiedź MestreLion.) Twoja odpowiedź nie odpowiada na pytanie PO.
SevakPrime