{"id":22818,"date":"2023-07-17T05:00:00","date_gmt":"2023-07-17T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=22818"},"modified":"2023-07-14T14:00:37","modified_gmt":"2023-07-14T12:00:37","slug":"poetry-jako-przyszlosc-konfiguracji-projektow-pythonowych","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/poetry-jako-przyszlosc-konfiguracji-projektow-pythonowych\/","title":{"rendered":"Poetry jako przysz\u0142o\u015b\u0107 konfiguracji projekt\u00f3w pythonowych"},"content":{"rendered":"\n<p>Python to j\u0119zyk programowania, kt\u00f3ry pozwala pracowa\u0107 szybciej i skuteczniej integrowa\u0107 systemy. Przyci\u0105ga nowych u\u017cytkownik\u00f3w, jak r\u00f3wnie\u017c osoby do\u015bwiadczone z programowaniem, swoj\u0105 prostot\u0105 i przejrzysto\u015bci\u0105, ale te\u017c mo\u017cliwo\u015bciami oraz ogromn\u0105 spo\u0142eczno\u015bci\u0105. Niezale\u017cnie od stopnia zaawansowania, ka\u017cdy projekt potrzebuje pocz\u0105tkowej konfiguracji, dzi\u0119ki kt\u00f3rej b\u0119dziemy mogli spokojnie przej\u015b\u0107 do tego, co wszyscy lubimy najbardziej \u2013 kodowania.<\/p>\n\n\n\n<p>W artykule przyjrzyjmy si\u0119, gdzie w ca\u0142ym tym zamieszaniu wpasowuje si\u0119 Poetry i dlaczego uwa\u017cane jest za przysz\u0142o\u015b\u0107 (b\u0105d\u017a mo\u017ce tera\u017aniejszo\u015b\u0107?) w Pythonie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dlaczego Poetry?<\/strong><\/h2>\n\n\n\n<p>Zewn\u0119trzne zale\u017cno\u015bci (paczki), wirtualne \u015brodowisko czy te\u017c mechanizm tworzenia i udost\u0119pniania w\u0142asnych paczek. Ka\u017cdy z tych proces\u00f3w ma w\u0142asne narz\u0119dzie, stworzone tylko do tego celu.<\/p>\n\n\n\n<p>Ka\u017cdy programista Pythona na pewnym etapie u\u017cywa\u0142 narz\u0119dzia o nazwie \u201epip\u201d (<a href=\"https:\/\/pypi.org\/project\/pip\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Python Package Installer<\/a>). Pozwala ono na instalacj\u0119 zewn\u0119trznych paczek za pomoc\u0105 prostych komend. Najcz\u0119\u015bciej spotykanym rozwi\u0105zaniem jest agregowanie wszystkich zale\u017cno\u015bci w jednym pliku \u2013 requirements.txt. Dzi\u0119ki temu mo\u017cemy jedn\u0105 komend\u0105 instalowa\u0107 wiele paczek na raz.<\/p>\n\n\n\n<p>Kolejnym znanym i rekomendowanym narz\u0119dziem jest <a href=\"https:\/\/virtualenv.pypa.io\/en\/latest\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Virtualenv<\/a>, kt\u00f3re s\u0142u\u017cy do izolowania \u015brodowisk. W ten spos\u00f3b mo\u017cemy dysponowa\u0107 wieloma niezale\u017cnymi \u015brodowiskami, bez ryzyka za\u015bmiecana g\u0142\u00f3wnej instalacji Pythona.<\/p>\n\n\n\n<p>Dwa wymienione wy\u017cej narz\u0119dzia w wielu przypadkach s\u0105 wystarczaj\u0105ce na pocz\u0105tkowym etapie projektu. A co, je\u017celi chcieliby\u015bmy utworzy\u0107 paczk\u0119 ze swoim kodem i udost\u0119pni\u0107 j\u0105 innym osobom?<\/p>\n\n\n\n<p>Z tym mo\u017ce pom\u00f3c nast\u0119pne mechanizm \u2013 <a href=\"https:\/\/setuptools.pypa.io\/en\/latest\/index.html\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >setuptools<\/a>, kt\u00f3re u\u0142atwia proces pakowania projekt\u00f3w i wysy\u0142ania ich do repozytorium PyPi (<a href=\"https:\/\/pypi.org\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Python Package Index<\/a>).<\/p>\n\n\n\n<p>Wr\u00f3\u0107my zatem do pytania zadanego we wst\u0119pie artyku\u0142u: gdzie w tym wszystkim pasuje <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/python-poetry.org\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Poetry<\/a>? Odpowied\u017a jest prosta \u2013 wsz\u0119dzie! <strong>Jest tym jednym narz\u0119dziem, kt\u00f3re \u0142\u0105czy je wszystkie<\/strong>. Ma ogrom&nbsp;(i nawet wi\u0119cej) funkcjonalno\u015bci oprogramowa\u0144 opisanych wy\u017cej. Stare porzekad\u0142o m\u00f3wi: \u201eje\u015bli co\u015b jest do wszystkiego, to jest do niczego\u201d. Na szcz\u0119\u015bcie nie w tym przypadku.<\/p>\n\n\n\n<p>Poetry jest narz\u0119dziem do zarz\u0105dzania zale\u017cno\u015bciami (nie tylko paczkami!). Kieruje nimi (instaluje, aktualizuje i usuwa) i potrafi budowa\u0107 zasoby do dystrybucji. A to wszystko zapakowane w jedno, proste i przejrzyste oprogramowanie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pierwsze kroki<\/strong> <strong>z Poetry<\/strong><\/h2>\n\n\n\n<p>Przygod\u0119 z Poetry nale\u017cy zacz\u0105\u0107 od jego instalacji prost\u0105, pojedyncz\u0105 komend\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -sSL https:\/\/install.python-poetry.org | python3 -<\/pre>\n\n\n\n<p>Powy\u017csza komenda jest przeznaczona dla system\u00f3w Linux, macOS i Windows (WSL). Wersja dla Windows Powershell:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(Invoke-WebRequest -Uri https:\/\/install.python-poetry.org -UseBasicParsing).Content | py -<\/pre>\n\n\n\n<p>Jest to oficjalny skrypt, kt\u00f3ry instaluje Poetry w prywatnym, wirtualnym \u015brodowisku Pythona.<\/p>\n\n\n\n<p>Po instalacji powinni\u015bmy sprawdzi\u0107, czy ca\u0142y proces przebieg\u0142 pomy\u015blnie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry --version<\/pre>\n\n\n\n<p>Je\u017celi widzisz komunikat podobny do \u201ePoetry (version 1.2.0)\u201d, to instalacja powiod\u0142a si\u0119 i jeste\u015bmy przygotowani do dalszej eksploracji.<\/p>\n\n\n\n<p>Kolejnym etapem jest stworzenie szkieletu projektu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry new poetry-demo<\/pre>\n\n\n\n<p>Wynikiem b\u0119dzie utworzenie katalogu o poni\u017cszej strukturze:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry-demo\n\u251c\u2500\u2500 pyproject.toml\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 poetry_demo\n\u2502   \u2514\u2500\u2500 __init__.py\n\u2514\u2500\u2500 tests\n    \u2514\u2500\u2500 __init__.py<\/pre>\n\n\n\n<p>Je\u017celi masz ju\u017c sw\u00f3j projekt i jedynie chcesz zainicjowa\u0107 w nim Poetry:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cd pre-existing-project\npoetry init<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pyproject.toml<\/strong><\/h2>\n\n\n\n<p>Kluczowym plikiem jest pyproject.toml. To w nim zarz\u0105dzamy swoim projektem i zale\u017cno\u015bciami. Obecnie wygl\u0105da tak:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[tool.poetry]\nname = \"poetry-demo\"\nversion = \"0.1.0\"\ndescription = \"\"\nauthors = []\nreadme = \"README.md\"\npackages = [{include = \"poetry_demo\"}]\n\n[tool.poetry.dependencies]\npython = \"^3.11\"\n\n\n[build-system]\nrequires = [\"poetry-core\"]\nbuild-backend = \"poetry.core.masonry.api\"<\/pre>\n\n\n\n<p>Poetry zak\u0142ada, \u017ce g\u0142\u00f3wny katalog wewn\u0105trz projektu b\u0119dzie nazwany tak samo jak w <em>tool.poetry.name<\/em>. Je\u017celi tak nie jest, nale\u017cy wype\u0142ni\u0107 pole <em>tool.poetry.packages<\/em> (tak jak w przyk\u0142adzie powy\u017cej).<\/p>\n\n\n\n<p>W projektach czasami mo\u017cna spotka\u0107 si\u0119 z tradycyjnym plikiem Manifest.in. Poetry zast\u0119puje go poprzez pola <em>tool.poetry.readme<\/em>, <em>tool.poetry.include<\/em> i <em>tool.poetry.exclude<\/em>. Dodatkowo wymagane jest dok\u0142adne okre\u015blenie wersji Pythona u\u017cywanej w tym projekcie. Domy\u015blnie ta warto\u015b\u0107 jest uzupe\u0142niana od wersji j\u0119zyka, na kt\u00f3rej zainstalowane jest Poetry.<\/p>\n\n\n\n<p>Wszystkie zale\u017cno\u015bci uzupe\u0142niamy w sekcji <em>tool.poetry.dependencies<\/em>. Mo\u017cna to zrobi\u0107 na dwa sposoby:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>R\u0119czne wpisanie kolejnych dependencji do pliku:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">[tool.poetry.dependencies]\npendulum = \"^2.1\"\npytest = \"==7.4.0\"<\/pre>\n\n\n\n<p>Po dopisaniu do pliku konieczne b\u0119dzie r\u0119czne zaktualizowanie \u015brodowiska (om\u00f3wione w dalszej cz\u0119\u015bci artyku\u0142u).<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>U\u017cycie komendy add:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry add pytest<\/pre>\n\n\n\n<p>Automatycznie zostanie znaleziona pasuj\u0105ca wersja do pozosta\u0142ych zale\u017cno\u015bci i nast\u0105pi instalacja biblioteki wraz z jej dependencjami.<\/p>\n\n\n\n<p>Istnieje wiele sposob\u00f3w okre\u015blenia wersji danej biblioteki, na przyk\u0142ad okre\u015blenie minimalnej b\u0105d\u017a konkretnej. Zalecane jest, aby podawa\u0107 zawsze sta\u0142\u0105 wersj\u0119. W ten spos\u00f3b mo\u017cemy unikn\u0105\u0107 problem\u00f3w z potencjalnie gro\u017anymi aktualizacjami paczek. Z drugiej strony dok\u0142ada to dodatkowych zada\u0144 deweloperom \u2013 warto utrzymywa\u0107 najnowsze wersje dependencji.<\/p>\n\n\n\n<p>Wi\u0119cej szczeg\u00f3\u0142\u00f3w na temat mo\u017cliwych opcji okre\u015blenia zale\u017cno\u015bci w projekcie znajdziecie w <a href=\"https:\/\/python-poetry.org\/docs\/dependency-specification\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >oficjalnej dokumentacji<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wirtualne \u015brodowisko<\/strong><\/h2>\n\n\n\n<p>W trakcie konfigurowania projektu, Poetry tworzy wirtualne \u015brodowisko w katalogu <em>{cache-dir}\/virtualenvs<\/em>. Mo\u017cna zmieni\u0107 ten katalog poprzez pliki konfiguracyjne Poetry tak, aby \u015brodowisko zosta\u0142o zainstalowane klasycznie (tak jak virtualenv) wewn\u0105trz folderu projektu.<\/p>\n\n\n\n<p>Istnieje wiele metod odpalania komend przy u\u017cyciu wirtualnego \u015brodowiska utworzonego przez Poetry. Najprostszym z nich jest komenda <em>run<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry run python your_script.py\npoetry run pytest<\/pre>\n\n\n\n<p>Kolejnym sposobem jest aktywowanie wirtualnego \u015brodowiska i nast\u0119pnie wykonywanie komend. Najpro\u015bciej mo\u017cna to osi\u0105gn\u0105\u0107 poprzez <em>poetry shell<\/em> (<em>deactivate<\/em> dezaktywuje \u015brodowisko). Poetry tworzy w ten spos\u00f3b subproces, kt\u00f3ry posiada aktywowane \u015brodowisko. Poni\u017csza tabela przedstawia sposoby aktywowania na r\u00f3\u017cnych systemach r\u00f3\u017cnymi sposobami:<\/p>\n\n\n\n<figure class=\"wp-block-table caption-align-center\"><table><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">&nbsp;<\/td><td class=\"has-text-align-center\" data-align=\"center\">Posix-shell<\/td><td class=\"has-text-align-center\" data-align=\"center\">Windows Powershell<\/td><td class=\"has-text-align-center\" data-align=\"center\">dezaktywowanie<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Sub-shell<\/td><td class=\"has-text-align-center\" data-align=\"center\">Poetry shell<\/td><td class=\"has-text-align-center\" data-align=\"center\">Poetry shell<\/td><td class=\"has-text-align-center\" data-align=\"center\">Exit<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Manualna aktywacja<\/td><td class=\"has-text-align-center\" data-align=\"center\">source {path_to_venv}\/bin\/activate<\/td><td class=\"has-text-align-center\" data-align=\"center\">{path_to_venv}\\Scripts\\activate.ps1<\/td><td class=\"has-text-align-center\" data-align=\"center\">deactivate<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Jednoliniowa aktywacja<\/td><td class=\"has-text-align-center\" data-align=\"center\">source $(poetry env info &#8211;path)\/bin\/activate<\/td><td class=\"has-text-align-center\" data-align=\"center\">&amp; ((poetry env info &#8211;path) + &#8222;\\Scripts\\activate.ps1&#8221;)<\/td><td class=\"has-text-align-center\" data-align=\"center\">deactivate<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Tab. 1 Sposoby aktywowania wirtualnego \u015brodowiska<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Instalacja i aktualizacja dependencji<\/strong><\/h2>\n\n\n\n<p>Instalacja odbywa si\u0119 poprzez komend\u0119 <em>poetry install<\/em>. Automatycznie wczytywania jest zawarto\u015b\u0107 pliku <em>poetry.lock<\/em> i nast\u0119pnie s\u0105 dwa dalsze scenariusze:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\">\n<li>Instalacja bez pliku <em>poetry.lock<\/em><\/li>\n<\/ol>\n\n\n\n<p>Je\u017celi nigdy wcze\u015bniej nie by\u0142a przeprowadzona instalacja projektu i nie ma pliku <em>poetry.lock<\/em>, Poetry rozwi\u0105zuje wszystkie zale\u017cno\u015bci opisane w pliku <em>pyproject.toml<\/em> i pobiera najnowsze wersje dependencji. Po zako\u0144czeniu instalacji, tworzony jest plik <em>poetry.lock<\/em> z dok\u0142adn\u0105 informacj\u0105, jakie wersje zosta\u0142y zainstalowane.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Instalacja z plikiem <em>poetry.lock<\/em><\/li>\n<\/ol>\n\n\n\n<p>Gdy w projekcie mamy plik <em>poetry.lock<\/em> i <em>pyproject.toml<\/em>, oznacza to, i\u017c albo wcze\u015bniej instalowali\u015bmy projekt, albo plik <em>poetry.lock<\/em> zosta\u0142 zapisany na repozytorium (to dobrze).<\/p>\n\n\n\n<p>W tej sytuacji instalowanie przebiega podobnie, Poetry rozwi\u0105zuje wszystkie zale\u017cno\u015bci z pliku <em>pyproject.toml<\/em>, ale poszczeg\u00f3lne wersje wybiera z pliku <em>poetry.lock<\/em>.<\/p>\n\n\n\n<p>Dobr\u0105 praktyk\u0105 jest zapisywanie w repozytorium pliku <em>poetry.lock<\/em>. Dzi\u0119ki temu wszystkie osoby pracuj\u0105ce nad projektem b\u0119d\u0105 mia\u0142y identyczne wersje dependencji. Ten sam efekt mo\u017cna uzyska\u0107 poprzez ustalenie konkretnych wersji zale\u017cno\u015bci w pliku <em>pyproject.toml<\/em>. Zaleca si\u0119, aby pomimo sta\u0142ej wersji w <em>pyproject.toml<\/em>, zapisywa\u0107 plik <em>poetry.lock<\/em> do repozytorium.<\/p>\n\n\n\n<p>Aby zaktualizowa\u0107 biblioteki do najnowszej wersji, nale\u017cy u\u017cy\u0107 komendy <em>poetry update<\/em>. Spowoduje to zainstalowanie najnowszych wersji, jak r\u00f3wnie\u017c aktualizacj\u0119 pliku <em>lock<\/em>. Taki sam efekt mo\u017cna uzyska\u0107 poprzez usuni\u0119cie pliku <em>lock<\/em> i ponowne uruchomienie komendy <em>install<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/install.gif\"><img decoding=\"async\" width=\"848\" height=\"647\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/install.gif\" alt=\"Poetry - install (gif)\" class=\"wp-image-22825\"\/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 <a href=\"https:\/\/github.com\/python-poetry\/poetry\/blob\/master\/assets\/install.gif\" target=\"_blank\" aria-label=\"Poetry \u2013 install (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Poetry \u2013 install<\/a><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Budowanie paczek i ich dystrybucja<\/strong><\/h2>\n\n\n\n<p>Poetry ma prosty mechanizm budowania i publikowania na PyPi paczek stworzonych z projektu.<\/p>\n\n\n\n<p>Jednym z g\u0142\u00f3wnych wymaga\u0144, zanim przyst\u0105pimy do budowania paczki, jest wersjonowanie. Poetry nie narzuca \u017cadnej konwencji wersjonowania, ale jest zalecanym, aby stosowa\u0107 si\u0119 do zasad <a href=\"https:\/\/semver.org\/lang\/pl\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >semantycznego wersjonowania<\/a> (<a href=\"https:\/\/peps.python.org\/pep-0440\/#semantic-versioning\" rel=\"nofollow\" >PEP 440<\/a>). Na przyk\u0142ad wersja 1.0.0-hotfix.1 nie jest poprawna. W zamian za to mo\u017cna u\u017cy\u0107 1.0.0-post1, b\u0105d\u017a 1.0.0.post1.<\/p>\n\n\n\n<p>Kolejnym elementem, kt\u00f3ry warto rozwa\u017cy\u0107, jest plik <em>poetry.lock<\/em>. W poprzedniej cz\u0119\u015bci opisane zosta\u0142y powody, dla kt\u00f3rych powinno si\u0119 przechowywa\u0107 ten plik w repozytorium. Je\u017celi jednak nie chcemy tego robi\u0107, mo\u017cna doda\u0107 ten plik do listy <em>.gitignore<\/em>.<\/p>\n\n\n\n<p>Przed publikowaniem paczki nale\u017cy j\u0105 zbudowa\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry build\n<\/pre>\n\n\n\n<p>Ta komenda zbuduje paczk\u0119 w dw\u00f3ch formatach:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\">\n<li>Sdisk: plik, kt\u00f3ry zawiera kod \u017ar\u00f3d\u0142owy aplikacji razem z instrukcjami jak je zainstalowa\u0107. Na tej podstawie system docelowy klienta buduje paczk\u0119 <em>wheel<\/em> bezpo\u015brednio.<\/li>\n\n\n\n<li>Bdist (wheel): archiwum plik\u00f3w binarnych, kt\u00f3re mog\u0105 by\u0107 zainstalowane na konkretnej platformie (np.: linux-x86_64) z konkretn\u0105 wersj\u0105 Pythona (np.: Python3.9).<\/li>\n<\/ol>\n\n\n\n<p>U\u017cywanie paczek <em>wheel<\/em> jest powszechnie stosowane. Oferuj\u0105 one du\u017co wi\u0119ksz\u0105 pr\u0119dko\u015b\u0107 instalacji, a pliki s\u0105 mniejsze. Domy\u015blnie Poetry czy te\u017c pip u\u017cywaj\u0105 plik\u00f3w <em>wheel<\/em>. Natomiast najlepsz\u0105 opcj\u0105 jest publikacja obu wersji, poniewa\u017c bardzo trudno jest stworzy\u0107 archiwa plik\u00f3w binarnych dla ka\u017cdej wersji systemu i Pythona, za\u015b sdisk pozwala na instalacj\u0119 ka\u017cdemu.<\/p>\n\n\n\n<p>Publikacja paczki odbywa si\u0119 poprzez komend\u0119:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry publish<\/pre>\n\n\n\n<p>Domy\u015blnie Poetry publikuje wszystko do publicznego PyPi pod warunkiem, i\u017c jest si\u0119 zarejestrowanym u\u017cytkownikiem i dane do logowania zosta\u0142y poprawnie skonfigurowane.<\/p>\n\n\n\n<p>Warto odnotowa\u0107, \u017ce komenda powy\u017cej nie buduje paczki, nale\u017cy to zrobi\u0107 wcze\u015bniej b\u0105d\u017a doda\u0107 flag\u0119 \u2013<em>build<\/em>.<\/p>\n\n\n\n<p>Je\u017celi planujemy wys\u0142a\u0107 nasz\u0105 paczk\u0119 do prywatnego repozytorium, musimy j\u0105 doda\u0107 do globalnej listy:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry source add --priority=supplemental foo https:\/\/pypi.example.org\/simple\/\npoetry config repositories.foo https:\/\/pypi.example.org\/legacy\/<\/pre>\n\n\n\n<p>I nast\u0119pnie zmodyfikowa\u0107 komend\u0119 <em>publish<\/em> poprzez dodanie parametru:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poetry publish --build --repository foo<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Poetry jest bardzo wszechstronnym narz\u0119dziem wykorzystywanym coraz cz\u0119\u015bciej przez programist\u00f3w, czemu dowodzi ponad 13 milion\u00f3w pobra\u0144 miesi\u0119cznie (stan na 07.2023).<\/p>\n\n\n\n<p>W artykule zosta\u0142y opisane tylko podstawowe funkcjonalno\u015bci pozwalaj\u0105ce w pe\u0142ni skonfigurowa\u0107 i utrzymywa\u0107 w porz\u0105dku nawet bardzo du\u017ce projekty. Poetry ma jeszcze wiele ciekawych mechanizm\u00f3w takich jak inne repozytorium jako dependencja, system plugin\u00f3w itp. Jest to jednak materia\u0142 na osobny artyku\u0142.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;22818&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;9&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 9)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Poetry jako przysz\u0142o\u015b\u0107 konfiguracji projekt\u00f3w pythonowych&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 9)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Python to j\u0119zyk programowania, kt\u00f3ry pozwala pracowa\u0107 szybciej i skuteczniej integrowa\u0107 systemy. Przyci\u0105ga nowych u\u017cytkownik\u00f3w, jak r\u00f3wnie\u017c osoby do\u015bwiadczone z &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/poetry-jako-przyszlosc-konfiguracji-projektow-pythonowych\/\">Continued<\/a><\/p>\n","protected":false},"author":543,"featured_media":22828,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1754,1546,584],"class_list":["post-22818","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-poetry","tag-przeglad-narzedzi","tag-python"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/Poetry-jako-przyszlosc-konfiguracji-projektow-pythonowych.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22818"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/543"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=22818"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22818\/revisions"}],"predecessor-version":[{"id":22847,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22818\/revisions\/22847"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/22828"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=22818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=22818"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=22818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}