{"id":232294,"date":"2023-01-12T14:16:00","date_gmt":"2023-01-12T11:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232294"},"modified":"2023-01-12T14:20:19","modified_gmt":"2023-01-12T11:20:19","slug":"como-criar-e-publicar-corretamente-uma-ferramenta-deno-cli","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-criar-e-publicar-corretamente-uma-ferramenta-deno-cli\/","title":{"rendered":"Como criar e publicar corretamente uma ferramenta Deno CLI"},"content":{"rendered":"\n<p>Uma coisa legal sobre o framework Ember \u00e9 que ele tem a CLI do Ember para gerar um componente, um template ou uma rota. \u00c9 uma grande economia de tempo e, mais ainda, <code>ember generate component<\/code>gera n\u00e3o apenas o componente, mas tamb\u00e9m um arquivo de teste para o QUnit. Vamos ver como criar uma ferramenta Deno CLI para fazer algo semelhante para React.<\/p>\n<p>Neste tutorial do Deno, veremos como criar uma ferramenta Deno CLI com TypeScript, como carregar depend\u00eancias da biblioteca padr\u00e3o do Deno. Vamos explorar como ler um diret\u00f3rio e escrever um arquivo. Por fim, aprenderemos a publicar nosso m\u00f3dulo Deno no GitHub e execut\u00e1-lo diretamente desse local e tamb\u00e9m a instal\u00e1-lo localmente para que funcione sem conex\u00e3o.<\/p>\n<h2>Vis\u00e3o geral<\/h2>\n<p>A ferramenta CLI que construiremos neste tutorial do Deno aceitar\u00e1 um nome de componente passado pela linha de comando e gerar\u00e1 um diret\u00f3rio e um arquivo com o c\u00f3digo para um componente funcional React.<\/p>\n<p>Eu criei uma vers\u00e3o mais completa disso que tamb\u00e9m cria uma folha de estilo SASS e um arquivo de teste adequado para Jest e Enzyme. Em breve, adicionaremos mais modelos de personaliza\u00e7\u00e3o e componentes (como aqueles que usam ganchos, Redux, Roteador ou todos eles).<\/p>\n<p>Por uma quest\u00e3o de simplicidade, por\u00e9m, este tutorial do Deno cobrir\u00e1 o essencial: leitura de par\u00e2metros e grava\u00e7\u00e3o de arquivos e escreveremos um \u00fanico arquivo. O resto \u00e9 manipula\u00e7\u00e3o de strings e mais escrita de conte\u00fado, nada particularmente especial. Voc\u00ea pode acessar a ferramenta Deno CLI completa para gerar um componente React com SASS e Jest no reposit\u00f3rio no final deste artigo.<\/p>\n<h2>Instalar Deno<\/h2>\n<p>Para executar esta ferramenta Deno CLI, voc\u00ea precisa ter o runtime instalado. Se voc\u00ea j\u00e1 estiver usando o Homebrew no macOS, poder\u00e1 instalar rapidamente o Deno com:<\/p>\n<pre><code>brew install deno<\/code><\/pre>\n<p>Se voc\u00ea n\u00e3o estiver usando o Homebrew, poder\u00e1 instal\u00e1-lo usando o CURL:<\/p>\n<pre><code>curl -fsSL https:\/\/deno.land\/x\/install\/install.sh | sh<\/code><\/pre>\n<p>Outros m\u00e9todos e sistemas de instala\u00e7\u00e3o est\u00e3o descritos no <a href=\"https:\/\/deno.land\/manual\/getting_started\/installation\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Manual Deno<\/a>.<\/p>\n<h2>Ler par\u00e2metros de linha de comando no Deno<\/h2>\n<p>A coisa mais essencial que precisamos para o nosso gerador \u00e9 levar o nome do componente. Precisamos ser capazes de passar o nome do componente para a ferramenta <a href=\"https:\/\/startfunction.com\/tag\/deno\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Deno .<\/a> Crie um diret\u00f3rio e adicione um arquivo chamado <code>mod.ts<\/code>e cole isso nele:<\/p>\n<pre><code>const { args: [name] } = Deno;\nconsole.log( `Writing component ${ name }` );<\/code><\/pre>\n<p>Agora, quando voc\u00ea adiciona a <code>Deno<\/code>vari\u00e1vel, provavelmente receber\u00e1 um aviso, dependendo do seu editor de c\u00f3digo e do suporte a TypeScript, dizendo que n\u00e3o pode encontrar o <code>Deno<\/code>nome. Se voc\u00ea estiver no VS Code, poder\u00e1 resolver isso usando a <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=denoland.vscode-deno\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">extens\u00e3o oficial do VS Code para adicionar suporte ao Deno<\/a>. JetBrains tamb\u00e9m publicou um plugin para fornecer <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/14382-deno\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">suporte Deno para JetBrain IDEs<\/a>.<\/p>\n<p>Agora execute este m\u00f3dulo com:<\/p>\n<p><code>deno run mod.ts<\/code>Ol\u00e1 Mundo<\/p>\n<p>Isso responder\u00e1 com o par\u00e2metro &quot;HelloWorld&quot; que passamos:<\/p>\n<p><code>Writing component HelloWorld<\/code><\/p>\n<p>Agrad\u00e1vel! Est\u00e1 funcionando!<\/p>\n<h2>Gravar arquivos com Deno<\/h2>\n<p>Vamos escrever o arquivo agora. Primeiro precisamos do conte\u00fado para ele, ent\u00e3o adicione isso ao <code>mod.ts<\/code>arquivo. Usaremos literais de modelo <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> para criar uma \u00fanica string e inserir o nome do componente e at\u00e9 chamar um m\u00e9todo de string para torn\u00e1-lo min\u00fasculo:<\/p>\n<pre><code>const compoContent: string = `import React from 'react';\nimport PropTypes from 'prop-types';\n\n${name}.propTypes = {\n\n};\nfunction ${name}(props) {\n    return();\n}\nexport default ${name};\n`;<\/code><\/pre>\n<p>Para gravar isso em um arquivo, primeiro precisamos verificar se o diret\u00f3rio existe. Usaremos a <code>ensureDir<\/code>fun\u00e7\u00e3o, parte da <a href=\"https:\/\/deno.land\/std\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">biblioteca padr\u00e3o Deno<\/a>, para isso. Ele criar\u00e1 o diret\u00f3rio ou diret\u00f3rios se eles n\u00e3o existirem. Para dizer ao Deno para usar essa depend\u00eancia, basta adicionar isso no topo do arquivo:<\/p>\n<pre><code>import { ensureDir } from \"https:\/\/deno.land\/std\/fs\/ensure_dir.ts\";<\/code><\/pre>\n<p>Quando executarmos nossa ferramenta, o Deno baixar\u00e1 este m\u00f3dulo para us\u00e1-lo. Finalmente \u00e9 hora de escrever o arquivo usando <code>writeTestFile<\/code>, um comando no runtime do Deno. Cole o seguinte no final do arquivo:<\/p>\n<pre><code>const compoPath: string = \".\/app\/components\/\" + compoName + \"\/\";\n\nensureDir(compoPath)\n  .then(() =&gt; {\n    Deno.writeTextFile(compoPath + \"index.js\", compoContent);\n    console.info(\"Done!\");\n});<\/code><\/pre>\n<h2>Teste local<\/h2>\n<p>Terminamos de codificar nossa ferramenta Deno CLI e agora podemos test\u00e1-la. O Deno \u00e9 constru\u00eddo como um tempo de execu\u00e7\u00e3o seguro, portanto, opera\u00e7\u00f5es como ler o sistema de arquivos ou gravar nele s\u00e3o negadas por padr\u00e3o. Voc\u00ea precisa pedir explicitamente ao Deno para permitir o acesso ao sistema de arquivos. \u00c9 separado em acesso de leitura e acesso de grava\u00e7\u00e3o. Neste caso, precisamos de permiss\u00e3o de leitura, pois <code>ensureDir<\/code>primeiro precisamos ler o diret\u00f3rio e verificar se ele existe. Se n\u00e3o, ele ir\u00e1 cri\u00e1-lo e, em seguida, criaremos o arquivo. Para as duas \u00faltimas tarefas, precisamos de permiss\u00e3o de grava\u00e7\u00e3o. Ent\u00e3o \u00e9 assim que voc\u00ea pode execut\u00e1-lo:<\/p>\n<p><code>deno --allow-read --allow-write mod.ts button<\/code><\/p>\n<p>E voc\u00ea ter\u00e1 os diret\u00f3rios criados junto com o arquivo, todos relativos \u00e0 pasta onde voc\u00ea est\u00e1 executando isso, como <code>app\/components\/Button\/index.js<\/code>.<\/p>\n<h2>Publicar um m\u00f3dulo Deno<\/h2>\n<p>Distribuir um m\u00f3dulo Deno \u00e9 simples. Cobrimos isso em detalhes em um post anterior sobre <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/publique-um-modulo-deno-em-3-etapas-rapidas\/\" title=\"como criar e publicar um m\u00f3dulo Deno no GitHub\">como criar e publicar um m\u00f3dulo Deno no GitHub<\/a>. Voc\u00ea precisa inicializar um reposit\u00f3rio git local:<\/p>\n<p><code>git init<\/code><\/p>\n<p>adicione e confirme seus arquivos:<\/p>\n<p><code>git add .<\/code><br \/>\n<code>git commit -m \"Initial commit\"<\/code><\/p>\n<p>crie um reposit\u00f3rio no GitHub ou servi\u00e7o semelhante e envie-o por push. Por exemplo, se voc\u00ea criar um reposit\u00f3rio chamado <code>a-deno-module<\/code>no GitHub, poder\u00e1 execut\u00e1-lo localmente para envi\u00e1-lo online:<\/p>\n<p><code>git remote add origin git@github.com:YOUR-GITHUB-USER\/a-deno-module.git&lt;br&gt;git push -u origin master<\/code><\/p>\n<h2>Use o m\u00f3dulo publicado online<\/h2>\n<p>Deno pode executar m\u00f3dulos diretamente da Internet e instalar suas depend\u00eancias automaticamente. Agora que est\u00e1 implantado, voc\u00ea pode executar nossa ferramenta Deno CLI diretamente do GitHub:<\/p>\n<pre><code>deno run --allow-read --allow-write https:\/\/raw.githubusercontent.com\/YOUR-GITHUB-USER\/a-deno-module\/master\/mod.ts button<\/code><\/pre>\n<p>Deno far\u00e1 o download da ferramenta, verificar\u00e1 as depend\u00eancias e as instalar\u00e1, se necess\u00e1rio. O resultado ser\u00e1 o mesmo que acima, ele criar\u00e1 os diret\u00f3rios e o arquivo.<\/p>\n<p>Para evitar ter que escrever tudo isso (ou procur\u00e1-lo no shell), o Deno permite que voc\u00ea instale esta ferramenta para que funcione offline:<\/p>\n<pre><code>deno install --allow-read --allow-write --name denomodu https:\/\/raw.githubusercontent.com\/YOUR-GITHUB-USER\/a-deno-module\/master\/mod.ts<\/code><\/pre>\n<p>A ferramenta ser\u00e1 nomeada <code>denomodu<\/code>. O que isso faz \u00e9 criar um arquivo execut\u00e1vel com a linha de comando em um determinado diret\u00f3rio, como <code>\/Users\/%your-username%\/.deno\/bin<\/code>no macOS. Seu conte\u00fado \u00e9 o comando para executar a ferramenta e aceitar par\u00e2metros:<\/p>\n<pre><code>#!\/bin\/sh\n\ndeno \"run\" \"--allow-read\" \"--allow-write\" \"https:\/\/raw.githubusercontent.com\/eliorivero\/react-generate-component\/master\/mod.ts\" \"$@\"<\/code><\/pre>\n<p>Ent\u00e3o, quando o processo terminar, se voc\u00ea n\u00e3o adicionou o <code>.\/deno\/bin<\/code>caminho \u00e0 sua vari\u00e1vel de ambiente PATH, o Deno solicitar\u00e1 que voc\u00ea fa\u00e7a isso, para que voc\u00ea possa executar a ferramenta.<\/p>\n<p>Depois de adicionar o caminho \u00e0 sua vari\u00e1vel PATH, agora voc\u00ea pode invocar a ferramenta:<\/p>\n<p><code>denomodu button<\/code><\/p>\n<p>\u00c9 muito mais curto e agora funciona sem estar conectado \u00e0 Internet. Parab\u00e9ns! Voc\u00ea criou uma ferramenta Deno CLI, publicou-a e instalou-a localmente.<\/p>\n<h2>Ferramenta Deno CLI para gerar um componente React<\/h2>\n<p>Como mencionado no in\u00edcio deste tutorial do Deno, criei uma vers\u00e3o mais completa disso, e voc\u00ea pode acessar o reposit\u00f3rio dessa ferramenta aqui:<\/p>\n<p><a href=\"https:\/\/github.com\/eliorivero\/react-generate-component\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/eliorivero\/react-generate-component<\/a><\/p>\n<p>\u00c9 apenas um m\u00f3dulo Deno criado no TypeScript e cria esses arquivos:<\/p>\n<ul>\n<li><code>index.js<\/code>, um componente funcional React<\/li>\n<li><code>style.scss<\/code>, sua folha de estilo SASS<\/li>\n<li><code>test.js<\/code>, um teste simples usando Jest e Enzyme<\/li>\n<\/ul>\n<p>O gif abaixo mostra como esta ferramenta Deno funciona ap\u00f3s ser instalada:<\/p>\n<p>Ele aceita nomes compostos separados por um tra\u00e7o. Por exemplo, passar <code>nav-bar<\/code>criar\u00e1 um componente chamado <code>NavBar<\/code>. Voc\u00ea tamb\u00e9m pode especificar um caminho de diret\u00f3rio personalizado diferente do padr\u00e3o <code>app\/components<\/code>ou n\u00e3o e continuar usando o caminho padr\u00e3o.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos construir uma ferramenta que gere um arquivo para um componente funcional do React.<\/p>\n","protected":false},"author":1,"featured_media":157660,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,753,722,837,733,1021,846],"tags":[1170],"class_list":["post-232294","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-guia-para-iniciantes","category-javascript-8","category-sites-uteis","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=232294"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232294\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/157660"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=232294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=232294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=232294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}