{"id":232208,"date":"2023-01-12T14:17:00","date_gmt":"2023-01-12T11:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232208"},"modified":"2023-01-12T14:17:34","modified_gmt":"2023-01-12T11:17:34","slug":"comment-creer-et-publier-correctement-un-outil-deno-cli","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-creer-et-publier-correctement-un-outil-deno-cli\/","title":{"rendered":"Comment cr\u00e9er et publier correctement un outil Deno CLI"},"content":{"rendered":"\n<p>Une chose int\u00e9ressante \u00e0 propos du framework Ember est qu&rsquo;il dispose de la CLI Ember pour g\u00e9n\u00e9rer un composant, un mod\u00e8le ou une route. C&rsquo;est un gain de temps consid\u00e9rable, et plus encore, le <code>ember generate component<\/code>g\u00e9n\u00e8re non seulement le composant mais \u00e9galement un fichier de test pour QUnit. Voyons comment cr\u00e9er un outil Deno CLI pour faire quelque chose de similaire pour React.<\/p>\n<p>Dans ce didacticiel Deno, nous verrons comment cr\u00e9er un outil CLI Deno avec TypeScript, comment charger les d\u00e9pendances \u00e0 partir de la biblioth\u00e8que standard Deno. Nous allons explorer comment lire un r\u00e9pertoire et \u00e9crire un fichier. Enfin, nous apprendrons \u00e0 publier notre module Deno sur GitHub et \u00e0 l&rsquo;ex\u00e9cuter directement \u00e0 partir de cet emplacement, ainsi qu&rsquo;\u00e0 l&rsquo;installer localement afin qu&rsquo;il puisse fonctionner sans connexion.<\/p>\n<h2>Aper\u00e7u<\/h2>\n<p>L&rsquo;outil CLI que nous allons construire dans ce tutoriel Deno acceptera un nom de composant transmis via la ligne de commande et g\u00e9n\u00e9rera un r\u00e9pertoire et un fichier avec le code d&rsquo;un composant fonctionnel React.<\/p>\n<p>J&rsquo;en ai cr\u00e9\u00e9 une version plus compl\u00e8te qui cr\u00e9e \u00e9galement une feuille de style SASS et un fichier de test adapt\u00e9 \u00e0 Jest et Enzyme. Nous ajouterons bient\u00f4t plus de mod\u00e8les de personnalisation et de composants (comme ceux utilisant des crochets, ou Redux, ou Router, ou tous).<\/p>\n<p>Par souci de simplicit\u00e9 cependant, ce tutoriel Deno couvrira l&rsquo;essentiel: lire les param\u00e8tres et \u00e9crire des fichiers et nous n&rsquo;\u00e9crirons qu&rsquo;un seul fichier. Le reste est de la manipulation de cha\u00eenes et plus d&rsquo;\u00e9criture de contenu, rien de particuli\u00e8rement sp\u00e9cial. Vous pouvez acc\u00e9der \u00e0 l&rsquo;outil Deno CLI complet pour g\u00e9n\u00e9rer un composant React avec SASS et Jest dans le r\u00e9f\u00e9rentiel \u00e0 la fin de cet article.<\/p>\n<h2>Installer Deno<\/h2>\n<p>Pour ex\u00e9cuter cet outil Deno CLI, vous devez avoir install\u00e9 le runtime. Si vous utilisez d\u00e9j\u00e0 Homebrew sur macOS, vous pouvez rapidement installer Deno avec :<\/p>\n<pre><code>brew install deno<\/code><\/pre>\n<p>Si vous n&rsquo;utilisez pas Homebrew, vous pouvez l&rsquo;installer en utilisant CURL\u00a0:<\/p>\n<pre><code>curl -fsSL https:\/\/deno.land\/x\/install\/install.sh | sh<\/code><\/pre>\n<p>D&rsquo;autres m\u00e9thodes et syst\u00e8mes d&rsquo;installation sont d\u00e9crits dans le <a href=\"https:\/\/deno.land\/manual\/getting_started\/installation\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manuel Deno<\/a>.<\/p>\n<h2>Lire les param\u00e8tres de ligne de commande dans Deno<\/h2>\n<p>La chose la plus essentielle dont nous avons besoin pour notre g\u00e9n\u00e9rateur est de prendre le nom du composant. Nous devons \u00eatre en mesure de transmettre le nom du composant \u00e0 l&rsquo; outil <a href=\"https:\/\/startfunction.com\/tag\/deno\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Deno .<\/a> Cr\u00e9ez un r\u00e9pertoire et ajoutez un fichier appel\u00e9 <code>mod.ts<\/code>et collez-le dedans\u00a0:<\/p>\n<pre><code>const { args: [name] } = Deno;\nconsole.log( `Writing component ${ name }` );<\/code><\/pre>\n<p>Maintenant, lorsque vous ajoutez la <code>Deno<\/code>variable, vous recevrez probablement un avertissement, selon votre \u00e9diteur de code et sa prise en charge TypeScript, indiquant qu&rsquo;il ne peut pas trouver le <code>Deno<\/code>nom. Si vous \u00eates dans VS Code, vous pouvez r\u00e9soudre ce probl\u00e8me en utilisant l&rsquo; <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=denoland.vscode-deno\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">extension officielle VS Code pour ajouter le support Deno<\/a>. JetBrains a \u00e9galement publi\u00e9 un plugin pour fournir la <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/14382-deno\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prise en charge de Deno pour les IDE JetBrain<\/a>.<\/p>\n<p>Ex\u00e9cutez maintenant ce module avec\u00a0:<\/p>\n<p><code>deno run mod.ts<\/code>Bonjour le monde<\/p>\n<p>Cela r\u00e9pondra avec le param\u00e8tre &quot;HelloWorld&quot; que nous avons pass\u00e9\u00a0:<\/p>\n<p><code>Writing component HelloWorld<\/code><\/p>\n<p>Agr\u00e9able! \u00c7a marche!<\/p>\n<h2>\u00c9crire des fichiers avec Deno<\/h2>\n<p>\u00c9crivons le fichier maintenant. Nous avons d&rsquo;abord besoin de son contenu, alors ajoutez-le au <code>mod.ts<\/code>fichier. Nous utiliserons des litt\u00e9raux de mod\u00e8le <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> pour cr\u00e9er une seule cha\u00eene et ins\u00e9rer le nom du composant et m\u00eame appeler une m\u00e9thode de cha\u00eene pour la mettre en minuscule :<\/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>Pour \u00e9crire ceci dans un fichier, nous devons d&rsquo;abord v\u00e9rifier si le r\u00e9pertoire existe. Nous utiliserons la <code>ensureDir<\/code>fonction, qui fait partie de la <a href=\"https:\/\/deno.land\/std\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">biblioth\u00e8que standard Deno<\/a>, pour cela. Il cr\u00e9era le r\u00e9pertoire ou les r\u00e9pertoires s&rsquo;ils n&rsquo;existent pas. Pour indiquer \u00e0 Deno d&rsquo;utiliser cette d\u00e9pendance, ajoutez simplement ceci en haut du fichier\u00a0:<\/p>\n<pre><code>import { ensureDir } from \"https:\/\/deno.land\/std\/fs\/ensure_dir.ts\";<\/code><\/pre>\n<p>Lorsque nous ex\u00e9cuterons notre outil, Deno t\u00e9l\u00e9chargera ce module pour l&rsquo;utiliser. Il est enfin temps d&rsquo;\u00e9crire le fichier en utilisant <code>writeTestFile<\/code>, une commande du runtime Deno. Collez ce qui suit \u00e0 la fin du fichier\u00a0:<\/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>Essai local<\/h2>\n<p>Nous avons fini de coder notre outil Deno CLI et nous pouvons maintenant le tester. Deno est con\u00e7u comme un environnement d&rsquo;ex\u00e9cution s\u00e9curis\u00e9 d&rsquo;abord, de sorte que les op\u00e9rations telles que la lecture du syst\u00e8me de fichiers ou l&rsquo;\u00e9criture sur celui-ci sont refus\u00e9es par d\u00e9faut. Vous devez demander explicitement \u00e0 Deno d&rsquo;autoriser l&rsquo;acc\u00e8s au syst\u00e8me de fichiers. Il est s\u00e9par\u00e9 en acc\u00e8s en lecture et en acc\u00e8s en \u00e9criture. Dans ce cas, nous avons besoin d&rsquo;une autorisation de lecture, car nous devons <code>ensureDir<\/code>d&rsquo;abord lire le r\u00e9pertoire et v\u00e9rifier s&rsquo;il existe. Si ce n&rsquo;est pas le cas, il le cr\u00e9era, puis nous cr\u00e9erons le fichier. Pour les deux derni\u00e8res t\u00e2ches, nous avons besoin d&rsquo;une autorisation d&rsquo;\u00e9criture. Voici donc comment vous pouvez l&rsquo;ex\u00e9cuter\u00a0:<\/p>\n<p><code>deno --allow-read --allow-write mod.ts button<\/code><\/p>\n<p>Et vous aurez les r\u00e9pertoires cr\u00e9\u00e9s avec le fichier, tous relatifs au dossier dans lequel vous ex\u00e9cutez ceci, comme <code>app\/components\/Button\/index.js<\/code>.<\/p>\n<h2>Publier un module Deno<\/h2>\n<p>Distribuer un module Deno est simple. Nous avons couvert cela en d\u00e9tail dans un article pr\u00e9c\u00e9dent sur <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/publiez-un-module-deno-en-3-etapes-rapides\/\" title=\"la cr\u00e9ation et la publication d&#039;un module Deno sur GitHub\">la cr\u00e9ation et la publication d&rsquo;un module Deno sur GitHub<\/a>. Vous devez initialiser un d\u00e9p\u00f4t git local\u00a0:<\/p>\n<p><code>git init<\/code><\/p>\n<p>ajoutez et validez vos fichiers\u00a0:<\/p>\n<p><code>git add .<\/code><br \/>\n<code>git commit -m \"Initial commit\"<\/code><\/p>\n<p>cr\u00e9ez un r\u00e9f\u00e9rentiel sur GitHub ou un service similaire, et poussez-le. Par exemple, si vous cr\u00e9ez un r\u00e9f\u00e9rentiel nomm\u00e9 <code>a-deno-module<\/code>sur GitHub, vous pouvez l&rsquo;ex\u00e9cuter localement pour le mettre en ligne\u00a0:<\/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>Utiliser le module publi\u00e9 en ligne<\/h2>\n<p>Deno peut ex\u00e9cuter des modules directement depuis Internet et installer ses d\u00e9pendances automatiquement. Maintenant qu&rsquo;il est d\u00e9ploy\u00e9, vous pouvez ex\u00e9cuter notre outil Deno CLI directement depuis GitHub\u00a0:<\/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 t\u00e9l\u00e9chargera l&rsquo;outil, v\u00e9rifiera les d\u00e9pendances et les installera si n\u00e9cessaire. Le r\u00e9sultat sera le m\u00eame que ci-dessus, il cr\u00e9era les r\u00e9pertoires et le fichier.<\/p>\n<p>Pour \u00e9viter d&rsquo;avoir \u00e0 \u00e9crire tout \u00e7a (ou \u00e0 le chercher dans le shell) Deno permet d&rsquo;installer cet outil pour qu&rsquo;il fonctionne hors ligne :<\/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>L&rsquo;outil sera nomm\u00e9 <code>denomodu<\/code>. Cela consiste \u00e0 cr\u00e9er un fichier ex\u00e9cutable avec la ligne de commande dans un certain r\u00e9pertoire, comme <code>\/Users\/%your-username%\/.deno\/bin<\/code>dans macOS. Son contenu est la commande pour ex\u00e9cuter l&rsquo;outil et accepter les param\u00e8tres\u00a0:<\/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>Ainsi, une fois le processus termin\u00e9, si vous n&rsquo;avez pas ajout\u00e9 le <code>.\/deno\/bin<\/code>chemin d&rsquo;acc\u00e8s \u00e0 votre variable d&rsquo;environnement PATH, Deno vous invitera \u00e0 le faire afin que vous puissiez ex\u00e9cuter l&rsquo;outil.<\/p>\n<p>Une fois que vous avez ajout\u00e9 le chemin \u00e0 votre variable PATH, vous pouvez maintenant appeler l&rsquo;outil\u00a0:<\/p>\n<p><code>denomodu button<\/code><\/p>\n<p>C&rsquo;est beaucoup plus court et maintenant \u00e7a marche sans \u00eatre connect\u00e9 \u00e0 Internet. Toutes nos f\u00e9licitations! Vous avez cr\u00e9\u00e9 un outil Deno CLI, vous l&rsquo;avez publi\u00e9 et install\u00e9 localement.<\/p>\n<h2>Outil Deno CLI pour g\u00e9n\u00e9rer un composant React<\/h2>\n<p>Comme mentionn\u00e9 au d\u00e9but de ce tutoriel Deno, j&rsquo;en ai cr\u00e9\u00e9 une version plus compl\u00e8te, et vous pouvez acc\u00e9der au d\u00e9p\u00f4t de cet outil ici :<\/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>C&rsquo;est un seul module Deno cr\u00e9\u00e9 sur TypeScript et cr\u00e9e ces fichiers\u00a0:<\/p>\n<ul>\n<li><code>index.js<\/code>, un composant fonctionnel React<\/li>\n<li><code>style.scss<\/code>, sa feuille de style SASS<\/li>\n<li><code>test.js<\/code>, un test simple utilisant Jest et Enzyme<\/li>\n<\/ul>\n<p>Le gif ci-dessous montre comment cet outil Deno fonctionne apr\u00e8s avoir \u00e9t\u00e9 install\u00e9\u00a0:<\/p>\n<p>Il accepte les noms compos\u00e9s s\u00e9par\u00e9s par un tiret. Par exemple, passer <code>nav-bar<\/code>cr\u00e9era un composant nomm\u00e9 <code>NavBar<\/code>. Vous pouvez \u00e9galement sp\u00e9cifier un chemin de r\u00e9pertoire personnalis\u00e9 autre que le chemin par d\u00e9faut <code>app\/components<\/code>, ou non, et continuer \u00e0 utiliser le chemin par d\u00e9faut.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Construisons un outil qui g\u00e9n\u00e8re un fichier pour un composant fonctionnel 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":[893,717,832,728,748,1016,841],"tags":[1167],"class_list":["post-232208","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-javascript-3","category-open-source-projektmanagement-2","category-sites-utiles","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=232208"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232208\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/157660"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=232208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=232208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=232208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}