<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matheus Moura</title>
    <description>The latest articles on DEV Community by Matheus Moura (@itsmatheusmoura).</description>
    <link>https://dev.to/itsmatheusmoura</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1194845%2F10e38389-99e8-48d8-8803-2dc52bb4c68b.png</url>
      <title>DEV Community: Matheus Moura</title>
      <link>https://dev.to/itsmatheusmoura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itsmatheusmoura"/>
    <language>en</language>
    <item>
      <title>Gerenciando os gerenciadores de pacotes com ASDF</title>
      <dc:creator>Matheus Moura</dc:creator>
      <pubDate>Thu, 16 Nov 2023 14:48:14 +0000</pubDate>
      <link>https://dev.to/itsmatheusmoura/gerenciando-os-gerenciadores-de-pacotes-com-asdf-411i</link>
      <guid>https://dev.to/itsmatheusmoura/gerenciando-os-gerenciadores-de-pacotes-com-asdf-411i</guid>
      <description>&lt;h2&gt;
  
  
  Gerenciando os gerenciadores de pacotes com ASDF
&lt;/h2&gt;

&lt;p&gt;Em nossa vida como desenvolvedor constantemente temos que ficar mudando de projeto em projeto cada um com suas próprias stacks  e suas versões. Para melhorar a transição entre as versões cada linguagem foi criando seu próprio gerenciador de pacotes ou package manager. O Python tem o Pip, o Node tem o Npm ou o Yarn, o Php com o composer. Porém a medida que estamos lidando com stacks diferentes a tendência é que fiquemos com múltiplos gerenciadores de pacotes um para cada linguagem e cada um com sua própria CLI. &lt;br&gt;
Para o nosso dia a dia isso termina sendo um pouco desconfortável porque temos que adaptar a linguagem e termina não ficando prático. &lt;br&gt;
A algum tempo tipo contato com um gerenciador chamado &lt;strong&gt;ASDF&lt;/strong&gt; ele é orientado a plugins e o que significa isso ? Na prática se estamos trabalhando com por exemplo Node, Java e Php só vamos precisar apenas instalar os plugins para essas versões e usar a mesma linguagem do ASDF para instalar qualquer versão das linguagens. &lt;br&gt;
Com isso temos o controle de versão tanto global quanto local, o que mostra-se muito prático quando estamos lidando com projeto com versões diferentes da mesma tecnologia. &lt;br&gt;
No exemplo que quero demonstrar hoje pra vocês, vamos demonstrar como poderíamos ter dois projetos Java com versões diferentes rodando ao mesmo tempo. Isso é possível pois o ASDF permite que tenhamos versões locais para cada projeto. &lt;br&gt;
Importante lembrar que o ASDF está disponível para sistemas Linux e Mac, mas poderemos usar no Windows usando o WSL. &lt;br&gt;
Para o nosso exemplo vamos considerar uma máquina Linux usando o Ubuntu:&lt;br&gt;
Para isso vamos acessar a página de instalação do &lt;a href="https://asdf-vm.com/"&gt;ASDF&lt;/a&gt; e executar os seguintes scripts :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma vez clonado o projeto precisamos atualizar o bash ou o zsh:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Feito isso, se abrirmos um novo terminal e digitarmos: 'asdf' deveremos ver a seguinte tela:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KZYilhee--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4a55j3o31uosq0uh6psy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KZYilhee--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4a55j3o31uosq0uh6psy.png" alt="Image description" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisaremos instalar o plugin para o Java para isso vamos nesse site do &lt;a href="https://github.com/halcyon/asdf-java"&gt;GitHub&lt;/a&gt; e executar os códigos abaixo. Logo após podemos efetuar as seguintes códigos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/halcyon/asdf-java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalado o plugin do Java podemos listar todas as versões disponíveis com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf list-all java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para podermos ver o poder do ASDF para gerenciar múltiplas versões vamos criar dois projetos Java com versões diferentes. &lt;/p&gt;

&lt;p&gt;Utilize os comandos abaixo para instalar as versões 11 e 21 do Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Java 21
asdf install java adoptopenjdk-jre-21.0.1+12.0.LTS

