{"id":229890,"date":"2022-11-13T14:57:00","date_gmt":"2022-11-13T11:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229890"},"modified":"2022-11-13T14:58:56","modified_gmt":"2022-11-13T11:58:56","slug":"compositor-para-wordpress-parte-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/compositor-para-wordpress-parte-2\/","title":{"rendered":"Compositor para WordPress, Parte 2"},"content":{"rendered":"\n<p>Neste post, vou resumir o que comecei a compartilhar <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/compositor-para-wordpress-parte-1\/\" title=\"ontem\">ontem<\/a>: Usando as ferramentas e <a href=\"https:\/\/tommcfarlin.com\/tag\/libraries-for-wordpress-plugins\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">bibliotecas<\/a> que compartilhei em conjunto com o Composer para farejar seus commits durante o desenvolvimento antes que o c\u00f3digo chegue ao reposit\u00f3rio.<\/p>\n<p>Idealmente, voc\u00ea sempre desejar\u00e1 ver algo assim em seu terminal sempre que confirmar seu c\u00f3digo:<\/p>\n<p>Mas nem sempre \u00e9 assim. Como acontece com a maioria das coisas, por\u00e9m, quanto mais voc\u00ea praticar, mais voc\u00ea se acostumar\u00e1 a escrever c\u00f3digo que passar\u00e1 automaticamente pelos v\u00e1rios sniffs implementados pelas diferentes regras (e suas personaliza\u00e7\u00f5es).<\/p>\n<p>Antes de fazer isso, por\u00e9m, voc\u00ea precisa configurar o GrumPHP em seu reposit\u00f3rio.<\/p>\n<h2>Compositor para WordPress: Sniffing Commits<\/h2>\n<p>Ontem, eu forneci um exemplo <code>composer.json<\/code>\u00a0, ent\u00e3o hoje vamos ver um exemplo de arquivo de configura\u00e7\u00e3o do GrumPHP e ver o que cada parte faz.<\/p>\n<p>O importante a observar \u00e9 que, embora parte do que voc\u00ea ver\u00e1 n\u00e3o seja at\u00edpico para um projeto, voc\u00ea pode ajustar isso o quanto quiser para cada projeto que usar. \u00c0s vezes voc\u00ea pode querer que seja mais focado do que \u00e9 agora; outras vezes, voc\u00ea pode n\u00e3o se importar com alguns dos cheiros que ele oferece.<\/p>\n<h3>Uma configura\u00e7\u00e3o inicial<\/h3>\n<p>Dito isto, ap\u00f3s a instala\u00e7\u00e3o do GrumPHP, ele criar\u00e1 um <code>grumphp.yml<\/code>arquivo quase vazio que est\u00e1 pronto para ser configurado. Por exemplo, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ab0cd032408fdc5cc30c035d77ea49ba#file-00-initial-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">isto \u00e9 o que voc\u00ea deve ver<\/a> :<\/p>\n<pre><code>parameters:\n    git_dir:. bin_dir: vendor\/bin\n    tasks:<\/code><\/pre>\n<p>Observe que n\u00e3o h\u00e1 nada al\u00e9m de especificar:<\/p>\n<ul>\n<li>a localiza\u00e7\u00e3o do reposit\u00f3rio,<\/li>\n<li>a localiza\u00e7\u00e3o dos bin\u00e1rios instalados via Composer,<\/li>\n<li>as tarefas a executar.<\/li>\n<\/ul>\n<p>Note que eu sempre usei &#8216;.&#8217; para a localiza\u00e7\u00e3o do meu reposit\u00f3rio porque nunca deixei de instal\u00e1-lo dentro do reposit\u00f3rio que estou trabalhando.<\/p>\n<p>O mesmo vale para os bin\u00e1rios do Composer. Ou seja, depois de instalar tudo via Composer, deixo-os em seus locais iniciais.<\/p>\n<p>E, finalmente, a <code>tasks<\/code>diretiva inicial est\u00e1 vazia porque ainda n\u00e3o h\u00e1 nada para ser executado. Isso \u00e9 o que eu estarei olhando na pr\u00f3xima etapa.<\/p>\n<h3>Configurando GrumPHP<\/h3>\n<p>Depois de instalar suas bibliotecas e estar pronto para configurar um pouco, talvez voc\u00ea possa fazer algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ab0cd032408fdc5cc30c035d77ea49ba#file-01-sample-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>parameters:\n    git_dir:. bin_dir: vendor\/bin\n    tasks:\n      securitychecker:\n      composer:\n      jsonlint:\n      xmllint:\n      yamllint:\n      phpstan:\n      phplint:\n      phpunit:\n      phpcs:\n      phpcpd:\n      phpmnd:\n      phpparser:\n        visitors:\n          no_exit_statements: ~\n          never_use_else: ~\n          forbidden_function_calls:\n            blacklist:\n              - \"die\"\n              - \"var_dump\"\n              - \"exit\"\n      phpversion:\n        project: '7.0'\n       phpmd:\n         ruleset: ['phpmd.xml.dist']<\/code><\/pre>\n<p>N\u00e3o vou descrever tudo acima (porque n\u00e3o h\u00e1 muito o que delinear), mas ainda h\u00e1 algumas coisas a destacar:<\/p>\n<ul>\n<li>Observe que h\u00e1 uma lista de tarefas muito maior do que a definida no diret\u00f3rio inicial. Isso \u00e9 normal e significa que queremos executar essas ferramentas usando a configura\u00e7\u00e3o padr\u00e3o de cada uma dessas ferramentas.<\/li>\n<li>Algumas das regras t\u00eam um <code>~<\/code>ao lado deles. Isso depende da tarefa em quest\u00e3o, mas geralmente significa que queremos usar a configura\u00e7\u00e3o padr\u00e3o.<\/li>\n<li>Existem tarefas como as <code>phpparser<\/code>que t\u00eam subtarefas. Alguns deles, como voc\u00ea pode ver acima, usam o comportamento padr\u00e3o. Outros optam por colocar na lista negra termos como <code>die<\/code>, <code>var_dump<\/code>, <code>exit<\/code>e muito mais. Isso significa que, como se a diretiva n\u00e3o fosse clara o suficiente, faremos com que o GrumPHP falhe se alguma dessas instru\u00e7\u00f5es for detectada.<\/li>\n<li>Da mesma forma, d\u00ea uma olhada em <code>phpmd<\/code>. Isso aponta para o conjunto de regras que usaremos ao procurar v\u00e1rias bagun\u00e7as no c\u00f3digo. Nesse caso, ele aponta para um <code>dist<\/code>\u00a0arquivo, mas pode apontar para qualquer conjunto personalizado de regras que voc\u00ea definiu.<\/li>\n<\/ul>\n<p>Esta \u00e9 apenas uma amostra do que voc\u00ea pode fazer com o GrumPHP. Ou seja, voc\u00ea pode instalar algumas bibliotecas via Composer, instal\u00e1-las e, em seguida, adaptar o GrumPHP para que voc\u00ea aproveite a funcionalidade fornecida.<\/p>\n<p>Tal como acontece com outros projetos semelhantes, recomendo vivamente a leitura da <a href=\"https:\/\/github.com\/phpro\/grumphp\/blob\/master\/doc\/tasks.md\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o<\/a> que existe para as v\u00e1rias tarefas que se integram com o GrumPHP.<\/p>\n<h2>Este \u00e9 o Composer para WordPress?<\/h2>\n<p>Sim e n\u00e3o. <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Composer<\/a> \u00e9 um gerenciador de pacotes de prop\u00f3sito geral para projetos PHP; no entanto, parece que n\u00e3o vemos muito isso no mundo do WordPress. Isso n\u00e3o quer dizer que n\u00e3o \u00e9 usado (\u00e9), mas simplesmente estar ciente do Composer e como us\u00e1-lo n\u00e3o \u00e9 suficiente.<\/p>\n<p>Em vez disso, acho importante saber como usar o Composer for WordPress para que possamos escrever o mais alto n\u00edvel de c\u00f3digo de qualidade poss\u00edvel, ao mesmo tempo em que garantimos que estamos aderindo aos padr\u00f5es de codifica\u00e7\u00e3o que tamb\u00e9m optamos por empregar .<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta \u00e9 a \u00faltima de uma s\u00e9rie de duas partes sobre como configurar o Composer para desenvolvimento WordPress para que voc\u00ea possa escrever c\u00f3digo de alta qualidade em seu trabalho).<\/p>\n","protected":false},"author":1,"featured_media":223641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,806,846],"tags":[1170,1170],"class_list":["post-229890","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229890","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=229890"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229890\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223641"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}