{"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":"gerir-varios-ambientes-para-varios-projectos-numa-unica-maquina","status":"publish","type":"post","link":"https:\/\/thecodest.co\/pt\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","title":{"rendered":"Lidar com v\u00e1rios ambientes para v\u00e1rios projectos num \u00fanico computador?"},"content":{"rendered":"<p>Vejamos um exemplo de um ambiente de trabalho t\u00edpico numa <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/how-to-choose-software-house\/\">software house<\/a>. Tem alguns clientes que t\u00eam ambientes diferentes. Alguns preferem MySQL, outros preferem Postgres. Uma vers\u00e3o da sua aplica\u00e7\u00e3o precisa de <a href=\"https:\/\/thecodest.co\/pt\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a> 11, e outro Java 17. O frontend precisa do npm 12 ou 16 porque voc\u00ea usa vers\u00f5es diferentes do <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/what-is-node-js-used-for-in-angular\/\">angular<\/a>. Finalmente, tem aquele conjunto tridimensional que cont\u00e9m combina\u00e7\u00f5es de todas as suas vers\u00f5es de BD, backend e frontend. Parece mau, mas um dia o seu chefe diz...<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/comic.png\" alt=\"banda desenhada&lt;em&gt;com&lt;\/em&gt;o chefe\" title=\"quando o teu chefe diz...\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Ra\u00edzes de um ambiente multiverso<\/h2>\n\n\n\n<p>A situa\u00e7\u00e3o descrita acima n\u00e3o \u00e9 invulgar. A migra\u00e7\u00e3o entre vers\u00f5es de l\u00ednguas ou de estruturas, as actualiza\u00e7\u00f5es de bases de dados ou simplesmente requisitos diferentes provenientes dos clientes podem virar do avesso todas as configura\u00e7\u00f5es. Devemos ter uma solu\u00e7\u00e3o que ajude <a href=\"https:\/\/thecodest.co\/pt\/blog\/why-us-companies-are-opting-for-polish-developers\/\">n\u00f3s<\/a> gerir essas mudan\u00e7as, uma que corresponda a alguns pressupostos e\/ou requisitos e\/ou objectivos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b> f\u00e1cil de utilizar<\/b> - comando \u00fanico para alterar uma configura\u00e7\u00e3o ou uma vers\u00e3o,<\/li>\n\n\n\n<li><b>biblioteca rica<\/b> - deve suportar v\u00e1rias tecnologias e \"coisas\" (bibliotecas, estruturas, aplica\u00e7\u00f5es),<\/li>\n\n\n\n<li><b> extens\u00edvel<\/b> - deve oferecer a possibilidade de adicionar os seus plugins.<\/li>\n<\/ul>\n\n\n\n<p>Neste artigo, centrar-me-ei em tr\u00eas \u00e1reas. A primeira s\u00e3o as ferramentas para Java e JVM. A segunda s\u00e3o as ferramentas de uso geral. A terceira \u00e9 como usar <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/docker-developer\/\">doca<\/a> para atingir os nossos objectivos.<\/p>\n\n\n\n<p>\u200b<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sou Java e trabalho na JVM<\/h2>\n\n\n\n<p>Quando se \u00e9 um <strong><a href=\"https:\/\/thecodest.co\/pt\/dictionary\/java-developer\/\">Programador Java<\/a><\/strong> ou, mais geralmente, trabalha com <strong>Tecnologias JVM<\/strong>, ent\u00e3o pode utilizar <a href=\"https:\/\/sdkman.io\/\">SDKMAN!<\/a>. Esta \u00e9 uma ferramenta muito boa e f\u00e1cil de utilizar que suporta muitas bibliotecas, estruturas e linguagens.<\/p>\n\n\n\n<p>O processo de instala\u00e7\u00e3o do <strong>SDKMAN!<\/strong> \u00c9 bastante simples. Tens de correr:<\/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>e depois<\/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>Agora pode gerir os seus <strong>Java<\/strong>, <strong>Scala<\/strong> e <strong>Maven<\/strong> vers\u00f5es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gerir vers\u00f5es - exemplo<\/h3>\n\n\n\n<p>Neste exemplo, vamos instalar e atualizar a vers\u00e3o de algumas ferramentas. Este \u00e9 apenas um pequeno subconjunto de ferramentas dispon\u00edveis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Instala\u00e7\u00e3o<\/h3>\n\n\n\n<p>Vamos supor que o seu novo <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/why-do-projects-fail\/\">projeto<\/a> utiliza\u00e7\u00f5es <strong>Java 17<\/strong>. N\u00e3o tem nenhum <strong>Java<\/strong> instalada. Pretende instal\u00e1-la e, al\u00e9m disso, adicionar uma ferramenta Maven Daemon para tornar as compila\u00e7\u00f5es mais r\u00e1pidas. Portanto, tamb\u00e9m \u00e9 necess\u00e1rio instalar o Maven. Para fazer isso, \u00e9 necess\u00e1rio executar tr\u00eas comandos simples:<\/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 instalar mvnd 0.7.1<\/code><\/pre>\n\n\n\n<p>No final da instala\u00e7\u00e3o de cada ferramenta, ser-lhe-\u00e1 perguntado se a quer tornar predefinida:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>Deseja que Java 17-open seja definido como padr\u00e3o? (Y\/n):<\/code><\/code><\/pre>\n\n\n\n<p>Isto \u00e9 importante quando instala uma nova vers\u00e3o de uma biblioteca ou de uma linguagem, porque o SDKMAN! ir\u00e1 definir essa vers\u00e3o predefinida como global para todos os terminais do utilizador atual.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verifica\u00e7\u00e3o de vers\u00f5es e atualiza\u00e7\u00e3o<\/h3>\n\n\n\n<p>De tempos a tempos, o SDKMAN! tem de atualizar os \u00edndices. Durante este processo, poder\u00e1 receber uma mensagem a indicar que existem novas vers\u00f5es das ferramentas que utiliza. Podemos verificar quais vers\u00f5es est\u00e3o dispon\u00edveis digitando <code>sdk ls<\/code>. Para <code>sdk ls maven<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Vers\u00f5es dispon\u00edveis do 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\nvers\u00e3o local\n\natualmente em uso\n\n================================================================================<\/code><\/pre>\n\n\n\n<p>Como podemos ver acima, o Maven tem uma vers\u00e3o mais recente do que a que utilizamos. O mesmo acontece com o <code>mvnd<\/code> (0.8.2) e Java (19-open). Vamos atualizar tudo. Para o fazer, s\u00f3 precisamos de chamar o comando install mas, desta vez, n\u00e3o utilizamos um especificador de vers\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk install maven\n\n$ sdk instalar mvnd\n\n$ sdk instalar java<\/code><\/pre>\n\n\n\n<p>Mas algo de errado aconteceu. <code>Maven<\/code> e <code>mvnd<\/code> t\u00eam vers\u00f5es corretas, mas <strong>Java<\/strong> tem vers\u00e3o <code>17.0.5-tem<\/code>. Isso deve-se ao facto de a vers\u00e3o \"mais recente\" da ferramenta ser controlada pelo seu fornecedor e n\u00e3o pelo SDKMAN! quem \u00e9 esse fornecedor? Um fornecedor no SDKMAN! \u00e9 algu\u00e9m que pode publicar uma vers\u00e3o. No entanto, digamos que finalmente instalamos <code>19-aberto<\/code>e torn\u00e1mo-la predefinida, mas por alguma raz\u00e3o, precisamos de utilizar <code>17-aberto<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vers\u00f5es locais e gest\u00e3o de vers\u00f5es por terminal<\/h3>\n\n\n\n<p>\u200b<br>Podemos configurar um <code>padr\u00e3o<\/code> vers\u00e3o de uma ferramenta que \u00e9 global para todos os projectos e terminais. Mas quando precisamos de uma vers\u00e3o espec\u00edfica, temos duas formas de o fazer. A primeira \u00e9 utilizar o <code>sdk use<\/code> sempre que quisermos usar uma vers\u00e3o espec\u00edfica de uma ferramenta no terminal atual. A segunda \u00e9 preparar uma lista de vers\u00f5es em um <code>.sdkmanrc<\/code> que \u00e9 armazenado com o projeto.<\/p>\n\n\n\n<p>Enquanto a primeira op\u00e7\u00e3o se destina a uma \u00fanica utiliza\u00e7\u00e3o, a segunda foi concebida para trabalhar com equipas e partilhar configura\u00e7\u00f5es entre <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/how-to-lead-software-development-team\/\">equipa<\/a> membros.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00f3s e contras do SDKMAN!<\/h3>\n\n\n\n<p>O SDKMAN! \u00e9 muito f\u00e1cil de utilizar e possui uma biblioteca rica de ferramentas, estruturas e linguagens suportadas. Funciona em Linux, MacOS e Windows. Por outro lado, esta ferramenta est\u00e1 centrada na JVM e requer a aceita\u00e7\u00e3o do autor para ser um fornecedor. Al\u00e9m disso, a mec\u00e2nica do <code>.sdkmanrc<\/code> \u00e9 muito fraco e pode atrasar significativamente o processo de mudan\u00e7a de diret\u00f3rios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gostaria de utilizar muitas outras l\u00ednguas<\/h2>\n\n\n\n<p>Se precisar de utilizar muitas l\u00ednguas e ferramentas, deve consultar <a href=\"https:\/\/asdf-vm.com\/\">asdf<\/a>. Esta ferramenta est\u00e1 focada em ferramentas de \"alto n\u00edvel\". Enquanto no SDKMAN! pode encontrar muitas ferramentas espec\u00edficas de Java, como o Bpipe ou o Znai, o asdf oferece muito mais ferramentas, mas n\u00e3o t\u00e3o espec\u00edficas. Claro que algumas dessas ferramentas se sobrep\u00f5em, por exemplo, Java, Tomcat ou mvnd est\u00e3o dispon\u00edveis em ambas.<\/p>\n\n\n\n<p>Quando se pretende utilizar <code>asdf<\/code>, \u00e9 necess\u00e1rio ter <code>git<\/code> e <code>enrolar<\/code> instalado. Depois disso, \u00e9 s\u00f3:<\/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>e adicionar estas linhas em <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>Agora pode instalar plugins e ferramentas nas suas vers\u00f5es favoritas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gest\u00e3o baseada em plugins<\/h3>\n\n\n\n<p>Ao contr\u00e1rio do SDKMAN! <code>asdf<\/code> utiliza plugins para gerir ferramentas. Portanto, antes de instalar uma ferramenta, \u00e9 necess\u00e1rio instalar um plug-in. Vamos voltar ao nosso projeto de exemplo e tentar configurar o ambiente usando <code>asadfsdf<\/code>.<\/p>\n\n\n\n<p>Primeiro, precisamos de instalar os plug-ins:<\/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>Depois podemos instalar as nossas ferramentas:<\/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>E, mais uma vez, ao contr\u00e1rio do SDKMAN! <code>asdf<\/code> n\u00e3o altera nada no nosso ambiente. Quando tentamos utilizar o java, recebemos uma mensagem de erro como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">N\u00e3o est\u00e1 definida nenhuma vers\u00e3o para o comando Java\n\nConsidere adicionar uma das seguintes vers\u00f5es no seu ficheiro de configura\u00e7\u00e3o em ~\/.tool-versions\n\njava openjdk-17<\/code><\/pre>\n\n\n\n<p>Precisamos de criar o ficheiro <code>.vers\u00f5es de ferramentas<\/code> no diret\u00f3rio inicial para gerir as vers\u00f5es predefinidas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vers\u00f5es locais e globais<\/h3>\n\n\n\n<p>Atualiza\u00e7\u00e3o de vers\u00f5es de software com <code>asdf<\/code> \u00e9 bastante simples. Basta instalar uma nova vers\u00e3o. Como este processo n\u00e3o afecta o ambiente, podemos faz\u00ea-lo em qualquer altura e em qualquer local do sistema de ficheiros. Quando queremos usar uma vers\u00e3o espec\u00edfica de algum software, precisamos criar no diret\u00f3rio do projeto um <code>.vers\u00f5es de ferramentas<\/code> que pode ser partilhado entre os membros da equipa. N\u00e3o se esque\u00e7a de que tem de garantir que todos os membros da equipa t\u00eam <code>asdf<\/code> e os plugins instalados. A lista de plugins pode ser encontrada <a href=\"https:\/\/github.com\/asdf-vm\/asdf-plugins\">aqui<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conflitos de vers\u00f5es<\/h3>\n\n\n\n<p><code>asdf<\/code> n\u00e3o suporta apenas linguagens de programa\u00e7\u00e3o, frameworks e ferramentas como vim ou kubernetess. Ele tamb\u00e9m suporta bancos de dados. Nesse caso, poder\u00edamos instalar v\u00e1rias vers\u00f5es de, por exemplo, Postgres, mas apenas uma inst\u00e2ncia poderia ser executada. Isso deve-se ao facto de <code>asdf<\/code> executa comandos diretamente no seu sistema operativo sem qualquer camada de separa\u00e7\u00e3o. Isso leva a problemas como \"porta j\u00e1 em uso\" e conflitos de recursos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00f3s e contras<\/h3>\n\n\n\n<p><code>asdf<\/code> \u00e9 uma ferramenta muito boa se quiser trabalhar num ambiente poliglota. Suporta muitas ferramentas, linguagens e estruturas. A arquitetura baseada em plug-ins facilita muito a sua extens\u00e3o. No entanto, algumas das ferramentas que tem na biblioteca precisam de trabalho adicional durante a instala\u00e7\u00e3o para fornecer todas as depend\u00eancias necess\u00e1rias. <code>asdf<\/code> n\u00e3o funciona no Windows, mesmo em <a href=\"https:\/\/en.wikipedia.org\/wiki\/Windows_Subsystem_for_Linux\">WSL<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por \u00faltimo, mas n\u00e3o menos importante - Docker<\/h2>\n\n\n\n<p>Quando falo do conflito portu\u00e1rio acima, muitos de v\u00f3s conhecem a solu\u00e7\u00e3o.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/\">Docker<\/a> pode ajudar-nos em alguns casos. Menciono-o por dever de of\u00edcio, porque esta ferramenta \u00e9 t\u00e3o grande e complexa que n\u00e3o podemos discuti-la num s\u00f3 artigo.<\/p>\n\n\n\n<p>Juntamente com o Docker, devemos usar um <a href=\"https:\/\/docs.docker.com\/compose\/\">docker-compose<\/a> ferramenta que nos d\u00e1 a possibilidade de coordenar ambientes com v\u00e1rios contentores.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00f3s e contras do Docker<\/h3>\n\n\n\n<p>O Docker ajuda-nos a gerir ferramentas que necessitam de alguns recursos espec\u00edficos, como portas ou ficheiros. Separa as inst\u00e2ncias em contentores e d\u00e1-nos controlo total sobre elas. No entanto, o Docker \u00e9 uma ferramenta que introduz muita complexidade ao nosso ambiente de trabalho e pode ser problem\u00e1tica em alguns casos. Um desses casos de uso do Docker em um teste \u00e9 descrito em um dos nossos <a href=\"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\">artigo<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumindo<\/h2>\n\n\n\n<p>Sei que n\u00e3o descrevi todas as ferramentas que podem ser utilizadas para gerir as vers\u00f5es das ferramentas. Existem muitas outras, tais como <a href=\"https:\/\/www.jenv.be\/\">jEnv<\/a> que poderia substituir o SDKMAN,<\/p>\n\n\n\n<p>ou <a href=\"https:\/\/github.com\/nvm-sh\/nvm\">NVM<\/a> que podemos usar para gerenciar o npm ou o <a href=\"https:\/\/rvm.io\/\">RVM<\/a> para <a href=\"https:\/\/thecodest.co\/pt\/case-studies\/providing-a-team-of-ruby-developers-for-a-fintech-company\/\">Rubi<\/a>. Concentrei-me em ferramentas que \"testei no campo de batalha\" e que posso recomendar a qualquer pessoa.<\/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>Existe um meio de ouro para lidar com muitos ambientes para um grande n\u00famero numa s\u00f3 m\u00e1quina? O nosso especialista em Java Bart\u0142omiej sabe a resposta!<\/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\/pt\/blogue\/gerir-varios-ambientes-para-varios-projectos-numa-unica-maquina\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/blogue\/gerir-varios-ambientes-para-varios-projectos-numa-unica-maquina\/\" \/>\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\":\"pt-PT\",\"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\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@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\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@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\":\"pt-PT\",\"@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\\\/pt\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Lidar com v\u00e1rios ambientes para v\u00e1rios projectos numa \u00fanica m\u00e1quina? - The Codest","description":"Descubra como os programadores podem lidar com v\u00e1rios ambientes para diferentes projectos num \u00fanico computador utilizando gestores de vers\u00f5es e contentores.","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\/pt\/blogue\/gerir-varios-ambientes-para-varios-projectos-numa-unica-maquina\/","og_locale":"pt_PT","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\/pt\/blogue\/gerir-varios-ambientes-para-varios-projectos-numa-unica-maquina\/","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":"pt-PT","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":"Lidar com v\u00e1rios ambientes para v\u00e1rios projectos numa \u00fanica m\u00e1quina? - 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":"Descubra como os programadores podem lidar com v\u00e1rios ambientes para diferentes projectos num \u00fanico computador utilizando gestores de vers\u00f5es e contentores.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@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":"pt-PT"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@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":"pt-PT","@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\/pt\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts\/3348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/comments?post=3348"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts\/3348\/revisions"}],"predecessor-version":[{"id":8550,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts\/3348\/revisions\/8550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/media\/3349"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/media?parent=3348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/categories?post=3348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/tags?post=3348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}