{"id":3348,"date":"2022-12-01T11:08:38","date_gmt":"2022-12-01T11:08:38","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"},"modified":"2026-03-09T13:07:45","modified_gmt":"2026-03-09T13:07:45","slug":"obsluga-wielu-srodowisk-dla-wielu-projektow-na-jednym-komputerze","status":"publish","type":"post","link":"https:\/\/thecodest.co\/pl\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","title":{"rendered":"Obs\u0142uga wielu \u015brodowisk dla wielu projekt\u00f3w na jednym komputerze?"},"content":{"rendered":"<p>Przyjrzyjmy si\u0119 typowemu \u015brodowisku pracy w <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/how-to-choose-software-house\/\">software house<\/a>. Masz kilku klient\u00f3w, kt\u00f3rzy maj\u0105 r\u00f3\u017cne \u015brodowiska. Niekt\u00f3rzy preferuj\u0105 MySQL, inni Postgres. Jedna z wersji aplikacji wymaga <a href=\"https:\/\/thecodest.co\/pl\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a> 11, a kolejna Java 17. Frontend wymaga npm 12 lub 16, poniewa\u017c u\u017cywasz r\u00f3\u017cnych wersji <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/what-is-node-js-used-for-in-angular\/\">k\u0105towy<\/a>. Wreszcie masz t\u0119 tr\u00f3jwymiarow\u0105 tablic\u0119, kt\u00f3ra zawiera kombinacje wszystkich baz danych, wersji zaplecza i frontendu. Brzmi \u017ale, ale pewnego dnia tw\u00f3j szef m\u00f3wi...<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/comic.png\" alt=\"komiksy&lt;em&gt;z&lt;\/em&gt; szefem\" title=\"kiedy tw\u00f3j szef m\u00f3wi...\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Korzenie \u015brodowiska multiwersum<\/h2>\n\n\n\n<p>Sytuacja opisana powy\u017cej nie jest niczym niezwyk\u0142ym. Migracja mi\u0119dzy wersjami j\u0119zykowymi lub framework\u00f3w, aktualizacje baz danych lub po prostu r\u00f3\u017cne wymagania klient\u00f3w mog\u0105 wywr\u00f3ci\u0107 wszystkie konfiguracje do g\u00f3ry nogami. Powinni\u015bmy mie\u0107 rozwi\u0105zanie, kt\u00f3re pomo\u017ce <a href=\"https:\/\/thecodest.co\/pl\/blog\/why-us-companies-are-opting-for-polish-developers\/\">my<\/a> zarz\u0105dza\u0107 tymi zmianami, taki, kt\u00f3ry odpowiada kilku za\u0142o\u017ceniom i\/lub wymaganiom i\/lub celom:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b> \u0142atwy w u\u017cyciu<\/b> - pojedyncze polecenie do zmiany konfiguracji lub wersji,<\/li>\n\n\n\n<li><b>bogata biblioteka<\/b> - powinien obs\u0142ugiwa\u0107 wiele technologii i \"rzeczy\" (bibliotek, framework\u00f3w, aplikacji),<\/li>\n\n\n\n<li><b> rozszerzalny<\/b> - powiniene\u015b oferowa\u0107 mo\u017cliwo\u015b\u0107 dodawania swoich wtyczek.<\/li>\n<\/ul>\n\n\n\n<p>W tym artykule skupi\u0119 si\u0119 na trzech obszarach. Pierwszy to narz\u0119dzia dla Javy i JVM. Drugi to narz\u0119dzia og\u00f3lnego przeznaczenia. Trzeci to jak u\u017cywa\u0107 <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/docker-developer\/\">doker<\/a> aby osi\u0105gn\u0105\u0107 nasze cele.<\/p>\n\n\n\n<p>\u200b<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jestem Java i pracuj\u0119 na JVM<\/h2>\n\n\n\n<p>Kiedy jeste\u015b <strong><a href=\"https:\/\/thecodest.co\/pl\/dictionary\/java-developer\/\">Programista Java<\/a><\/strong> lub, bardziej og\u00f3lnie, pracujesz z <strong>Technologie JVM<\/strong>mo\u017cna u\u017cy\u0107 <a href=\"https:\/\/sdkman.io\/\">SDKMAN!<\/a>. Jest to bardzo przyjemne i \u0142atwe w u\u017cyciu narz\u0119dzie, kt\u00f3re obs\u0142uguje wiele bibliotek, framework\u00f3w i j\u0119zyk\u00f3w.<\/p>\n\n\n\n<p>Proces instalacji <strong>SDKMAN!<\/strong> To ca\u0142kiem proste. Musisz biega\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>curl -s \"https:\/\/get.sdkman.io\" | bash<\/code><\/code><\/pre>\n\n\n\n<p>a nast\u0119pnie<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code><code>source \"$HOME\/.sdkman\/bin\/sdkman-init.sh\"<\/code><\/code><\/code><\/pre>\n\n\n\n<p>Teraz mo\u017cesz zarz\u0105dza\u0107 <strong>Java<\/strong>, <strong>Scala<\/strong> i <strong>Maven<\/strong> wersje.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zarz\u0105dzanie wersjami - przyk\u0142ad<\/h3>\n\n\n\n<p>W tym przyk\u0142adzie zainstalujemy i zaktualizujemy wersj\u0119 kilku narz\u0119dzi. To tylko niewielki podzbi\u00f3r dost\u0119pnych narz\u0119dzi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Instalacja<\/h3>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce tw\u00f3j nowy <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/why-do-projects-fail\/\">projekt<\/a> zastosowania <strong>Java 17<\/strong>. Nie masz \u017cadnych <strong>Java<\/strong> wersja zainstalowana. Chcesz j\u0105 zainstalowa\u0107 i dodatkowo doda\u0107 narz\u0119dzie Maven Daemon, aby przyspieszy\u0107 kompilacje. Musisz wi\u0119c r\u00f3wnie\u017c zainstalowa\u0107 Mavena. Aby to zrobi\u0107, nale\u017cy wykona\u0107 trzy proste polecenia:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk install java 17-open\n\n$ sdk install maven 3.8.4\n\n$ sdk install mvnd 0.7.1<\/code><\/pre>\n\n\n\n<p>Pod koniec instalacji ka\u017cdego narz\u0119dzia zostaniesz zapytany o ustawienie go jako domy\u015blnego:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>Czy chcesz, aby Java 17-open by\u0142a ustawiona jako domy\u015blna? (T\/n):<\/code><\/code><\/pre>\n\n\n\n<p>Jest to wa\u017cne podczas instalowania nowej wersji biblioteki lub j\u0119zyka, poniewa\u017c SDKMAN! ustawi t\u0119 domy\u015bln\u0105 wersj\u0119 jako globaln\u0105 dla wszystkich terminali dla bie\u017c\u0105cego u\u017cytkownika.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sprawdzanie wersji i aktualizacja<\/h3>\n\n\n\n<p>Od czasu do czasu SDKMAN! musi aktualizowa\u0107 indeksy. W tym czasie mo\u017ce pojawi\u0107 si\u0119 komunikat o nowych wersjach narz\u0119dzi, z kt\u00f3rych korzystamy. Mo\u017cemy sprawdzi\u0107, kt\u00f3re wersje s\u0105 dost\u0119pne, wpisuj\u0105c <code>sdk ls<\/code>. Dla <code>sdk ls maven<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Dost\u0119pne wersje Maven\n\n================================================================================\n\n    3.8.6 3.3.3\n\n    3.8.5 3.3.1\n\n3.8.4 3.2.5\n\n    3.8.3 3.2.3\n\n    3.8.2 3.2.2\n\n    3.8.1 3.2.1\n\n    3.6.3 3.1.1\n\n    3.6.2 3.1.0\n\n    3.6.1 3.0.5\n\n    3.6.0 3.0.4\n\n    3.5.4\n\n    3.5.3\n\n    3.5.2\n\n    3.5.0\n\n    3.3.9\n\n\n\n================================================================================\n\nwersja lokalna\n\nobecnie u\u017cywana\n\n================================================================================<\/code><\/pre>\n\n\n\n<p>Jak widzimy powy\u017cej, Maven ma nowsz\u0105 wersj\u0119 ni\u017c ta, kt\u00f3rej u\u017cywamy. To samo dotyczy <code>mvnd<\/code> (0.8.2) i Java (19-open). Zaktualizujmy wszystko. Aby to zrobi\u0107, wystarczy wywo\u0142a\u0107 polecenie install, ale tym razem nie u\u017cywamy specyfikatora wersji:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk install maven\n\n$ sdk install mvnd\n\n$ sdk install java<\/code><\/pre>\n\n\n\n<p>Ale sta\u0142o si\u0119 co\u015b z\u0142ego. <code>Maven<\/code> i <code>mvnd<\/code> maj\u0105 poprawne wersje, ale <strong>Java<\/strong> ma wersj\u0119 <code>17.0.5-tem<\/code>. Dzieje si\u0119 tak, poniewa\u017c \"najnowsza\" wersja narz\u0119dzia jest kontrolowana przez jego dostawc\u0119, a nie lokalny SDKMAN! Kim jest ten dostawca? Sprzedawca w SDKMAN! to kto\u015b, kto mo\u017ce opublikowa\u0107 wersj\u0119. Za\u0142\u00f3\u017cmy jednak, \u017ce w ko\u0144cu zainstalujemy <code>19-otwarty<\/code>i ustawili\u015bmy j\u0105 jako domy\u015bln\u0105, ale z jakiego\u015b powodu musimy u\u017cy\u0107 <code>17-otwarty<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wersje lokalne i zarz\u0105dzanie wersjami dla poszczeg\u00f3lnych terminali<\/h3>\n\n\n\n<p>\u200b<br>Mo\u017cemy skonfigurowa\u0107 <code>domy\u015blny<\/code> wersja narz\u0119dzia, kt\u00f3ra jest globalna dla wszystkich projekt\u00f3w i terminali. Ale gdy potrzebujemy konkretnej wersji, mamy dwa sposoby, aby to zrobi\u0107. Pierwszym z nich jest u\u017cycie <code>sdk use<\/code> za ka\u017cdym razem, gdy chcemy u\u017cy\u0107 konkretnej wersji narz\u0119dzia w bie\u017c\u0105cym terminalu. Drugim jest przygotowanie listy wersji w pliku <code>.sdkmanrc<\/code> kt\u00f3ry jest przechowywany wraz z projektem.<\/p>\n\n\n\n<p>Podczas gdy pierwsza opcja jest przeznaczona do jednorazowego u\u017cytku, druga zosta\u0142a zaprojektowana do pracy w zespo\u0142ach i udost\u0119pniania konfiguracji mi\u0119dzy sob\u0105. <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/how-to-lead-software-development-team\/\">zesp\u00f3\u0142<\/a> cz\u0142onk\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plusy i minusy SDKMAN!<\/h3>\n\n\n\n<p>SDKMAN! jest bardzo \u0142atwy w u\u017cyciu i posiada bogat\u0105 bibliotek\u0119 obs\u0142ugiwanych narz\u0119dzi, framework\u00f3w i j\u0119zyk\u00f3w. Dzia\u0142a na systemach Linux, MacOS i Windows. Z drugiej strony, narz\u0119dzie to jest skoncentrowane na JVM i wymaga akceptacji autora jako dostawcy. Ponadto mechanika <code>.sdkmanrc<\/code> jest bardzo s\u0142aba i mo\u017ce znacznie spowolni\u0107 proces zmiany katalog\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Chcia\u0142bym u\u017cywa\u0107 wielu innych j\u0119zyk\u00f3w<\/h2>\n\n\n\n<p>Je\u015bli potrzebujesz korzysta\u0107 z wielu j\u0119zyk\u00f3w i narz\u0119dzi, powiniene\u015b rzuci\u0107 okiem na <a href=\"https:\/\/asdf-vm.com\/\">asdf<\/a>. Narz\u0119dzie to koncentruje si\u0119 na narz\u0119dziach \"wysokiego poziomu\". Podczas gdy w SDKMAN! mo\u017cna znale\u017a\u0107 wiele narz\u0119dzi specyficznych dla Javy, takich jak Bpipe czy Znai, asdf oferuje znacznie wi\u0119cej narz\u0119dzi, ale nie tak specyficznych. Oczywi\u015bcie niekt\u00f3re z tych narz\u0119dzi pokrywaj\u0105 si\u0119, np. Java, Tomcat lub mvnd s\u0105 dost\u0119pne w obu.<\/p>\n\n\n\n<p>Kiedy chcesz u\u017cy\u0107 <code>asdf<\/code>musisz mie\u0107 <code>git<\/code> i <code>zwija\u0107 si\u0119<\/code> zainstalowany. Nast\u0119pnie wystarczy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>git clone https:\/\/github.com\/asdf-vm\/asdf.git ~\/.asdf --branch v0.10.2<\/code><\/code><\/pre>\n\n\n\n<p>i doda\u0107 te linie w <code>~\/.bashrc<\/code> file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">. $HOME\/.asdf\/asdf.sh\n\n. $HOME\/.asdf\/completions\/asdf.bash<\/code><\/pre>\n\n\n\n<p>Teraz mo\u017cesz instalowa\u0107 wtyczki i narz\u0119dzia w swoich ulubionych wersjach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zarz\u0105dzanie oparte na wtyczkach<\/h3>\n\n\n\n<p>W przeciwie\u0144stwie do SDKMAN! <code>asdf<\/code> u\u017cywa wtyczek do zarz\u0105dzania narz\u0119dziami. Tak wi\u0119c, zanim b\u0119dzie mo\u017cna zainstalowa\u0107 narz\u0119dzie, nale\u017cy zainstalowa\u0107 wtyczk\u0119. Wr\u00f3\u0107my do naszego przyk\u0142adowego projektu i spr\u00f3bujmy skonfigurowa\u0107 \u015brodowisko za pomoc\u0105 <code>asadfsdf<\/code>.<\/p>\n\n\n\n<p>Najpierw musimy zainstalowa\u0107 wtyczki:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">asdf plugin add java\n\nasdf plugin add maven\n\nasdf plugin add mvnd<\/code><\/pre>\n\n\n\n<p>Nast\u0119pnie mo\u017cemy zainstalowa\u0107 nasze narz\u0119dzia:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">asdf install java openjdk-17\n\nasdf install maven 3.8.4\n\nasdf install mvnd 0.7.1<\/code><\/pre>\n\n\n\n<p>I po raz kolejny, w przeciwie\u0144stwie do SDKMAN! <code>asdf<\/code> nie zmienia niczego w naszym \u015brodowisku. Kiedy pr\u00f3bujemy u\u017cy\u0107 java, otrzymujemy komunikat o b\u0142\u0119dzie, taki jak:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Nie ustawiono wersji dla polecenia Java\n\nRozwa\u017c dodanie jednej z nast\u0119puj\u0105cych wersji w pliku konfiguracyjnym ~\/.tool-versions\n\njava openjdk-17<\/code><\/pre>\n\n\n\n<p>Musimy utworzy\u0107 plik <code>.tool-versions<\/code> w katalogu domowym, aby zarz\u0105dza\u0107 domy\u015blnymi wersjami.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wersje lokalne i globalne<\/h3>\n\n\n\n<p>Aktualizacja wersji oprogramowania za pomoc\u0105 <code>asdf<\/code> jest ca\u0142kiem proste. Po prostu instalujemy now\u0105 wersj\u0119. Poniewa\u017c proces ten nie wp\u0142ywa na \u015brodowisko, mo\u017cemy to zrobi\u0107 w dowolnym momencie i w dowolnym miejscu w systemie plik\u00f3w. Gdy chcemy u\u017cy\u0107 konkretnej wersji jakiego\u015b oprogramowania, musimy utworzy\u0107 w katalogu projektu plik <code>.tool-versions<\/code> plik, kt\u00f3ry mo\u017ce by\u0107 udost\u0119pniany cz\u0142onkom zespo\u0142u. Pami\u0119taj, \u017ce musisz zagwarantowa\u0107, \u017ce wszyscy cz\u0142onkowie zespo\u0142u maj\u0105 <code>asdf<\/code> i zainstalowane wtyczki. Lista wtyczek, kt\u00f3re mo\u017cna znale\u017a\u0107 <a href=\"https:\/\/github.com\/asdf-vm\/asdf-plugins\">tutaj<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konflikty wersji<\/h3>\n\n\n\n<p><code>asdf<\/code> obs\u0142uguje nie tylko j\u0119zyki programowania, frameworki i narz\u0119dzia takie jak vim czy kubernetess. Obs\u0142uguje r\u00f3wnie\u017c bazy danych. W takim przypadku mogliby\u015bmy zainstalowa\u0107 wiele wersji np. Postgresa, ale uruchomi\u0107 tylko jedn\u0105 instancj\u0119. To dlatego, \u017ce <code>asdf<\/code> wykonuje polecenia bezpo\u015brednio w systemie operacyjnym bez \u017cadnej warstwy separacji. Prowadzi to do problem\u00f3w takich jak \"port ju\u017c u\u017cywany\" i konflikt\u00f3w zasob\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plusy i minusy<\/h3>\n\n\n\n<p><code>asdf<\/code> jest bardzo dobrym narz\u0119dziem, je\u015bli chcesz pracowa\u0107 w \u015brodowisku poliglotycznym. Obs\u0142uguje wiele narz\u0119dzi, j\u0119zyk\u00f3w i framework\u00f3w. Architektura oparta na wtyczkach sprawia, \u017ce bardzo \u0142atwo jest j\u0105 rozszerzy\u0107. Jednak niekt\u00f3re z narz\u0119dzi, kt\u00f3re ma w bibliotece, wymagaj\u0105 dodatkowej pracy podczas instalacji, aby zapewni\u0107 wszystkie wymagane zale\u017cno\u015bci. <code>asdf<\/code> nie dzia\u0142a w systemie Windows, nawet na <a href=\"https:\/\/en.wikipedia.org\/wiki\/Windows_Subsystem_for_Linux\">WSL<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ostatni, ale nie mniej wa\u017cny - Docker<\/h2>\n\n\n\n<p>Kiedy m\u00f3wi\u0142em o konflikcie port\u00f3w powy\u017cej, wielu z was zna rozwi\u0105zanie.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/\">Docker<\/a> mo\u017ce nam pom\u00f3c w niekt\u00f3rych przypadkach. Wspominam o tym z obowi\u0105zku, poniewa\u017c narz\u0119dzie to jest tak du\u017ce i z\u0142o\u017cone, \u017ce nie spos\u00f3b om\u00f3wi\u0107 go w jednym artykule.<\/p>\n\n\n\n<p>Wraz z Dockerem, powinni\u015bmy u\u017cy\u0107 pliku <a href=\"https:\/\/docs.docker.com\/compose\/\">docker-compose<\/a> narz\u0119dzie, kt\u00f3re daje nam mo\u017cliwo\u015b\u0107 koordynowania \u015brodowisk wielokontenerowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plusy i minusy platformy Docker<\/h3>\n\n\n\n<p>Docker pomaga nam zarz\u0105dza\u0107 narz\u0119dziami, kt\u00f3re wymagaj\u0105 okre\u015blonych zasob\u00f3w, takich jak porty lub pliki. Oddziela instancje w kontenerach i daje nam nad nimi pe\u0142n\u0105 kontrol\u0119. Niemniej jednak, Docker jest narz\u0119dziem, kt\u00f3re wprowadza wiele z\u0142o\u017cono\u015bci do naszego \u015brodowiska pracy i mo\u017ce by\u0107 problematyczne w niekt\u00f3rych przypadkach. Jeden z takich przypadk\u00f3w u\u017cycia Dockera w te\u015bcie zosta\u0142 opisany w jednym z naszych poprzednich artyku\u0142\u00f3w. <a href=\"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\">artyku\u0142<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Wiem, \u017ce nie opisa\u0142em wszystkich narz\u0119dzi, kt\u00f3re mo\u017cna wykorzysta\u0107 do zarz\u0105dzania wersjami narz\u0119dzi. Jest ich znacznie wi\u0119cej, np. <a href=\"https:\/\/www.jenv.be\/\">jEnv<\/a> kt\u00f3ry m\u00f3g\u0142by zast\u0105pi\u0107 SDKMAN,<\/p>\n\n\n\n<p>lub <a href=\"https:\/\/github.com\/nvm-sh\/nvm\">NVM<\/a> kt\u00f3rego mo\u017cemy u\u017cy\u0107 do zarz\u0105dzania npm lub <a href=\"https:\/\/rvm.io\/\">RVM<\/a> dla <a href=\"https:\/\/thecodest.co\/pl\/case-studies\/providing-a-team-of-ruby-developers-for-a-fintech-company\/\">Ruby<\/a>. Skupi\u0142em si\u0119 na narz\u0119dziach, kt\u00f3re \"przetestowa\u0142em na polu bitwy\" i mog\u0119 poleci\u0107 ka\u017cdemu.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/thecodest.co\/contact\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1283\" height=\"460\" src=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png\" alt=\"\" class=\"wp-image-4927\" srcset=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png 1283w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-300x108.png 300w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-1024x367.png 1024w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-768x275.png 768w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-18x6.png 18w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-67x24.png 67w\" sizes=\"auto, (max-width: 1283px) 100vw, 1283px\" \/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Czy istnieje z\u0142oty \u015brodek na obs\u0142ug\u0119 wielu \u015brodowisk na jednej maszynie? Nasz ekspert Java Bart\u0142omiej zna odpowied\u017a!<\/p>","protected":false},"author":2,"featured_media":3349,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3348","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Handle multiple environments for multiple projects on one machine? - The Codest<\/title>\n<meta name=\"description\" content=\"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/pl\/blog\/obsluga-wielu-srodowisk-dla-wielu-projektow-na-jednym-komputerze\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Handle multiple environments for multiple projects on one machine?\" \/>\n<meta property=\"og:description\" content=\"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/pl\/blog\/obsluga-wielu-srodowisk-dla-wielu-projektow-na-jednym-komputerze\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-01T11:08:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-09T13:07:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Handle multiple environments for multiple projects on one machine?\",\"datePublished\":\"2022-12-01T11:08:38+00:00\",\"dateModified\":\"2026-03-09T13:07:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"},\"wordCount\":1315,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\",\"name\":\"Handle multiple environments for multiple projects on one machine? - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"datePublished\":\"2022-12-01T11:08:38+00:00\",\"dateModified\":\"2026-03-09T13:07:45+00:00\",\"description\":\"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Handle multiple environments for multiple projects on one machine?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/pl\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Obs\u0142uga wielu \u015brodowisk dla wielu projekt\u00f3w na jednym komputerze? - The Codest","description":"Dowiedz si\u0119, jak programi\u015bci mog\u0105 obs\u0142ugiwa\u0107 wiele \u015brodowisk dla r\u00f3\u017cnych projekt\u00f3w na jednej maszynie, korzystaj\u0105c z mened\u017cer\u00f3w wersji i konteneryzacji.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/thecodest.co\/pl\/blog\/obsluga-wielu-srodowisk-dla-wielu-projektow-na-jednym-komputerze\/","og_locale":"pl_PL","og_type":"article","og_title":"Handle multiple environments for multiple projects on one machine?","og_description":"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.","og_url":"https:\/\/thecodest.co\/pl\/blog\/obsluga-wielu-srodowisk-dla-wielu-projektow-na-jednym-komputerze\/","og_site_name":"The Codest","article_published_time":"2022-12-01T11:08:38+00:00","article_modified_time":"2026-03-09T13:07:45+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"7 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Handle multiple environments for multiple projects on one machine?","datePublished":"2022-12-01T11:08:38+00:00","dateModified":"2026-03-09T13:07:45+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"},"wordCount":1315,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","articleSection":["Software Development"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","url":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","name":"Obs\u0142uga wielu \u015brodowisk dla wielu projekt\u00f3w na jednym komputerze? - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","datePublished":"2022-12-01T11:08:38+00:00","dateModified":"2026-03-09T13:07:45+00:00","description":"Dowiedz si\u0119, jak programi\u015bci mog\u0105 obs\u0142ugiwa\u0107 wiele \u015brodowisk dla r\u00f3\u017cnych projekt\u00f3w na jednej maszynie, korzystaj\u0105c z mened\u017cer\u00f3w wersji i konteneryzacji.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Handle multiple environments for multiple projects on one machine?"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"The Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/pl\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/comments?post=3348"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3348\/revisions"}],"predecessor-version":[{"id":8550,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3348\/revisions\/8550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media\/3349"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media?parent=3348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/categories?post=3348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/tags?post=3348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}