{"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":"kasitella-useita-ymparistoja-useita-projekteja-varten-yhdella-koneella","status":"publish","type":"post","link":"https:\/\/thecodest.co\/fi\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","title":{"rendered":"K\u00e4sitteletk\u00f6 useita ymp\u00e4rist\u00f6j\u00e4 useita projekteja varten yhdell\u00e4 koneella?"},"content":{"rendered":"<p>Tarkastellaanpa tyypillist\u00e4 ty\u00f6ymp\u00e4rist\u00f6\u00e4 seuraavassa yrityksess\u00e4 <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/how-to-choose-software-house\/\">ohjelmistotalo<\/a>. Sinulla on muutama asiakas, joilla on erilaiset ymp\u00e4rist\u00f6t. Jotkut suosivat MySQL:\u00e4\u00e4, toiset Postgresi\u00e4. Yksi sovelluksesi versio tarvitsee <a href=\"https:\/\/thecodest.co\/fi\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a> 11 ja toinen Java 17. Frontend tarvitsee npm 12:n tai 16:n, koska k\u00e4yt\u00e4t eri versioita ohjelmistosta <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/what-is-node-js-used-for-in-angular\/\">kulmikas<\/a>. Lopuksi sinulla on kolmiulotteinen array, joka sis\u00e4lt\u00e4\u00e4 kaikkien tietokantojesi, backend- ja frontend-versioiden yhdistelm\u00e4t. Kuulostaa pahalta, mutta er\u00e4\u00e4n\u00e4 p\u00e4iv\u00e4n\u00e4 pomosi sanoo...<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/comic.png\" alt=\"sarjakuvia&lt;em&gt;pomon kanssa&lt;\/em&gt;kanssa\" title=\"kun pomosi sanoo...\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Moniavaruusymp\u00e4rist\u00f6n juuret<\/h2>\n\n\n\n<p>Edell\u00e4 kuvattu tilanne ei ole mitenk\u00e4\u00e4n harvinainen. Siirtyminen kieli- tai kehysversioiden v\u00e4lill\u00e4, tietokantojen p\u00e4ivitykset tai yksinkertaisesti asiakkailta tulevat erilaiset vaatimukset voivat k\u00e4\u00e4nt\u00e4\u00e4 kaikki kokoonpanot yl\u00f6salaisin. Meill\u00e4 pit\u00e4isi olla ratkaisu, joka auttaa <a href=\"https:\/\/thecodest.co\/fi\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> hallita n\u00e4it\u00e4 muutoksia, joka vastaa muutamia oletuksia ja\/tai vaatimuksia ja\/tai tavoitteita:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b> helppok\u00e4ytt\u00f6inen<\/b> - yksi komento kokoonpanon tai version muuttamiseksi,<\/li>\n\n\n\n<li><b>rikas kirjasto<\/b> - pit\u00e4isi tukea useita teknologioita ja \"asioita\" (kirjastoja, kehyksi\u00e4, sovelluksia),<\/li>\n\n\n\n<li><b> laajennettavissa<\/b> - sinun pit\u00e4isi tarjota mahdollisuus lis\u00e4t\u00e4 liit\u00e4nn\u00e4isi\u00e4si.<\/li>\n<\/ul>\n\n\n\n<p>T\u00e4ss\u00e4 artikkelissa keskityn kolmeen alueeseen. Ensimm\u00e4inen on Javan ja JVM:n ty\u00f6kalut. Toinen on yleisk\u00e4ytt\u00f6iset ty\u00f6kalut. Kolmas on se, miten k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/docker-developer\/\">telakka<\/a> tavoitteidemme saavuttamiseksi.<\/p>\n\n\n\n<p>\u200b<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Olen Java ja ty\u00f6skentelen JVM:n parissa.<\/h2>\n\n\n\n<p>Kun olet <strong><a href=\"https:\/\/thecodest.co\/fi\/dictionary\/java-developer\/\">Java-kehitt\u00e4j\u00e4<\/a><\/strong> tai, yleisemmin, ty\u00f6skentelet <strong>JVM-tekniikat<\/strong>, niin voit k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/sdkman.io\/\">SDKMAN!<\/a>. T\u00e4m\u00e4 on eritt\u00e4in mukava ja helppok\u00e4ytt\u00f6inen ty\u00f6kalu, joka tukee monia kirjastoja, kehyksi\u00e4 ja kieli\u00e4.<\/p>\n\n\n\n<p>Asennusprosessi <strong>SDKMAN!<\/strong> Se on melko yksinkertaista. Sinun t\u00e4ytyy ajaa:<\/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>ja sitten<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code><code>l\u00e4hde \"$HOME\/.sdkman\/bin\/sdkman-init.sh\"<\/code><\/code><\/code><\/pre>\n\n\n\n<p>Nyt voit hallita <strong>Java<\/strong>, <strong>Scala<\/strong> ja <strong>Maven<\/strong> versiot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Versioiden hallinta - esimerkki<\/h3>\n\n\n\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 asennamme ja p\u00e4ivit\u00e4mme muutaman ty\u00f6kalun version. T\u00e4m\u00e4 on vain pieni osa k\u00e4ytett\u00e4viss\u00e4 olevista ty\u00f6kaluista.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Asennus<\/h3>\n\n\n\n<p>Oletetaan, ett\u00e4 uusi <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/why-do-projects-fail\/\">projekti<\/a> k\u00e4ytt\u00e4\u00e4 <strong>Java 17<\/strong>. Sinulla ei ole mit\u00e4\u00e4n <strong>Java<\/strong> asennettu versio. Haluat asentaa sen ja lis\u00e4ksi lis\u00e4t\u00e4 Maven Daemon -ty\u00f6kalun, jotta rakentaminen nopeutuisi. Sinun on siis asennettava my\u00f6s Maven. Sit\u00e4 varten sinun on suoritettava kolme yksinkertaista komentoa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk install java 17-open\n\n$ sdk asenna maven 3.8.4\n\n$ sdk asentaa mvnd 0.7.1.<\/code><\/pre>\n\n\n\n<p>Kunkin ty\u00f6kalun asennuksen lopussa sinulta kysyt\u00e4\u00e4n, haluatko tehd\u00e4 siit\u00e4 oletusarvon:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>Tahdotko, ett\u00e4 Java 17-open asetetaan oletusarvoksi? (Y\/n):<\/code><\/code><\/pre>\n\n\n\n<p>T\u00e4m\u00e4 on t\u00e4rke\u00e4\u00e4, kun asennat uuden version kirjastosta tai kielest\u00e4, koska SDKMAN! asettaa t\u00e4m\u00e4n oletusversion globaaliksi kaikille nykyisen k\u00e4ytt\u00e4j\u00e4n p\u00e4\u00e4telaitteille.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Versioiden tarkistaminen ja p\u00e4ivitt\u00e4minen<\/h3>\n\n\n\n<p>SDKMAN! joutuu aika ajoin p\u00e4ivitt\u00e4m\u00e4\u00e4n indeksit. T\u00e4ll\u00f6in saatat saada viestin, ett\u00e4 k\u00e4ytt\u00e4miesi ty\u00f6kalujen versiot ovat muuttuneet. Voimme tarkistaa, mitk\u00e4 versiot ovat saatavilla kirjoittamalla seuraavalla tavalla <code>sdk ls<\/code>. Osoitteessa <code>sdk ls maven<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Saatavilla olevat Maven-versiot\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\npaikallinen versio\n\nt\u00e4ll\u00e4 hetkell\u00e4 k\u00e4yt\u00f6ss\u00e4\n\n================================================================================<\/code><\/pre>\n\n\n\n<p>Kuten yll\u00e4 n\u00e4kyy, Mavenilla on uudempi versio kuin k\u00e4ytt\u00e4m\u00e4mme versio. Sama koskee my\u00f6s <code>mvnd<\/code> (0.8.2) ja Java (19-open). P\u00e4ivitet\u00e4\u00e4n kaikki. Sit\u00e4 varten meid\u00e4n tarvitsee vain kutsua install-komentoa, mutta t\u00e4ll\u00e4 kertaa emme k\u00e4yt\u00e4 version m\u00e4\u00e4rittely\u00e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk asentaa mavenin\n\n$ sdk install mvnd\n\n$ sdk asenna java<\/code><\/pre>\n\n\n\n<p>Mutta jotain v\u00e4\u00e4r\u00e4\u00e4 tapahtui. <code>Maven<\/code> ja <code>mvnd<\/code> on oikeat versiot, mutta <strong>Java<\/strong> on versio <code>17.0.5-tem<\/code>. T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 ty\u00f6kalun \"uusinta\" versiota valvoo sen myyj\u00e4, ei paikallinen SDKMAN.Kuka t\u00e4m\u00e4 myyj\u00e4 on? SDKMAN!:ssa myyj\u00e4 on joku, joka voi julkaista version. Sanotaan kuitenkin, ett\u00e4 asennamme lopulta version. <code>19-avoin<\/code>, ja teimme siit\u00e4 oletusarvon, mutta jostain syyst\u00e4 meid\u00e4n on k\u00e4ytett\u00e4v\u00e4 <code>17-avoin<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paikalliset versiot ja terminaalikohtainen versionhallinta<\/h3>\n\n\n\n<p>\u200b<br>Voimme m\u00e4\u00e4ritt\u00e4\u00e4 <code>oletus<\/code> versio ty\u00f6kalusta, joka on maailmanlaajuinen kaikille projekteille ja p\u00e4\u00e4telaitteille. Mutta kun tarvitsemme tietyn version, meill\u00e4 on kaksi tapaa tehd\u00e4 se. Ensimm\u00e4inen on k\u00e4ytt\u00e4\u00e4 <code>sdk k\u00e4ytt\u00e4\u00e4<\/code> komennon joka kerta, kun haluamme k\u00e4ytt\u00e4\u00e4 ty\u00f6kalun tietty\u00e4 versiota nykyisess\u00e4 p\u00e4\u00e4telaitteessa. Toinen on laatia versioluettelo <code>.sdkmanrc<\/code> tiedosto, joka on tallennettu projektin mukana.<\/p>\n\n\n\n<p>Ensimm\u00e4inen vaihtoehto on tarkoitettu yksitt\u00e4isk\u00e4ytt\u00f6\u00f6n, mutta toinen on suunniteltu tiimity\u00f6skentelyyn ja kokoonpanojen jakamiseen seuraavien kesken. <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/how-to-lead-software-development-team\/\">joukkue<\/a> j\u00e4senet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SDKMANin hyv\u00e4t ja huonot puolet!<\/h3>\n\n\n\n<p>SDKMAN! on eritt\u00e4in helppok\u00e4ytt\u00f6inen, ja siin\u00e4 on laaja kirjasto tuettuja ty\u00f6kaluja, kehyksi\u00e4 ja kieli\u00e4. Se toimii Linuxissa, MacOS:ss\u00e4 ja Windowsissa. Toisaalta t\u00e4m\u00e4 ty\u00f6kalu on JVM-keskeinen ja vaatii tekij\u00e4n hyv\u00e4ksynn\u00e4n myyj\u00e4ksi. Lis\u00e4ksi mekaniikan <code>.sdkmanrc<\/code> on eritt\u00e4in huono ja voi hidastaa hakemistojen vaihtamista merkitt\u00e4v\u00e4sti.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Haluaisin k\u00e4ytt\u00e4\u00e4 monia muita kieli\u00e4<\/h2>\n\n\n\n<p>Jos sinun on k\u00e4ytett\u00e4v\u00e4 useita kieli\u00e4 ja ty\u00f6kaluja, sinun kannattaa tutustua seuraaviin tuotteisiin <a href=\"https:\/\/asdf-vm.com\/\">asdf<\/a>. T\u00e4m\u00e4 ty\u00f6kalu keskittyy \"korkean tason\" ty\u00f6kaluihin. SDKMAN! -ohjelmasta l\u00f6yd\u00e4t monia Java-kohtaisia ty\u00f6kaluja, kuten Bpipe tai Znai, mutta asdf tarjoaa paljon enemm\u00e4n ty\u00f6kaluja, jotka eiv\u00e4t ole niin erityisi\u00e4. Tietenkin jotkut n\u00e4ist\u00e4 ty\u00f6kaluista ovat p\u00e4\u00e4llekk\u00e4isi\u00e4, esimerkiksi Java, Tomcat tai mvnd ovat saatavilla molemmissa.<\/p>\n\n\n\n<p>Kun haluat k\u00e4ytt\u00e4\u00e4 <code>asdf<\/code>, sinulla on oltava <code>git<\/code> ja <code>curl<\/code> asennettu. Sen j\u00e4lkeen voit vain:<\/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>ja lis\u00e4\u00e4 n\u00e4m\u00e4 rivit <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>Nyt voit asentaa liit\u00e4nn\u00e4isi\u00e4 ja ty\u00f6kaluja suosikkiversioissasi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plugin-pohjainen hallinta<\/h3>\n\n\n\n<p>Toisin kuin SDKMAN!, <code>asdf<\/code> k\u00e4ytt\u00e4\u00e4 liit\u00e4nn\u00e4isi\u00e4 ty\u00f6kalujen hallintaan. Ennen kuin voit asentaa ty\u00f6kalun, sinun on siis asennettava lis\u00e4osa. Palataanpa takaisin esimerkkiprojektiimme ja yritet\u00e4\u00e4n konfiguroida ymp\u00e4rist\u00f6 k\u00e4ytt\u00e4en seuraavia ohjeita <code>asadfsdf<\/code>.<\/p>\n\n\n\n<p>Ensin meid\u00e4n on asennettava lis\u00e4osat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">asdf-lis\u00e4osan lis\u00e4\u00e4minen java\n\nasdf-lis\u00e4osa lis\u00e4\u00e4 maven\n\nasdf plugin add mvnd<\/code><\/pre>\n\n\n\n<p>Sitten voimme asentaa ty\u00f6kalut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">asdf install java openjdk-17\n\nasdf asentaa maven 3.8.4:n\n\nasdf install mvnd 0.7.1<\/code><\/pre>\n\n\n\n<p>Ja j\u00e4lleen kerran, toisin kuin SDKMAN!, <code>asdf<\/code> ei muuta mit\u00e4\u00e4n ymp\u00e4rist\u00f6ss\u00e4mme. Kun yrit\u00e4mme k\u00e4ytt\u00e4\u00e4 javaa, saamme seuraavan virheilmoituksen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Komennolle Java ei ole asetettu versiota\n\nHarkitse jonkin seuraavan version lis\u00e4\u00e4mist\u00e4 konfigurointitiedostoon osoitteessa ~\/.tool-versions\n\njava openjdk-17<\/code><\/pre>\n\n\n\n<p>Meid\u00e4n on luotava tiedosto <code>.tool-versiot<\/code> kotihakemistossa oletusversioiden hallintaa varten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paikalliset ja maailmanlaajuiset versiot<\/h3>\n\n\n\n<p>Ohjelmistoversioiden p\u00e4ivitt\u00e4minen <code>asdf<\/code> on melko yksinkertainen. Asennamme vain uuden version. Koska t\u00e4m\u00e4 prosessi ei vaikuta ymp\u00e4rist\u00f6\u00f6n, voimme tehd\u00e4 sen milloin tahansa ja mihin tahansa kohtaan tiedostoj\u00e4rjestelm\u00e4ss\u00e4. Kun haluamme k\u00e4ytt\u00e4\u00e4 jonkin ohjelmiston tietty\u00e4 versiota, meid\u00e4n on luotava projektin hakemistoon tiedosto nimelt\u00e4 <code>.tool-versiot<\/code> tiedosto, jonka tiimin j\u00e4senet voivat jakaa kesken\u00e4\u00e4n. Muista, ett\u00e4 sinun on taattava, ett\u00e4 kaikilla tiimin j\u00e4senill\u00e4 on seuraavat tiedot <code>asdf<\/code> ja lis\u00e4osat asennettuna. Luettelo lis\u00e4osista l\u00f6ytyy <a href=\"https:\/\/github.com\/asdf-vm\/asdf-plugins\">t\u00e4\u00e4ll\u00e4<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Versiokonfliktit<\/h3>\n\n\n\n<p><code>asdf<\/code> tukee paitsi ohjelmointikieli\u00e4, kehyksi\u00e4 ja ty\u00f6kaluja, kuten vimi\u00e4 tai kubernetessi\u00e4. Se tukee my\u00f6s tietokantoja. T\u00e4ll\u00f6in voisimme asentaa useita versioita esimerkiksi Postgresista, mutta vain yksi instanssi voisi toimia. T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 <code>asdf<\/code> suorittaa komentoja suoraan k\u00e4ytt\u00f6j\u00e4rjestelm\u00e4ss\u00e4si ilman mit\u00e4\u00e4n erottavaa kerrosta. T\u00e4m\u00e4 johtaa ongelmiin, kuten \"portti on jo k\u00e4yt\u00f6ss\u00e4\" ja resurssikonflikteihin.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hy\u00f6dyt ja haitat<\/h3>\n\n\n\n<p><code>asdf<\/code> on eritt\u00e4in hyv\u00e4 ty\u00f6kalu, jos haluat ty\u00f6skennell\u00e4 monikielisess\u00e4 ymp\u00e4rist\u00f6ss\u00e4. Se tukee monia ty\u00f6kaluja, kieli\u00e4 ja kehyksi\u00e4. Plugin-pohjainen arkkitehtuuri tekee sen laajentamisesta eritt\u00e4in helppoa. Jotkin sen kirjastossa olevista ty\u00f6kaluista vaativat kuitenkin lis\u00e4ty\u00f6t\u00e4 asennuksen aikana, jotta kaikki tarvittavat riippuvuudet saadaan k\u00e4ytt\u00f6\u00f6n. <code>asdf<\/code> ei toimi Windowsissa, edes <a href=\"https:\/\/en.wikipedia.org\/wiki\/Windows_Subsystem_for_Linux\">WSL<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Viimeisen\u00e4 mutta ei v\u00e4h\u00e4isimp\u00e4n\u00e4 - Docker<\/h2>\n\n\n\n<p>Kun puhuin edell\u00e4 satamakonfliktista, monet teist\u00e4 tiet\u00e4v\u00e4t ratkaisun.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/\">Docker<\/a> voisi auttaa meit\u00e4 joissakin tapauksissa. Mainitsen sen velvollisuudestani, koska t\u00e4m\u00e4 ty\u00f6kalu on niin suuri ja monimutkainen, ettemme voi k\u00e4sitell\u00e4 sit\u00e4 yhdess\u00e4 artikkelissa.<\/p>\n\n\n\n<p>Yhdess\u00e4 Dockerin kanssa meid\u00e4n pit\u00e4isi k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/docs.docker.com\/compose\/\">docker-compose<\/a> ty\u00f6kalu, joka antaa meille mahdollisuuden koordinoida monen kontin ymp\u00e4rist\u00f6j\u00e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dockerin hyv\u00e4t ja huonot puolet<\/h3>\n\n\n\n<p>Docker auttaa meit\u00e4 hallitsemaan ty\u00f6kaluja, jotka tarvitsevat tiettyj\u00e4 resursseja, kuten portteja tai tiedostoja. Se erottelee instanssit kontteihin ja antaa meille t\u00e4yden hallinnan niihin. Docker on kuitenkin ty\u00f6kalu, joka tuo paljon monimutkaisuutta ty\u00f6ymp\u00e4rist\u00f6\u00f6mme ja voi joissakin tapauksissa olla ongelmallinen. Yksi n\u00e4ist\u00e4 tapauksista, joissa Dockeria k\u00e4ytet\u00e4\u00e4n testeiss\u00e4, on kuvattu yhdess\u00e4 aiemmista tapauksistamme <a href=\"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\">artikkeli<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Yhteenveto<\/h2>\n\n\n\n<p>Tied\u00e4n, etten kuvannut kaikkia ty\u00f6kaluja, joita voidaan k\u00e4ytt\u00e4\u00e4 ty\u00f6kaluversioiden hallintaan. Niit\u00e4 on paljon muitakin, kuten <a href=\"https:\/\/www.jenv.be\/\">jEnv<\/a> joka voisi korvata SDKMANin,<\/p>\n\n\n\n<p>tai <a href=\"https:\/\/github.com\/nvm-sh\/nvm\">NVM<\/a> jota voimme k\u00e4ytt\u00e4\u00e4 npm:n tai <a href=\"https:\/\/rvm.io\/\">RVM<\/a> osoitteessa <a href=\"https:\/\/thecodest.co\/fi\/case-studies\/providing-a-team-of-ruby-developers-for-a-fintech-company\/\">Ruby<\/a>. Keskityin ty\u00f6kaluihin, joita olen \"testannut taistelukent\u00e4ll\u00e4\" ja joita voin suositella kenelle tahansa.<\/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>Onko olemassa kultainen keskitie, jolla voidaan k\u00e4sitell\u00e4 monia ymp\u00e4rist\u00f6j\u00e4 suuren m\u00e4\u00e4r\u00e4n osalta yhdell\u00e4 koneella? Java-asiantuntijamme Bart\u0142omiej tiet\u00e4\u00e4 vastauksen!<\/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\/fi\/blogi\/kasitella-useita-ymparistoja-useita-projekteja-varten-yhdella-koneella\/\" \/>\n<meta property=\"og:locale\" content=\"fi_FI\" \/>\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\/fi\/blogi\/kasitella-useita-ymparistoja-useita-projekteja-varten-yhdella-koneella\/\" \/>\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 minutes\" \/>\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\":\"fi\",\"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\":\"fi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fi\",\"@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\":\"fi\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fi\",\"@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\":\"fi\",\"@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\\\/fi\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"K\u00e4sitteletk\u00f6 useita ymp\u00e4rist\u00f6j\u00e4 useita projekteja varten yhdell\u00e4 koneella? - The Codest","description":"Tutustu siihen, miten kehitt\u00e4j\u00e4t voivat k\u00e4sitell\u00e4 useita ymp\u00e4rist\u00f6j\u00e4 eri projekteille yhdell\u00e4 koneella versionhallinnan ja konttipakkausten avulla.","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\/fi\/blogi\/kasitella-useita-ymparistoja-useita-projekteja-varten-yhdella-koneella\/","og_locale":"fi_FI","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\/fi\/blogi\/kasitella-useita-ymparistoja-useita-projekteja-varten-yhdella-koneella\/","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 minutes"},"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":"fi","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":"K\u00e4sitteletk\u00f6 useita ymp\u00e4rist\u00f6j\u00e4 useita projekteja varten yhdell\u00e4 koneella? - 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":"Tutustu siihen, miten kehitt\u00e4j\u00e4t voivat k\u00e4sitell\u00e4 useita ymp\u00e4rist\u00f6j\u00e4 eri projekteille yhdell\u00e4 koneella versionhallinnan ja konttipakkausten avulla.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#breadcrumb"},"inLanguage":"fi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"]}]},{"@type":"ImageObject","inLanguage":"fi","@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":"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":"fi"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"fi","@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":"fi","@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\/fi\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts\/3348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/comments?post=3348"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts\/3348\/revisions"}],"predecessor-version":[{"id":8550,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts\/3348\/revisions\/8550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/media\/3349"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/media?parent=3348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/categories?post=3348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/tags?post=3348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}