2013-08-07 28 views
12

Mam kilka aplikacji python składających się ze skryptów/modułów, które powinny być pakowane i wdrażane jako RPM.Dystrybucja pakietu Pythona wraz z zależnościami modułów przy użyciu RPM

Trędszym bitem jest to, że każda aplikacja powinna być dystrybuowana wraz z wszystkimi zależnościami modułu Pythona, a te powinny być używane zamiast tych, które są zainstalowane w całym systemie.

Host docelowy niektórych z tych RPM ma ograniczony dostęp do sieci, więc te pakiety RPM powinny zawierać wszystko, co jest potrzebne do uruchomienia aplikacji, a nie pobierać niczego podczas wdrażania.

Przyjrzałem się pakowaniu i dystrybucji virtualenv, ale przenoszenie virtualenv nie wydaje się być dobrze obsługiwane.

Przyjrzałem się zc.buildout, ale znalazłem brakującą dokumentację. Mogłem zobaczyć, jak pobierać zależności podczas programowania, ale nie w jaki sposób je dystrybuować jako część większej aplikacji. Możliwe, że różne aplikacje wymagają różnych wersji tego samego modułu, więc nie powinny one być instalowane na całym systemie.

Innym problemem jest to, że wszelkie skrypty Pythona w aplikacji muszą zostać zmodyfikowane, aby użyć innego sys.path podczas programowania i po wdrożeniu, nie widziałem oczywistego sposobu obejścia tego.

Czy istnieją sugestie, jak najlepiej to osiągnąć? Idealnym podsumowaniem przepływu pracy z punktu widzenia programisty widzenia wyglądałby następująco:

  1. źródłowym aplikacji do pobrania skryptu
  2. run przynieść konkretne zależności modułu jeśli nie występuje (być może przy użyciu pip)
  3. Uruchom skrypt do budowania app python i pakiet go i wszystkie pobrane zależności język RPM

ostateczna RPM powinien wtedy być instalowane i uruchamianego na komputerze bez dostępu do sieci, a tylko interpreter Pythona zainstalowany.

+1

Możesz rozpowszechniać samodzielny plik wykonywalny Pythona - pakowany w RPM? Czy potrzebujesz kodu źródłowego, aby był dostępny dla użytkowników? Jeśli nie zajrzyj tutaj http://stackoverflow.com/questions/5458048/how-to-make-a-python-script-standalone-executable-to-run-z -niezależną- – Anshul

+1

Nie użyłem tego, ale [conda's] (http://www.continuum.io/blog/conda) mają na celu poradzić sobie z takimi sprawami jak twoje. Zobacz link "Rolling your own packages" pod tym linkiem. –

+0

Powinieneś używać pakietów paczek lub "kółek" PIP – ionelmc

Odpowiedz

1

Postrzegałbym to jako dwa osobne problemy.

  1. Potrzebujesz powtarzalnego systemu instalacji/kompilacji dla swoich programistów.

  2. Potrzebujesz instalatora programów instalacyjnych.

Buildout (lub pip, być może w połączeniu z dodatkowym skryptem) może zająć się pierwszym problemem. Zasadniczo: "jak przygotować projekt do opracowania na świeżym laptopie". Najlepiej byłoby po prostu powiedzieć python bootstrap.py;bin/buildout i być gotowy (to samo z pip/virtualenv).

Teraz, gdy masz powtarzalną kompilację, możesz użyć jej jako podstawy dla instalatora. Handiest to czysta maszyna wirtualna, której używasz właśnie w tym celu. Virtualbox/vagrant, na przykład. Twórz skrypty konfigurujące wirtualną skrzynkę i instaluj odpowiednie zależności.

Skrypt instalatora instalatora może następnie wykonać nowe sprawdzenie projektu wewnątrz wirtualnej skrzynki i wykonać powtarzalną czynność kompilacji w miejscu, w którym chcesz ją zainstalować w instalatorze (na przykład /opt/yourproject).

Następnie użyj FPM, aby utworzyć rzeczywisty pakiet (.deb, .rpm, cokolwiek). Przekaż opcje FPM, które mówią o niezbędnych zależnościach, w ten sposób zawsze możesz być pewien, że te zależności są zainstalowane. (Uwaga: są to zależności na poziomie systemu operacyjnego, takie jak memcached lub postgres; zależności Pythona powinny być obsługiwane przez pip lub buildout).

Jeśli podzielisz swój duży problem na te dwa mniejsze problemy, oba mogą zostać zaatakowane osobno.

+1

Jednym z problemów z FPM jest to, że różne pakiety (które chcesz zainstalować) mogą mieć różne zależności (np. Jeden pakiet wymaga żądań 1.6 i innych żądań 2.1, itp.) I nie można wyrazić tych różnic, ponieważ FPM spakuje pojedynczy pakiet python jako RPM i zainstaluje go (globalnie, że tak powiem). Byłoby więc lepiej zainstalować projekt Pythona i jego zależności jako pojedynczy RPM, np. [Rpmvenv] (https://github.com/kevinconway/rpmvenv). – miku