// Java 11
asdf install java adoptopenjdk-11.0.16+8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos agora criar duas pastas um para cada projeto, chamarei uma de java11 e outra de java21.&lt;br&gt;
Usando o terminal vamos navegar até a pasta java11 e digitar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf local java adoptopenjdk-11.0.16+8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da mesma forma vamos fazer para a pasta java21 e digitar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf local java adoptopenjdk-21.0.0+35.0.LTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso se testarmos usando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java -version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;em cada uma das pastas devemos ver algo dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qGEKmB8R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nv3403yr16fpbkl0tqdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qGEKmB8R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nv3403yr16fpbkl0tqdy.png" alt="Image description" width="800" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso estamos preparados para rodar dois projetos Java ao mesmo tempo com versões totalmente distintas. Lembre-se que isso funciona para outras linguagens como PHP, Go, Erlang, Node Js. Bastando instalar os plugins referente a linguagem que deseja gerenciar suas versões. Para isso podemos pesquisar algo como: asdf plugin go, por exemplo para encontrar o plugin referente a linguagem Go.&lt;/p&gt;

</description>
      <category>java</category>
      <category>npm</category>
      <category>pacotes</category>
      <category>go</category>
    </item>
    <item>
      <title>React Native e permissão para salvar arquivos com Android 13</title>
      <dc:creator>Matheus Moura</dc:creator>
      <pubDate>Thu, 16 Nov 2023 13:28:10 +0000</pubDate>
      <link>https://dev.to/itsmatheusmoura/react-native-e-permissao-para-salvar-arquivos-com-android-13-1ogo</link>
      <guid>https://dev.to/itsmatheusmoura/react-native-e-permissao-para-salvar-arquivos-com-android-13-1ogo</guid>
      <description>&lt;p&gt;Tenho um aplicativo com React Native que é acessado por várias versões do Android desde o Android 8 até o mais atual (Tiramisu) a poucos dias recebi um chamado informando que alguns usuários não estavam acessar uma feature que visualizava um PDF. Foi então que descobri que o esquema de permissões antes usando no Android Manifest(AM) mudou.&lt;br&gt;
Antes basicamente precisávamos colocar esse trecho de código no AM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.READ_EXTERNAL_STORAGE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.WRITE_EXTERNAL_STORAGE"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E só com isso conseguimos utilizar, acontece que hoje essas permissões não são mais necessárias e pesquisando um pouco tive muita dificuldade em encontrar uma solução simples que resolvesse nosso problema.&lt;br&gt;
Vamos a solução...&lt;br&gt;
Para garantir que versões mais antigas ainda funciona da forma padrão é importante que adicionemos a seguinte flag no AM dentro da tag application:&lt;br&gt;
&lt;code&gt;android:requestLegacyExternalStorage="true"&lt;/code&gt; isso vai garantir o suporte para versões mais antigas.&lt;br&gt;
Para o Tiramisu nosso ajuste é a nível de código, vamos precisar checar a versão do Android do usuário e estou usando a biblioteca 'react-native-device-info'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DeviceInfo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-device-info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;deviceVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;DeviceInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getSystemVersion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;downloadPdf&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OS&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;android&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deviceVersion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;funcaoParaDownloadPDF&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="nx"&gt;setPathPDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;permissao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PermissionsAndroid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PermissionsAndroid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PERMISSIONS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WRITE_EXTERNAL_STORAGE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permissao&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;PermissionsAndroid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RESULTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GRANTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;funcaoParaDownloadPDF&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nx"&gt;setPathPDF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;Alert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Permissão negada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;É necessário dar permissão para exibir o PDF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;navigation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goBack&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="c1"&gt;// Seu app aqui&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas checagens verificam a versão do sistema e a mesma for Android 13 ela não precisa de pedir permissão pois por padrão essa versão de sistema já fornece. Caso seja inferior ai seguimos pedindo permissão.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>reactnative</category>
      <category>android</category>
    </item>
  </channel>
</rss>
