{"id":407301,"date":"2023-11-21T04:48:48","date_gmt":"2023-11-21T03:48:48","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=blog&#038;p=407301"},"modified":"2023-11-21T04:48:52","modified_gmt":"2023-11-21T03:48:52","slug":"amper-melhorando-a-experiencia-do-usuario-com-ferramentas-de-build","status":"publish","type":"blog","link":"https:\/\/blog.jetbrains.com\/pt-br\/blog\/2023\/11\/21\/amper-melhorando-a-experiencia-do-usuario-com-ferramentas-de-build\/","title":{"rendered":"Amper \u2013 Melhorando a experi\u00eancia do usu\u00e1rio com ferramentas de build\u00a0"},"content":{"rendered":"<p>As pessoas que adotam o Kotlin sempre nos dizem que acham desafiador lidar com sistemas de build. Embora muitos projetos usem assistentes para configurar ambientes para que estes estejam prontos para os desenvolvedores come\u00e7arem, estes tamb\u00e9m precisam receber manuten\u00e7\u00e3o. Novos m\u00f3dulos, plataformas, depend\u00eancias e outras mudan\u00e7as acontecem, o que muitas vezes faz com que os desenvolvedores percam mais tempo lutando contra o sistema de build e o IDE do que realmente se concentrando no trabalho que precisam fazer. Com o Kotlin se tornando uma linguagem multiplataforma, isso \u00e9 ainda mais enfatizado por pessoas que ainda s\u00e3o iniciantes no ecossistema JVM.<\/p>\n<p>H\u00e1 algum tempo, estamos trabalhando em uma s\u00e9rie de experimentos internamente na JetBrains para descobrir como podemos melhorar essa experi\u00eancia para os desenvolvedores, n\u00e3o apenas do ponto de vista da defini\u00e7\u00e3o de projetos, como tamb\u00e9m fornecendo melhor suporte para ferramentas. Esses esfor\u00e7os est\u00e3o sincronizados com <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-multiplatform-tooling-in-fleet\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/11\/kotlin-multiplatform-tooling-in-fleet\/\">outras iniciativas<\/a> nas quais estamos trabalhando em rela\u00e7\u00e3o ao <a href=\"https:\/\/www.jetbrains.com\/kotlin-multiplatform\/\" target=\"_blank\" rel=\"noreferrer noopener\">Kotlin Multiplatform<\/a>.<\/p>\n<p>Hoje, estamos entusiasmados em compartilhar publicamente um desses projetos: o Amper. Por\u00e9m, antes de prosseguirmos, gostar\u00edamos de deixar um aviso: o projeto ainda \u00e9 muito experimental, e nosso principal objetivo ao abri-lo \u00e9 validar as ideias por detr\u00e1s dele e receber seu feedback.<\/p>\n<h2 class=\"wp-block-heading\">O que \u00e9 o Amper?<\/h2>\n<p>O Amper \u00e9 uma ferramenta para configura\u00e7\u00e3o de projetos. Seu objetivo \u00e9 melhorar a experi\u00eancia do usu\u00e1rio e o trabalho com ferramentas na configura\u00e7\u00e3o de projetos, ou seja, o suporte dentro do IDE, ao mesmo tempo em que proporciona uma experi\u00eancia suave e pronta para uso.\u00a0<\/p>\n<p>Atualmente, estamos analisando v\u00e1rios aspectos, incluindo a configura\u00e7\u00e3o de projetos para fins de compila\u00e7\u00e3o, empacotamento, publica\u00e7\u00e3o e muito mais. Por\u00e9m, no est\u00e1gio atual, o foco est\u00e1 principalmente na configura\u00e7\u00e3o de projetos para fins de compila\u00e7\u00e3o.<\/p>\n<p>Embora o caso de uso atual seja o Kotlin e o Kotlin Multiplatform, o Amper tamb\u00e9m oferece suporte para Java e Swift (como um requisito para multiplataforma). No entanto, a mesma abordagem de configura\u00e7\u00e3o poder\u00e1 funcionar para outras linguagens e pilhas de tecnologia no futuro.\u00a0<\/p>\n<p>O Amper \u00e9 implementado como um plug-in Gradle e usa YAML para o formato de configura\u00e7\u00e3o do projeto. O objetivo agora \u00e9 validar a experi\u00eancia do usu\u00e1rio, e \u00e9 por isso que optamos por trabalhar com uma ferramenta de build bem testada como o Gradle, proporcionando uma camada de configura\u00e7\u00e3o al\u00e9m dela.<\/p>\n<p>Em rela\u00e7\u00e3o ao uso do YAML, alguns de voc\u00eas podem estar se perguntando: por que n\u00e3o o Kotlin? Embora a decis\u00e3o sobre essa linguagem de marca\u00e7\u00e3o n\u00e3o seja definitiva, queremos adotar uma abordagem declarativa. Acreditamos que isso n\u00e3o s\u00f3 permite uma configura\u00e7\u00e3o mais simplificada e menos propensa a erros, como tamb\u00e9m nos ajuda a fornecer ferramentas melhores. E, novamente, para compartilhar esse experimento com voc\u00ea e validar as ideias por detr\u00e1s dele, adotamos a abordagem mais simples. Ainda n\u00e3o decidimos se teremos ou n\u00e3o um subconjunto restritivo do Kotlin como linguagem de front-end. Por enquanto, nosso foco est\u00e1 na valida\u00e7\u00e3o das nossas ideias.\u00a0<\/p>\n<h2 class=\"wp-block-heading\">Mostre-me o c\u00f3digo!<\/h2>\n<p>Vamos usar um projeto JVM muito b\u00e1sico, &#8220;Hello, World!&#8221;, com a seguinte estrutura de diret\u00f3rios no IntelliJ IDEA 2023.3:<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-404254\" style=\"width: 411px;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/11\/ij-jvm-structure.png\" alt=\"\" width=\"822\" height=\"573\" \/><\/figure>\n<p>Os arquivos <code>main.kt<\/code> e <code>MyTest.kt<\/code> s\u00e3o arquivos Kotlin normais, sem nada de especial. A parte interessante \u00e9 <code>module.yaml<\/code>, que \u00e9 o arquivo de manifesto do Amper. Para a estrutura de projeto acima, seria simplesmente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Produce a JVM application\u00a0\nproduct: jvm\/app<\/pre>\n<p>\u00c9 isso. As toolchains Kotlin e Java, a framework de teste e outras funcionalidades necess\u00e1rias s\u00e3o configuradas e disponibilizadas imediatamente. Voc\u00ea pode compil\u00e1-lo, execut\u00e1-lo, escrever e executar testes e muito mais. Para informa\u00e7\u00f5es mais detalhadas, veja o <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/examples\/jvm-with-tests\" target=\"_blank\" rel=\"noreferrer noopener\">exemplo completo<\/a>.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-404299\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/11\/ij-jvm-result-1.png\" alt=\"\" width=\"2472\" height=\"1718\" \/><\/figure>\n<p>Agora, vamos dar uma olhada num projeto Compose Multiplatform com aplicativos JVM para Android, iOS e desktop, com a seguinte estrutura de projeto no Fleet:<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-404277\" style=\"width: 460px;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/11\/fleet-kmp-structure.png\" alt=\"\" width=\"980\" height=\"1130\" \/><\/figure>\n<p>Observe como a pasta <code>src\/<\/code> cont\u00e9m c\u00f3digo Kotlin e Swift juntos. \u00c9 claro que tamb\u00e9m poderia ser Kotlin e Java.<\/p>\n<p>Outro aspecto a destacar \u00e9 o m\u00f3dulo compartilhado com o c\u00f3digo comum na pasta <code>src<\/code> e nas pastas de c\u00f3digo espec\u00edficas da plataforma <code>src@ios<\/code> e <code>src@android<\/code> (saiba mais sobre <a href=\"http:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md#project-layout\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md#project-layout\">layouts de projetos<\/a>).<\/p>\n<p>Este \u00e9 o conte\u00fado do arquivo de manifesto <code>ios-app\/module.yaml<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"wpcustom\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Produce an iOS application\nproduct: ios\/app\n\n# Depend on the shared library module:\u00a0\ndependencies:\n\u00a0\u00a0- ..\/shared\n\nsettings:\n\u00a0\u00a0# Enable Compose Multiplatform framework\n\u00a0\u00a0compose: enabled<\/pre>\n<p>Ele \u00e9 bem simples: define um aplicativo iOS com depend\u00eancia por um m\u00f3dulo compartilhado e habilita o framework Compose Multiplatform. Um exemplo mais interessante seria <code>shared\/module.yaml<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"wpcustom\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Produce a shared library for the JVM, Android, and iOS platforms:\nproduct:\n\u00a0\u00a0type: lib\n\u00a0\u00a0platforms: [jvm, android, iosArm64, iosSimulatorArm64, iosX64]\n\n# Shared Compose dependencies:\ndependencies:\n\u00a0\u00a0- org.jetbrains.compose.foundation:foundation:1.5.0-rc01: exported\n\u00a0\u00a0- org.jetbrains.compose.material3:material3:1.5.0-rc01: exported\n\n# Android-only dependencies\u00a0\u00a0\ndependencies@android:\n\u00a0\u00a0# integration compose with activities\n\u00a0\u00a0- androidx.activity:activity-compose:1.7.2: exported\n\u00a0\u00a0- androidx.appcompat:appcompat:1.6.1: exported\n\n# iOS-only dependencies with a dependency on a CocoaPod\n# \u00a0 note that CocoaPods dependencies are not yet implemented in the prototype\ndependencies@ios:\n\u00a0\u00a0- pod: 'FirebaseCore'\n\u00a0\u00a0\u00a0\u00a0version: '~&gt; 6.6'\n\nsettings:\n\u00a0\u00a0# Enable Kotlin serialization\n\u00a0\u00a0kotlin:\n\u00a0\u00a0\u00a0\u00a0serialization: json\n  \n\u00a0\u00a0# Enable Compose Multiplatform framework\n\u00a0\u00a0compose: enabled<\/pre>\n<p>Vale a pena mencionar algumas coisas. Primeiro, observe as se\u00e7\u00f5es <code>dependencies:<\/code> espec\u00edficas da plataforma com o qualificador <code>@<\/code>. <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md#platform-qualifier\" target=\"_blank\" rel=\"noreferrer noopener\">O qualificador de plataforma<\/a> pode ser usado tanto no manifesto quanto no layout do arquivo. Ele organiza o c\u00f3digo, as depend\u00eancias e as configura\u00e7\u00f5es de uma determinada plataforma.<br \/>Em segundo lugar, a se\u00e7\u00e3o dependencies: permite n\u00e3o s\u00f3 depend\u00eancias Kotlin e Maven, como potencialmente tamb\u00e9m <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md#native-dependencies\" target=\"_blank\" rel=\"noreferrer noopener\">gerenciadores de pacotes espec\u00edficos de plataforma<\/a>, como CocoaPods, Swift Package Manager e outros baseados no feedback que recebemos.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-404288\" style=\"object-fit: cover;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/11\/fleet-kmp-result.png\" alt=\"\" width=\"2756\" height=\"1744\" \/><\/figure>\n<p>Naturalmente, esses exemplos mostram apenas um conjunto limitado de recursos do Amper. Confira <a href=\"https:\/\/github.com\/JetBrains\/amper\" target=\"_blank\" rel=\"noreferrer noopener\">o projeto no GitHub<\/a> e veja a <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md\">documenta\u00e7\u00e3o<\/a>, o <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Tutorial.md\" target=\"_blank\" rel=\"noreferrer noopener\">tutorial<\/a> e os <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/examples\" target=\"_blank\" rel=\"noreferrer noopener\">projetos de exemplo<\/a> para obter mais informa\u00e7\u00f5es sobre o design e a funcionalidade do Amper.<\/p>\n<h3 class=\"wp-block-heading\">O que ele suporta atualmente<\/h3>\n<p>Atualmente, o Amper oferece suporte \u00e0 cria\u00e7\u00e3o de aplicativos direcionados \u00e0s plataformas JVM, Android, iOS, macOS e Linux. Voc\u00ea pode criar aplicativos baseados em Kotlin (plataforma \u00fanica e multiplataforma) e Java.<\/p>\n<p>J\u00e1 que Amper est\u00e1 usando o Gradle como back-end, o suporte para tarefas personalizadas, a capacidade de publicar bibliotecas no Maven, o suporte para CocoaPods e a capacidade de empacotar aplicativos de desktop s\u00e3o todos fornecidos por meio da configura\u00e7\u00e3o direta dos arquivos de build do Gradle.<\/p>\n<h2 class=\"wp-block-heading\">Como experimentar\u00a0<\/h2>\n<p>Existem v\u00e1rias maneiras de experimentar o Amper.<\/p>\n<ul>\n<li>No <a href=\"https:\/\/www.jetbrains.com\/idea\/nextversion\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> 2023.3 a partir do build 233.11799, para projetos JVM e Android.<\/li>\n<li>No <a href=\"https:\/\/www.jetbrains.com\/fleet\/download\" target=\"_blank\" rel=\"noopener\">Fleet<\/a> a partir do build 1.26.104, para projetos JVM, Android e Kotlin Multiplatform.<\/li>\n<li>Usando o Gradle para compilar projetos Amper a partir da CLI ou via CI\/CD.<\/li>\n<\/ul>\n<p>Confira as <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/main\/docs\/Setup.md\" target=\"_blank\" rel=\"noopener\">instru\u00e7\u00f5es de configura\u00e7\u00e3o<\/a>.<\/p>\n<p>Tamb\u00e9m preparamos algumas <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/examples\" target=\"_blank\" rel=\"noopener\">amostras<\/a>, bem como um <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Tutorial.md\" target=\"_blank\" rel=\"noopener\">tutorial<\/a>. Al\u00e9m disso, voc\u00ea poder\u00e1 encontrar <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o<\/a> mais detalhada que abrange diferentes aspectos do Amper.<\/p>\n<h3 class=\"wp-block-heading\">Precisamos do seu feedback<\/h3>\n<p>O projeto est\u00e1 em um est\u00e1gio em que precisamos desesperadamente do seu feedback. Adorar\u00edamos que voc\u00ea o experimentasse e nos dissesse se \u00e9 mais simples definir projetos ou quais casos de uso voc\u00ea precisa que ele possa incluir. Qualquer feedback que voc\u00ea possa ter ser\u00e1 mais que bem-vindo. Sinta-se \u00e0 vontade para enviar suas sugest\u00f5es e ideias usando nosso <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/AMPER\" target=\"_blank\" rel=\"noopener\">rastreador de issues<\/a>, como coment\u00e1rios nesta postagem ou participando do nosso <a href=\"https:\/\/kotlinlang.slack.com\/archives\/C062WG3A7T8\" target=\"_blank\" rel=\"noopener\">canal p\u00fablico no Slack<\/a> e postando coment\u00e1rios l\u00e1.<\/p>\n<h2 class=\"wp-block-heading\">Algumas palavras finais<\/h2>\n<p>Preparamos uma lista de <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/FAQ.md\" target=\"_blank\" rel=\"noopener\">perguntas frequentes<\/a>, que deve responder a algumas das perguntas que voc\u00ea possa ter. No entanto, quer\u00edamos abordar explicitamente alguns pontos.<\/p>\n<p>Em primeiro lugar, estamos totalmente comprometidos em oferecer suporte a tecnologias como Maven e Gradle no IntelliJ IDEA e no Fleet. Esse projeto n\u00e3o altera nosso compromisso com essas tecnologias, e continuamos a trabalhar em estreita colabora\u00e7\u00e3o com nossos parceiros nessa frente.<\/p>\n<p>Em segundo lugar, no est\u00e1gio atual, o Amper n\u00e3o \u00e9 uma ferramenta de build independente. Embora tenhamos muitas ideias sobre como gostar\u00edamos de levar o produto adiante, tamb\u00e9m precisamos validar as coisas em que estamos trabalhando antes de continuarmos a desenvolver o Amper.\u00a0<\/p>\n<p>Esperamos que outras d\u00favidas que voc\u00ea possa ter sejam respondidas nas <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/FAQ.md\" target=\"_blank\" rel=\"noopener\">perguntas frequentes<\/a>. Se n\u00e3o encontrar respostas, sinta-se \u00e0 vontade para perguntar nos coment\u00e1rios e faremos o poss\u00edvel para respond\u00ea-los.<\/p>\n\n\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":407308,"comment_status":"closed","ping_status":"closed","template":"","categories":[286],"tags":[],"cross-post-tag":[6910,6355],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/blog\/407301"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=407301"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/blog\/407301\/revisions"}],"predecessor-version":[{"id":407320,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/blog\/407301\/revisions\/407320"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/407308"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=407301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=407301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=407301"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=407301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}