Jak są używane pliki Pipfile i Pipfile.lock?

149

Wygląda na to, że Pipfile / Pipfile.lock mają być zamiennikami dla Requirements.txt w kontekście pakowania Pythona. Nie ma jednak zbyt wielu dokumentacji na temat tego, jak one faktycznie działają. Znalazłem ewoluujący opis pipfile w sekcji PyPi na stronie Python tutaj, ale jest dość niechlujny i nie wyjaśnia semantyki różnych sekcji pliku.

Jakieś wskazówki, jak rozumieć te pliki?

Stephen
źródło
3
Jest to bezpośredni odpowiednik świata Rubiego Gemfilei Gemfile.lockze świata Rubiego: .lockplik ma określone wersje dla każdej zależności; ten bez tego rozszerzenia ma tylko wersje znane kontrolującym ludzi. To powiedziawszy, proszenie o wyjaśnienie czegoś, co wciąż ewoluuje i jest dalekie od dobrze zdefiniowanego, znacznie mniej znormalizowanego, jest być może nieco przedwczesne.
Charles Duffy
(I podobnie, różnica między Pipfilei requirements.txtpolega w dużej mierze na tym, że ten pierwszy próbuje zaadoptować funkcje ze świata Rubiego, tj. Jest w stanie określić zestawy zależności dla wielu środowisk oraz z warunkami / opcjami / itp. W jednym pliku).
Charles Duffy
1
Wygląda na to, że zostało już wdrożone w repozytorium Heroku "Pierwsze kroki z Pythonem" ( github.com/heroku/python-getting-started.git ), więc się to podoba, czy nie, wydaje się, że zostało wyprodukowane.
Stephen
1
Mam cię. To powiedziawszy - dokumenty wyglądają dla mnie całkiem solidnie. Nie wiem, co mógłbym napisać w odpowiedzi, która nie byłaby tylko powtórzeniem ich.
Charles Duffy,
1
Jeśli odnosisz się do linku, który utworzyłem w OP, to pomijanych jest wiele rzeczy, na przykład co to właściwie oznacza, że ​​coś znajduje się w sekcji o nazwie źródło.
Stephen

Odpowiedzi:

180

Koncepcja tych plików jest prosta i analogiczna do innych już istniejących narzędzi, jeśli masz jakąś znajomość z Ruby's Bundler lub Node's Npm. Pipenvto narzędzie do zarządzania pakietami i środowiskiem wirtualnym, które wykorzystuje pliki Pipfile i Pipfile.lock do osiągnięcia tych celów.

Pipenv obsługuje środowisko wirtualne za Ciebie w jeden domyślny standardowy sposób (nie jest już wymagana aktywacja i dezaktywacja). Poniżej kilka podstawowych informacji, które pomogą Ci zacząć, więcej informacji znajdziesz na stronie pipenv .

Pierwsze kroki

Rozpoczęcie korzystania z pipenv jest łatwe, w folderze projektu ...

$ pipenv install

... a jeśli już ma requirements.txtplik, wygeneruje Pipfileplik z wymaganiami i folderem środowiska wirtualnego, w przeciwnym razie wygeneruje pusty Pipfileplik. Jeśli nie podobało Ci się coś, co zainstalowałeś lub zmieniłeś zdanie, po prostu wpisz ...

$ pipenv uninstall <package>

... i jesteś gotowy. Aby aktywować środowisko wirtualne, które już wygenerował pipenv, przejdź do ...

$ pipenv shell

... a Twoje wirtualne środowisko zostanie aktywowane. Opuścić środowisko ...

$ exit

... i wrócisz do pierwotnej sesji terminala.

Pipfile

Plik Pipfile ma na celu określenie wymagań pakietów dla aplikacji lub biblioteki Pythona, zarówno w zakresie programowania, jak i wykonywania. Możesz zainstalować pakiet, po prostu używając ...

$ pipenv install flask

... i zostanie dodany jako zależność do wdrożenia i wykonania lub przy użyciu ...

$ pipenv install --dev pytest

... i będzie używany jako zależność od czasu programowania. Składnia pliku jest dość prosta, jak poniżej.

[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # Here goes your package requirements for developing the application and its versions (which packaes you will use when developing the application)
pylint = "*"
wheel = "*"

[requires] # Here goes your required Python version.
python_version = "3.6"

Pipfile.lock

Pipfile.lock ma na celu określenie, na podstawie obecnych pakietów w Pipfile , które powinny być wykorzystane specyficzna wersja tych, unikając ryzyka automatycznie uaktualniania pakietów, które zależą od siebie i łamiąc drzewa zależności projektu.

Możesz zablokować swoje aktualnie zainstalowane pakiety za pomocą ...

$ pipenv lock

... a narzędzie przeszuka folder środowiska wirtualnego, aby automatycznie wygenerować plik blokady na podstawie aktualnie zainstalowanych wersji. Składnia pliku nie jest tak oczywista, jak w przypadku Pipfile , więc ze względu na zwięzłość nie będzie tutaj wyświetlana.

danieldeveloper001
źródło
To interesująca odpowiedź, ale myślę, że kiedy o to pytałem, nie mogłem do końca zrozumieć, co właściwie oznacza [[source]], na przykład, czy jest to źródło pakietów, które są pobierane przez pipenv, czy coś innego? Myślę, że reszta dwóch plików jest wystarczająco oczywista.
Stephen
1
Przyznaję, wydało mi się to zagmatwane, ponieważ pracuję nad tutorialem, w którym muszę zdecydować, czy różnica [pakiet] / [pakiet-dewelopera] jest ważna, czy też powinienem po prostu umieścić wszystko w [pakiet]. (Szukanie tego w Google jest tym, co doprowadziło mnie do tej strony.) Ale posiadanie obu podczas umieszczania rzeczy deweloperskich w [pakiecie] trochę mnie wyrzuciło. Widziałem jednak, dlaczego prośby powinny znajdować się w [pakiet].
Al Sweigart
1
Zmieniono zgodnie z prośbą, aby uniknąć nieporozumień dotyczących pakietów deweloperskich, dziękuję za komentarz, mam nadzieję, że teraz jest mniej zagmatwany :)
danieldeveloper001
1
Myślę, że to dobry pomysł, jeśli chcesz śledzić wersje pakietów w trakcie ewolucji kodu źródłowego, ponieważ większość pakietów będzie oznaczona gwiazdką Pipfile. Jeśli coś się zepsuje podczas aktualizacji pakietu, należy to naprawić, przeglądając historię wersji pakietu, i rzeczywiście, jeden z twórców biblioteki żądań zaleca zrobienie tego tutaj .
danieldeveloper001
1
@Stephen, w rzeczywistości jest odwrotnie, jak stwierdzono w dokumentacji instalacji pipenv , możesz określić --skip-lockflagę, aby zmusić go do ignorowania Pipfile.lockpliku, zamiast zmuszać go do użycia;)
danieldeveloper001