{"id":97220,"date":"2020-11-23T15:54:58","date_gmt":"2020-11-23T14:54:58","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=97220"},"modified":"2020-11-23T15:54:58","modified_gmt":"2020-11-23T14:54:58","slug":"publication-de-kotlin-1-4-20","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2020\/11\/publication-de-kotlin-1-4-20\/","title":{"rendered":"Publication de Kotlin 1.4.20"},"content":{"rendered":"<p>Kotlin 1.4.20 est disponibles avec de nouvelles fonctionnalit\u00e9s exp\u00e9rimentales. La prise en compte des retours d&#8217;exp\u00e9rience de la communaut\u00e9 est l&#8217;un des principes fondamentaux de l&#8217;\u00e9quipe Kotlin et nous avons besoin de votre avis sur les prototypes de ces nouvelles fonctionnalit\u00e9s. <a href=\"#how-to-update\">Essayez-les<\/a> et faites vos commentaires dans <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (obtenez une invitation <a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up?_ga=2.134077326.1218289669.1605167163-154294388.1603171954\" target=\"_blank\" rel=\"noopener\">ici<\/a>) ou via <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/11\/Kotlin-1.4.20_Blog.png\" alt=\"Publication de Kotlin 1.4.20\" \/><\/p>\n<p>Voici ses principales nouveaut\u00e9s\u00a0:<\/p>\n<ul>\n<li>Prise en charge de nouvelles fonctionnalit\u00e9s de la JVM, comme la concat\u00e9nation de cha\u00eene via invokedynamic.<\/li>\n<li>Am\u00e9lioration des performances et de la gestion des exceptions pour les projets KMM.<\/li>\n<li>Extensions pour JDK Path\u00a0: <code>Path(&quot;dir&quot;) \/ &quot;file.txt&quot;<\/code>.<\/li>\n<\/ul>\n<p>Nous avons \u00e9galement apport\u00e9 de nombreux correctifs et am\u00e9liorations aux fonctionnalit\u00e9s existantes, y compris celles qui ont \u00e9t\u00e9 ajout\u00e9es dans la version 1.4.0. Donc si vous aviez rencontr\u00e9 des probl\u00e8mes avec l&#8217;une de ces fonctionnalit\u00e9s, c&#8217;est le moment de retenter l&#8217;exp\u00e9rience.<\/p>\n<p>Pour en savoir plus sur les fonctionnalit\u00e9s de Kotlin 1.4.20, lisez ce qui suit. Vous pouvez aussi consulter une pr\u00e9sentation de cette nouvelle version sur la page <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/whatsnew1420.html\" target=\"_blank\" rel=\"noopener\">Nouveaut\u00e9s de Kotlin 1.4.20<\/a> dans la documentation Kotlin. Vous trouverez la liste compl\u00e8te des modifications dans le <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/blob\/1.4.20\/ChangeLog.md\" target=\"_blank\" rel=\"noopener\">journal des modifications<\/a>.<\/p>\n<p>Comme toujours, nous tenons \u00e0 remercier les <a href=\"#external-contributors\">contributeurs externes<\/a> qui nous ont apport\u00e9 leur aide.<\/p>\n<p>Et maintenant plongeons-nous dans les d\u00e9tails\u00a0!<\/p>\n<h2>Kotlin\/JVM<\/h2>\n<p><a name=\"kotlin-jvm\"><\/a><\/p>\n<p>En ce qui concerne la JVM, nous avons ajout\u00e9 la nouvelle cible JVM 15 et nous sommes principalement concentr\u00e9s sur l&#8217;am\u00e9lioration des fonctionnalit\u00e9s existantes et des performances, ainsi que sur la correction des bugs.<\/p>\n<h3>Concat\u00e9nation de cha\u00eenes avec invokedynamic<\/h3>\n<p>Depuis Java 9, la concat\u00e9nation de cha\u00eenes sur la JVM se fait par <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/vm\/multiple-language-support.html#invokedynamic\" target=\"_blank\" rel=\"noopener\">l&#8217;appel d&#8217;une m\u00e9thode dynamique<\/a> (l&#8217;instruction <code>invokedynamic<\/code> dans le bytecode). Cela fonctionne plus rapidement, r\u00e9duit la consommation de m\u00e9moire par rapport \u00e0 la pr\u00e9c\u00e9dente impl\u00e9mentation et laisse de la place pour la r\u00e9alisation de futures optimisations sans modification du bytecode.<\/p>\n<p>Nous avons commenc\u00e9 \u00e0 impl\u00e9menter ce m\u00e9canisme dans Kotlin pour am\u00e9liorer les performances et il est \u00e0 pr\u00e9sent capable de compiler des concat\u00e9nations de cha\u00eenes dans des appels dynamiques sur des cibles JVM 9+.<\/p>\n<p>Cette fonctionnalit\u00e9 est actuellement exp\u00e9rimentale et s&#8217;applique aux cas suivants\u00a0:<\/p>\n<ul>\n<li><code>String.plus<\/code> dans l&#8217;op\u00e9rateur (<code>a + b<\/code>), formes explicites (<code>a.plus(b)<\/code>) et de r\u00e9f\u00e9rence (<code>(a::plus)(b)<\/code>).<\/li>\n<li><code>toString<\/code> pour les classes de donn\u00e9es et inline.<\/li>\n<li>Mod\u00e8les de cha\u00eenes, \u00e0 l&#8217;exception de ceux qui ont un seul argument non-constant (voir <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-42457\" target=\"_blank\" rel=\"noopener\">KT-42457<\/a>).<\/li>\n<\/ul>\n<p>Pour activer la concat\u00e9nation de cha\u00eene <code>invokedynamic<\/code>, ajoutez l&#8217;option de compilateur <code>-Xstring-concat<\/code> avec l&#8217;une des valeurs suivantes\u00a0:<\/p>\n<ul>\n<li><code>indy-with-constants<\/code> pour effectuer une concat\u00e9nation <code>invokedynamic<\/code> sur des cha\u00eenes avec <a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/lang\/invoke\/StringConcatFactory.html#makeConcatWithConstants-java.lang.invoke.MethodHandles.Lookup-java.lang.String-java.lang.invoke.MethodType-java.lang.String-java.lang.Object...-\" target=\"_blank\" rel=\"noopener\">StringConcatFactory.makeConcatWithConstants()<\/a> (il est pr\u00e9vu que cela soit l&#8217;option par d\u00e9faut pour les cibles JVM 9+ en 1.5).<\/li>\n<li><code>indy<\/code> pour lancer une concat\u00e9nation <code>invokedynamic<\/code> sur des cha\u00eenes avec <a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/lang\/invoke\/StringConcatFactory.html#makeConcat-java.lang.invoke.MethodHandles.Lookup-java.lang.String-java.lang.invoke.MethodType-\" target=\"_blank\" rel=\"noopener\">StringConcatFactory.makeConcat()<\/a>.<\/li>\n<li><code>inline<\/code> pour revenir \u00e0 la concat\u00e9nation classique via <code>StringBuilder.append()<\/code>.<\/li>\n<\/ul>\n<h2>Kotlin\/JS<\/h2>\n<p><a name=\"kotlin-js\"><\/a><\/p>\n<p>Kotlin\/JS poursuit son \u00e9volution rapide et cette version apporte de nombreuses am\u00e9liorations, parmi lesquelles de nouveaux mod\u00e8les pour son assistant de projet et un DSL am\u00e9lior\u00e9 pour renforcer le contr\u00f4le de la configuration de projet. Le nouveau compilateur IR est aussi dot\u00e9 d&#8217;un tout nouveau moyen de compiler des projets avec erreurs.<\/p>\n<h3>Modifications de Gradle DSL<\/h3>\n<p>Le DSL Kotlin\/JS Gradle a b\u00e9n\u00e9fici\u00e9 de plusieurs mises \u00e0 jour qui simplifient la configuration et la personnalisation du projet, notamment des ajustements de la configuration du pack web, des modifications du fichier package.json g\u00e9n\u00e9r\u00e9 automatiquement et un contr\u00f4le am\u00e9lior\u00e9 des d\u00e9pendances transitives.<\/p>\n<h4>Un point unique pour la configuration de webpack<\/h4>\n<p>Kotlin 1.4.20 inaugure un nouveau bloc de configuration pour la cible <code>browser<\/code> appel\u00e9 <code>commonWebpackConfig<\/code>. Dans ce bloc, vous pouvez ajuster des param\u00e8tres communs \u00e0 partir d&#8217;un seul et m\u00eame point au lieu de dupliquer les configurations pour <code>webpackTask<\/code>, <code>runTask<\/code> et <code>testTask<\/code>.<\/p>\n<p>Pour activer la prise en charge de CSS par d\u00e9faut pour l&#8217;ensemble des trois t\u00e2ches, il vous suffit d&#8217;inclure le snippet suivant dans le <code>build.gradle(.kts)<\/code> de votre projet\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> kotlin { browser { commonWebpackConfig { cssSupport.enabled = true } binaries.executable() } } <\/pre>\n<h4>Personnalisation de package.json depuis Gradle<\/h4>\n<p>Le fichier <code>package.json<\/code> d\u00e9finit g\u00e9n\u00e9ralement le comportement d&#8217;un projet JavaScript, en identifiant les scripts pouvant \u00eatre ex\u00e9cut\u00e9s, les d\u00e9pendances, etc. Il est g\u00e9n\u00e9r\u00e9 automatiquement pour les projets Kotlin\/JS pendant la p\u00e9riode de build. Le contenu du <code>package.json<\/code> variant d&#8217;un cas \u00e0 l&#8217;autre, nous avons re\u00e7u de nombreuses demandes pour faciliter la personnalisation de ce fichier.<\/p>\n<p>\u00c0 compter de Kotlin 1.4.20, vous pouvez ajouter des entr\u00e9es au fichier du projet <code>package.json<\/code> \u00e0 partir du script de build Gradle. Pour ajouter des champs personnalis\u00e9s \u00e0 votre <code>package.json<\/code>, utilisez la fonction <code>customField<\/code> dans le bloc <code>packageJson<\/code> de la compilation\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> kotlin { js(BOTH) { compilations[&quot;main&quot;].packageJson { customField(&quot;bonjour&quot;, mapOf(&quot;un&quot; to 1, &quot;deux&quot; to 2)) } } } <\/pre>\n<p>Lorsque vous g\u00e9n\u00e9rez le projet, cela ajoute le bloc suivant au fichier de configuration <code>build\/js\/packages\/projectName\/package.json<\/code>\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">&quot;hello&quot;: {\n  &quot;one&quot;: 1,\n  &quot;two&quot;: 2\n}<\/pre>\n<p>Que vous souhaitiez ajouter un champ de scripts \u00e0 la configuration pour faciliter l&#8217;ex\u00e9cution de votre projet \u00e0 partir de la ligne de commande ou inclure des informations pour d&#8217;autres outils de post-traitement, nous esp\u00e9rons que vous appr\u00e9cierez cette nouvelle fa\u00e7on de sp\u00e9cifier des champs personnalis\u00e9s.<\/p>\n<h4>R\u00e9solutions des d\u00e9pendance yarn s\u00e9lective (exp\u00e9rimental)<\/h4>\n<p>Lorsque vous incluez des d\u00e9pendances de npm, il y a des moments o\u00f9 vous voulez avoir un contr\u00f4le plus pr\u00e9cis sur leurs d\u00e9pendances (<em>d\u00e9pendances transitives<\/em>). Il peut y avoir de nombreuses raisons \u00e0 cela. Vous pouvez par exemple vouloir appliquer une mise \u00e0 niveau importante \u00e0 l&#8217;une des d\u00e9pendances d&#8217;une biblioth\u00e8que que vous utilisez. Ou vouloir annuler l&#8217;application de la mise \u00e0 jour d&#8217;une d\u00e9pendance transitive qui affecte votre application. Les <a href=\"https:\/\/classic.yarnpkg.com\/en\/docs\/selective-version-resolutions\/\" target=\"_blank\" rel=\"noopener\">r\u00e9solutions des d\u00e9pendances s\u00e9lectives<\/a> de Yarn vous permettent de remplacer les d\u00e9pendances sp\u00e9cifi\u00e9es par l&#8217;auteur d&#8217;origine afin de pouvoir continuer \u00e0 d\u00e9velopper.<\/p>\n<p>Kotlin 1.4.20 propose un moyen pr\u00e9liminaire (exp\u00e9rimental) de configurer cette fonctionnalit\u00e9 \u00e0 partir du script de build Gradle d&#8217;un projet. Nous travaillons encore \u00e0 rendre l&#8217;int\u00e9gration API avec le reste des options Kotlin\/JS harmonieuse, mais vous pouvez d&#8217;ores et d\u00e9j\u00e0 utiliser la fonctionnalit\u00e9 via <code>YarnRootExtension<\/code> dans le <code>YarnPlugin<\/code>. Pour influencer la version r\u00e9solue d&#8217;un package pour votre projet, utilisez la fonction <code>resolution<\/code>. Dans ses arguments, sp\u00e9cifiez le s\u00e9lecteur de nom de paquet (comme sp\u00e9cifi\u00e9 par <a href=\"https:\/\/classic.yarnpkg.com\/en\/docs\/selective-version-resolutions\/\" target=\"_blank\" rel=\"noopener\">Yarn<\/a>) et la version souhait\u00e9e.<\/p>\n<p>Voici un exemple de ce \u00e0 quoi la configuration pour la r\u00e9solution s\u00e9lective des d\u00e9pendances dans votre fichier <code>build.gradle.kts<\/code> pourrait ressembler\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> rootProject.plugins.withType(YarnPlugin::class.java) { rootProject.the&lt;YarnRootExtension&gt;().apply { resolution(&quot;react&quot;, &quot;16.0.0&quot;) resolution(&quot;processor\/decamelize&quot;, &quot;3.0.0&quot;) } } <\/pre>\n<p>Ici, <em>toutes<\/em> vos d\u00e9pendances npm qui n\u00e9cessitent <code>react<\/code> recevront la version <code>16.0.0<\/code>, et <code>processor<\/code> recevra sa d\u00e9pendance <code>decamelize<\/code> en tant que version <code>3.0.0<\/code>. De plus, vous pouvez passer des appels <code>include<\/code> et <code>exclude<\/code> au bloc <code>resolution<\/code>, ce qui permet de sp\u00e9cifier des contraintes concernant les versions acceptables.<\/p>\n<h4>D\u00e9sactivation des espaces de travail granulaires (exp\u00e9rimental)<\/h4>\n<p>Pour acc\u00e9l\u00e9rer les temps de build, le plugin Kotlin\/JS Gradle installe uniquement les d\u00e9pendances requises pour une t\u00e2che Gradle particuli\u00e8re. Par exemple, le paquet <code>webpack-dev-server<\/code> n&#8217;est install\u00e9 que lorsque vous ex\u00e9cutez l&#8217;une des t\u00e2ches <code>*Run<\/code> et non lorsque vous ex\u00e9cutez la t\u00e2che <code>assemble<\/code>. Bien que cela permette d&#8217;\u00e9viter des t\u00e9l\u00e9chargements inutiles, des probl\u00e8mes peuvent survenir lors de l&#8217;ex\u00e9cution de plusieurs processus Gradle en parall\u00e8le. Lorsque les exigences de d\u00e9pendance ne co\u00efncident pas, les deux installations depaquets npm peuvent causer des erreurs.<\/p>\n<p>Pour r\u00e9soudre ce probl\u00e8me, Kotlin 1.4.20 inclut une nouvelle option (exp\u00e9rimentale) permettant de d\u00e9sactiver ce que l&#8217;on appelle les <em>espaces de travail granulaires<\/em>. \u00c0 l&#8217;instar de la prise en charge exp\u00e9rimentale des r\u00e9solutions de d\u00e9pendances s\u00e9lectives, cette fonctionnalit\u00e9 est actuellement accessible via <code>YarnRootExtension<\/code>, mais elle sera probablement int\u00e9gr\u00e9e plus \u00e9troitement avec le reste du DSL Kotlin\/JS Gradle. Pour l&#8217;utiliser, ajoutez le snippet suivant \u00e0 votre fichier <code>build.gradle.kts<\/code>\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> rootProject.plugins.withType(YarnPlugin::class.java) { rootProject.the&lt;YarnRootExtension&gt;().disableGranularWorkspaces() } <\/pre>\n<p>Avec cette configuration, le plugin Kotlin\/JS Gradle installera toutes les d\u00e9pendances npm pouvant \u00eatre utilis\u00e9es par votre projet, y compris celles utilis\u00e9es par les t\u00e2ches qui ne sont pas en cours d&#8217;ex\u00e9cution. Cela signifie que la premi\u00e8re build de Gradle peut prendre un peu plus de temps, mais que les d\u00e9pendances t\u00e9l\u00e9charg\u00e9es seront \u00e0 jour pour toutes les t\u00e2ches que vous ex\u00e9cuterez. De cette fa\u00e7on, vous pouvez \u00e9viter les conflits lors de l&#8217;ex\u00e9cution en parall\u00e8le de plusieurs processus Gradle.<\/p>\n<h3>Nouveaux templates de l&#8217;assistant<\/h3>\n<p>Pour faciliter la personnalisation de votre projet lors de sa cr\u00e9ation, l&#8217;assistant de projet pour Kotlin est fourni avec de nouveaux templates ajustables pour les applications Kotlin\/JS. Il s&#8217;agit de templates pour le navigateur et pour les environnements d&#8217;ex\u00e9cution Node.js. Ils constituent un bon point de d\u00e9part pour votre projet et permettent d&#8217;ajuster la configuration initiale. Cela s&#8217;applique \u00e0 des param\u00e8tres tels que l&#8217;activation du nouveau compilateur IR ou la configuration de la prise en charge de biblioth\u00e8ques suppl\u00e9mentaires.<\/p>\n<p>Avec Kotlin 1.4.20, trois templates sont disponibles\u00a0:<\/p>\n<ul>\n<li><strong>Browser Application<\/strong> vous permet de configurer un projet Kotlin\/JS Gradle basique qui s&#8217;ex\u00e9cute dans le navigateur.<\/li>\n<li><strong>React Application<\/strong> contient tout ce dont vous avez besoin pour commencer \u00e0 cr\u00e9er une application React avec les <a href=\"https:\/\/github.com\/JetBrains\/kotlin-wrappers\" target=\"_blank\" rel=\"noopener\">kotlin-wrappers<\/a> appropri\u00e9s. Ce template fournit des options pour permettre des int\u00e9grations pour les feuilles de style, composants de navigation et conteneurs d&#8217;\u00e9tat.<\/li>\n<li><strong>Node.js Application<\/strong> pr\u00e9configure votre projet pour une ex\u00e9cution dans un environnement Node.js. Ce template permet d&#8217;inclure directement le paquet exp\u00e9rimental <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-nodejs\" target=\"_blank\" rel=\"noopener\">kotlinx-nodejs<\/a>, que nous avons pr\u00e9sent\u00e9 dans un <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-rc-released\/#kotlin-js-node\">article pr\u00e9c\u00e9dent<\/a>.<\/li>\n<\/ul>\n<h3>Ignorer les erreurs de compilation (exp\u00e9rimental)<\/h3>\n<p>Avec Kotlin 1.4.20, nous sommes \u00e9galement ravis de pr\u00e9senter une toute nouvelle fonctionnalit\u00e9 disponible dans le <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/js-ir-compiler.html\" target=\"_blank\" rel=\"noopener\">compilateur IR Kotlin\/JS<\/a>\u00a0: <em>ignoring compilation errors<\/em>. Cette fonctionnalit\u00e9 vous permet d&#8217;essayer votre application m\u00eame si elle est dans un \u00e9tat o\u00f9 elle ne se compilerait pas normalement. Par exemple, quand vous effectuez une refactorisation complexe ou travaillez sur une partie du syst\u00e8me qui n&#8217;est absolument pas li\u00e9e \u00e0 une erreur de compilation. Avec ce nouveau mode de compilation, le compilateur ignore tout code erron\u00e9 et le remplace par des exceptions d&#8217;ex\u00e9cution au lieu de refuser de compiler.<\/p>\n<p>Kotlin 1.4.20 propose deux principes de tol\u00e9rance pour ignorer les erreurs de compilation dans votre code\u00a0:<\/p>\n<ul>\n<li>En mode <code>SEMANTIC<\/code>, le compilateur acceptera du code qui est correct du point de vue de la syntaxe mais qui n&#8217;a pas de sens s\u00e9mantiquement parlant. Un exemple de cela serait une instruction contenant une incompatibilit\u00e9 de type (comme <code>val x: String = 3<\/code>).<\/li>\n<li>En mode <code>SYNTAX<\/code>, le compilateur acceptera absolument n&#8217;importe quel code, m\u00eame s&#8217;il contient des erreurs de syntaxe. Ind\u00e9pendamment de ce que vous \u00e9crivez, le compilateur essaiera toujours de g\u00e9n\u00e9rer un ex\u00e9cutable fonctionnel.<\/li>\n<\/ul>\n<p>Comme il s&#8217;agit d&#8217;une fonctionnalit\u00e9 exp\u00e9rimentale, ignorer les erreurs de compilation requiert un opt-in via une option du compilateur. Elle n&#8217;est disponible que pour le compilateur IR Kotlin\/JS. Pour l&#8217;activer, ajoutez le snippet suivant \u00e0 votre fichier <code>build.gradle.kts<\/code>\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> kotlin { js(IR) { compilations.all { compileKotlinTask.kotlinOptions.freeCompilerArgs += listOf(&quot;-Xerror-tolerance-policy=SYNTAX&quot;) } } } <\/pre>\n<p>Nous esp\u00e9rons que la compilation avec erreurs vous aidera \u00e0 resserrer les boucles de r\u00e9troaction et \u00e0 acc\u00e9l\u00e9rer vos it\u00e9rations pour les projets Kotlin\/JS. Faites-nous part de vos commentaires et des probl\u00e8mes que vous aurez rencontr\u00e9s en essayant cette fonctionnalit\u00e9 dans <a href=\"http:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p>Nous continuons \u00e0 affiner l&#8217;impl\u00e9mentation de cette fonctionnalit\u00e9 et proposerons une int\u00e9gration plus approfondie avec le DSL Kotlin\/JS Gradle et ses t\u00e2ches ult\u00e9rieurement.<\/p>\n<h2>Kotlin\/Native<\/h2>\n<p><a name=\"kotlin-native\"><\/a><\/p>\n<p>La performance reste l&#8217;une des principales priorit\u00e9s de Kotlin\/Native dans la version 1.4.20. Parmi les fonctionnalit\u00e9s essentielles \u00e0 cet \u00e9gard figure le prototype du nouveau m\u00e9canisme d&#8217;analyse d&#8217;\u00e9chappement, que nous pr\u00e9voyons de peaufiner et d&#8217;am\u00e9liorer dans les prochaines versions. Nous avons \u00e9galement apport\u00e9 d&#8217;autres am\u00e9liorations de la performance, avec les v\u00e9rifications de plages plus rapides notamment (<code>in<\/code>).<\/p>\n<p>Autre aspect des am\u00e9liorations apport\u00e9es au d\u00e9veloppement Kotlin\/Native dans la version 1.4.20\u00a0: la correction de bugs. Nous avons r\u00e9solu un certain nombre de probl\u00e8mes, y compris ceux trouv\u00e9s dans les nouvelles fonctionnalit\u00e9s de la version 1.4, comme le <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-share-on-platforms.html#share-code-on-similar-platforms\" target=\"_blank\" rel=\"noopener\">m\u00e9canisme de partage de code<\/a>. Un ensemble d&#8217;am\u00e9liorations corrige les incoh\u00e9rences de comportement entre Kotlin\/Native et Kotlin\/JVM dans des cas particuliers, tels que l&#8217;initialisation de propri\u00e9t\u00e9 ou l&#8217;application d&#8217;<code>equals<\/code> et de <code>hashCode<\/code> \u00e0 des r\u00e9f\u00e9rences fonctionnelles.<\/p>\n<p>Enfin, nous avons \u00e9tendu les capacit\u00e9s d&#8217;interop\u00e9rabilit\u00e9 avec Objective-C gr\u00e2ce \u00e0 <a href=\"#handling-objective-c-exceptions\">une option permettant d&#8217;encapsuler les exceptions Objective-C dans des exceptions Kotlin<\/a> afin de les g\u00e9rer dans le code Kotlin.<\/p>\n<h3>Analyse d&#8217;\u00e9chappement<\/h3>\n<p>L&#8217;<em>analyse d&#8217;\u00e9chappement<\/em> est une technique utilis\u00e9e par le compilateur pour d\u00e9cider si un objet peut \u00eatre allou\u00e9 sur la pile ou doit \u00ab\u00a0s&#8217;\u00e9chapper\u00a0\u00bb vers le tas. L&#8217;allocation sur la pile est beaucoup plus rapide et ne n\u00e9cessite pas de passage ult\u00e9rieur du ramasse-miettes.<\/p>\n<p>Bien que Kotlin\/Native dispose d\u00e9j\u00e0 d&#8217;une analyse d&#8217;\u00e9chappement locale, nous ajoutons un prototype d&#8217;impl\u00e9mentation d&#8217;une nouvelle analyse d&#8217;\u00e9chappement globale plus efficace. Cette configuration s&#8217;effectue dans une phase de compilation s\u00e9par\u00e9e pour les builds de version finale (avec l&#8217;option de compilateur <code>-opt<\/code>).<\/p>\n<p>Ce prototype a d\u00e9j\u00e0 donn\u00e9 des r\u00e9sultats prometteurs et nous avons notamment constat\u00e9 une augmentation moyenne des performances de 10%. Nous recherchons des moyens d&#8217;optimiser l&#8217;algorithme afin qu&#8217;il trouve davantage d&#8217;objets pour l&#8217;allocation de pile et acc\u00e9l\u00e8re encore plus le programme.<\/p>\n<p>Pendant que nous continuons \u00e0 travailler sur le prototype, vous pouvez nous apporter une aide consid\u00e9rable en l&#8217;essayant et en partageant les r\u00e9sultats obtenus sur vos projets r\u00e9els.<\/p>\n<p>Si vous souhaitez d\u00e9sactiver la phase d&#8217;analyse d&#8217;\u00e9chappement, utilisez l&#8217;option du compilateur <code>-Xdisable-phases=EscapeAnalysis<\/code>.<\/p>\n<h3>Adh\u00e9rer \u00e0 l&#8217;encaspulation des exceptions Objective-C<\/h3>\n<p>Le but des exceptions dans Objective-C est dans Kotlin est assez diff\u00e9rent. Leur utilisation est normalement limit\u00e9e \u00e0 la recherche d&#8217;erreurs pendant le d\u00e9veloppement. Mais techniquement, les biblioth\u00e8ques Objective-C peuvent &quot;lever&quot; des exceptions lors de l&#8217;ex\u00e9cution. Auparavant, aucune option ne permettait de g\u00e9rer de telles exceptions dans Kotlin\/Native et une <code>NSException<\/code> lanc\u00e9e depuis une biblioth\u00e8que provoquait l&#8217;arr\u00eat de tout le programme Kotlin\/Native.<\/p>\n<p>Dans la version 1.4.20, nous avons ajout\u00e9 une option pour g\u00e9rer ces exceptions au moment de l&#8217;ex\u00e9cution afin d&#8217;\u00e9viter les pannes de programme. Vous pouvez choisir d&#8217;encapsuler les <code>NSException<\/code>[s] dans les <code>ForeignException<\/code>[s] de Kotlin et de les g\u00e9rer ult\u00e9rieurement dans le code Kotlin. Une telle <code>ForeignException<\/code> contient la r\u00e9f\u00e9rence \u00e0 la <code>NSException<\/code> d&#8217;origine, ce qui vous permet d&#8217;obtenir des informations sur la cause premi\u00e8re.<\/p>\n<p>Pour permettre l&#8217;encapsulation des exceptions Objective-C, sp\u00e9cifiez l&#8217;option <code>-Xforeign-exception-mode objc-wrap<\/code> dans l&#8217;appel <code>cinterop<\/code> ou ajoutez la propri\u00e9t\u00e9 <code>foreignExceptionMode = objc-wrap<\/code> au fichier <code>.def<\/code>. Si vous utilisez <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/native\/cocoapods.html\" target=\"_blank\" rel=\"noopener\">l&#8217;int\u00e9gration CocoaPods<\/a>, sp\u00e9cifiez l&#8217;option dans le bloc de script de build <code>pod {}<\/code> d&#8217;une d\u00e9pendance, comme ceci\u00a0:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> pod(&quot;foo&quot;) { extraOpts = listOf(&quot;-Xforeign-exception-mode&quot;, &quot;objc-wrap&quot;) } <\/pre>\n<p>Le comportement par d\u00e9faut reste identique\u00a0: le programme se termine lorsqu&#8217;une exception est lev\u00e9e \u00e0 partir du code Objective-C.<\/p>\n<h3>Am\u00e9liorations du plugin CocoaPods<\/h3>\n<h4>Am\u00e9lioration de l&#8217;ex\u00e9cution des t\u00e2ches<\/h4>\n<p>Dans cette version, nous avons consid\u00e9rablement am\u00e9lior\u00e9 le flux d&#8217;ex\u00e9cution des t\u00e2ches. Par exemple, si vous ajoutez une nouvelle d\u00e9pendance CocoaPods, les d\u00e9pendances existantes ne sont pas reconstruites. L&#8217;ajout d&#8217;une cible suppl\u00e9mentaire ne d\u00e9clenche pas non plus la reconstruction des d\u00e9pendances pour les cibles existantes.<\/p>\n<h4>DSL \u00e9tendu<\/h4>\n<p>Dans la version 1.4.20, nous avons \u00e9tendu le DSL pour ajouter des d\u00e9pendances <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/native\/cocoapods.html\" target=\"_blank\" rel=\"noopener\">CocoaPods<\/a> \u00e0 votre projet Kotlin.<\/p>\n<p>En plus des Pods locaux et des Pods du r\u00e9f\u00e9rentiel CocoaPods, vous pouvez ajouter des d\u00e9pendances aux types de biblioth\u00e8ques suivants\u00a0:<\/p>\n<ul>\n<li>Une biblioth\u00e8que d&#8217;un r\u00e9f\u00e9rentiel de sp\u00e9cifications personnalis\u00e9es.<\/li>\n<li>Une biblioth\u00e8que distante d&#8217;un r\u00e9f\u00e9rentiel Git.<\/li>\n<li>Une biblioth\u00e8que d&#8217;archive (\u00e9galement disponible par adresse HTTP arbitraire).<\/li>\n<li>Une biblioth\u00e8que statique.<\/li>\n<li>Une biblioth\u00e8que avec des options cinterop personnalis\u00e9es.<\/li>\n<\/ul>\n<p>La syntaxe DSL pr\u00e9c\u00e9dente est toujours prise en charge.<\/p>\n<p>Examinons quelques-unes des modifications du DSL dans les exemples suivants\u00a0:<\/p>\n<ul>\n<li>\n<p><strong>Une d\u00e9pendance \u00e0 une biblioth\u00e8que distante d&#8217;un r\u00e9f\u00e9rentiel Git<\/strong>. Vous pouvez sp\u00e9cifier une balise, un commit ou une branche en utilisant les mots cl\u00e9s correspondants, par exemple\u00a0: <\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> pod(&quot;JSONModel&quot;) { source = git(&quot;https:\/\/github.com\/jsonmodel\/jsonmodel.git&quot;) { branch = &quot;key-mapper-class&quot; } } <\/pre>\n<\/p>\n<p>Vous pouvez \u00e9galement combiner ces mots-cl\u00e9s pour obtenir la version requise d&#8217;un Pod.<\/p>\n<\/li>\n<li>\n<p><strong>Une d\u00e9pendance \u00e0 une biblioth\u00e8que d&#8217;un r\u00e9f\u00e9rentiel de sp\u00e9cifications personnalis\u00e9es<\/strong>. Utilisez le param\u00e8tre sp\u00e9cial <code>specRepos<\/code> pour cela\u00a0: <\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> specRepos { url(&quot;https:\/\/github.com\/Kotlin\/kotlin-cocoapods-spec.git&quot;) } pod(&quot;exemple&quot;) <\/pre>\n<\/p>\n<\/li>\n<\/ul>\n<p>Vous trouverez d&#8217;autres exemples dans <a href=\"https:\/\/github.com\/Kotlin\/kotlin-with-cocoapods-sample\" target=\"_blank\" rel=\"noopener\">l&#8217;extrait de code Kotlin avec CocoaPods<\/a>.<\/p>\n<h4>Mise \u00e0 jour de l&#8217;int\u00e9gration avec Xcode<\/h4>\n<p>Pour fonctionner correctement avec Xcode, Kotlin n\u00e9cessite quelques modifications du Podfile\u00a0:<\/p>\n<ul>\n<li>\n<p>Si votre Kotlin Pod a des d\u00e9pendances de pod Git, HTTP ou specRepo, vous devez \u00e9galement les sp\u00e9cifier dans le Podfile. Par exemple, si vous ajoutez une d\u00e9pendance \u00e0 <code>AFNetworking<\/code> \u00e0 partir du r\u00e9f\u00e9rentiel CocoaPods, d\u00e9clarez-la \u00e9galement dans le Podfile\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">pod &#039;AFNetworking&#039;<\/pre>\n<\/li>\n<li>\n<p>Lorsque vous ajoutez une biblioth\u00e8que \u00e0 partir de la sp\u00e9cification personnalis\u00e9e, vous devez \u00e9galement sp\u00e9cifier l&#8217;emplacement (<a href=\"https:\/\/guides.cocoapods.org\/syntax\/podfile.html#source\" target=\"_blank\" rel=\"noopener\">location<\/a>) des sp\u00e9cifications au d\u00e9but de votre Podfile\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">source &#039;https:\/\/github.com\/Kotlin\/kotlin-cocoapods-spec.git&#039;\n\ntarget &#039;kotlin-cocoapods-xcproj&#039; do\n  \/\/ ... other Pods ...\n  pod &#039;example&#039;\nend<\/pre>\n<\/li>\n<\/ul>\n<p>Des descriptions d\u00e9taill\u00e9es des erreurs d&#8217;int\u00e9gration figurent maintenant dans IntelliJ IDEA, donc pour tout probl\u00e8me avec votre Podfile, vous obtiendrez imm\u00e9diatement des informations sur sa r\u00e9solution.<\/p>\n<p>Jetez un \u0153il \u00e0 la branche <code>withXcproject<\/code> de l&#8217;exemple de code <a href=\"https:\/\/github.com\/Kotlin\/kotlin-with-cocoapods-sample\" target=\"_blank\" rel=\"noopener\">Kotlin avec CocoaPods<\/a>. Vous y trouverez <a href=\"#updated-integration-with-xcode\">un exemple d&#8217;int\u00e9gration Xcode<\/a> avec le projet Xcode existant nomm\u00e9 <code>kotlin-cocoapods-xcproj<\/code>.<\/p>\n<h3>Prise en charge des biblioth\u00e8ques Xcode 12<\/h3>\n<p>Nous avons ajout\u00e9 la prise en charge des nouvelles biblioth\u00e8ques livr\u00e9es avec Xcode 12. N&#8217;h\u00e9sitez pas \u00e0 les utiliser dans votre code Kotlin\u00a0!<\/p>\n<h2>Mise \u00e0 jour de la structure des publications de la biblioth\u00e8que multiplateforme<\/h2>\n<p><a name=\"updated-structure-of-multiplatform-library-publications\"><\/a><\/p>\n<p>Avant Kotlin 1.4.20, les <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-publish-lib.html\" target=\"_blank\" rel=\"noopener\">publications de biblioth\u00e8ques multiplateformes<\/a> incluaient les publications sp\u00e9cifiques \u00e0 la plateforme et une publication de m\u00e9tadonn\u00e9es. Toutefois, la publication des m\u00e9tadonn\u00e9es avait \u00e9t\u00e9 faite en interne mais jamais \u00e9t\u00e9 utilis\u00e9e dans des projets externes.<\/p>\n<p>\u00c0 partir de Kotlin 1.4.20, il n&#8217;y a plus de publication de m\u00e9tadonn\u00e9es s\u00e9par\u00e9e. Les artefacts de m\u00e9tadonn\u00e9es sont d\u00e9sormais inclus dans la publication racine, qui repr\u00e9sente la biblioth\u00e8que enti\u00e8re et est automatiquement r\u00e9solue en artefacts sp\u00e9cifiques \u00e0 la plateforme appropri\u00e9s lorsqu&#8217;elle est ajout\u00e9e en tant que d\u00e9pendance \u00e0 l&#8217;ensemble de sources commun.<\/p>\n<p>N&#8217;ajoutez pas un artefact vide sans classificateur au module racine de votre biblioth\u00e8que pour r\u00e9pondre aux exigences des r\u00e9f\u00e9rentiels tels que Maven Central, car cela entra\u00eenerait un conflit avec les artefacts de m\u00e9tadonn\u00e9es qui sont d\u00e9sormais inclus dans ce module.<\/p>\n<h3>Compatibilit\u00e9 avec les biblioth\u00e8ques publi\u00e9es en 1.4.20<\/h3>\n<p>Si vous avez activ\u00e9 la <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-share-on-platforms.html#share-code-on-similar-platforms\" target=\"_blank\" rel=\"noopener\">prise en charge des structures de projets hi\u00e9rarchiques<\/a> et que vous souhaitez utiliser une biblioth\u00e8que multiplateforme publi\u00e9e avec cette prise en charge dans Kotlin 1.4.20 ou une version sup\u00e9rieure, vous devrez \u00e9galement mettre \u00e0 niveau Kotlin vers la version 1.4.20 ou une version sup\u00e9rieure dans votre projet.<\/p>\n<p>Si vous cr\u00e9ez des biblioth\u00e8ques et que vous publiez votre biblioth\u00e8que multiplateforme dans Kotlin 1.4.20+ avec la prise en charge des structures de projets hi\u00e9rarchiques, n&#8217;oubliez pas que les utilisateurs disposant de versions ant\u00e9rieures de Kotlin et ayant activ\u00e9 la prise en charge des structures de projets hi\u00e9rarchiques ne pourront pas utiliser votre biblioth\u00e8que. Ils devront mettre \u00e0 niveau Kotlin vers la version 1.4.20 ou une version sup\u00e9rieure.<\/p>\n<p>Toutefois, si vous ou les utilisateurs de votre biblioth\u00e8que n&#8217;activez pas la prise en charge des structures de projets hi\u00e9rarchiques, toute personne disposant d&#8217;une version ant\u00e9rieure de Kotlin pourra utiliser votre biblioth\u00e8que.<\/p>\n<p>Apprenez-en plus sur la <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-publish-lib.html\" target=\"_blank\" rel=\"noopener\">publication d&#8217;une biblioth\u00e8que multiplateforme<\/a>.<\/p>\n<h2>Modifications de la biblioth\u00e8que standard<\/h2>\n<p><a name=\"standard-library-changes\"><\/a><\/p>\n<h3>Extensions pour java.nio.file.Path<\/h3>\n<p>A partir de la version 1.4.20, la biblioth\u00e8que standard propose des extensions exp\u00e9rimentales pour <code>java.nio.file.Path<\/code>.<\/p>\n<p>Travailler avec l&#8217;API de fichier de la JVM moderne d&#8217;une mani\u00e8re &quot;Kotlin idiomatique&quot; revient d\u00e9sormais \u00e0 travailler avec les extensions <code>java.io.File<\/code> du paquet <code>kotlin.io<\/code>. Il n&#8217;est plus n\u00e9cessaire d&#8217;appeler des m\u00e9thodes statiques de <code>Files<\/code> car la plupart d&#8217;entre elles sont d\u00e9sormais disponibles en tant qu&#8217;extensions sur le type <code>Path<\/code>.<\/p>\n<p>Les extensions se trouvent dans le paquet <code>kotlin.io.path<\/code>. <code>Path<\/code> \u00e9tant disponible dans le JDK 7 et versions sup\u00e9rieures, les extensions sont plac\u00e9es dans le module <code>kotlin-stdlib-jdk7<\/code>. Pour les utiliser, vous devez activer l&#8217;annotation exp\u00e9rimentale <code>ExperimentalPathApi<\/code>.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> \/\/ construire le chemin d&#039;acc\u00e8s avec l&#039;op\u00e9rateur div (\/) val baseDir = Path(&quot;\/base&quot;) val subDir = baseDir \/ &quot;subdirectory&quot;\r\n\r\n\/\/ lister les fichiers dans un r\u00e9pertoire val kotlinFiles: List&lt;Path&gt; = Path(&quot;\/home\/user&quot;).listDirectoryEntries(&quot;*.kt&quot;) ``` <\/pre>\n<p>Nous tenons \u00e0 remercier tout particuli\u00e8rement notre contributeur <a href=\"https:\/\/github.com\/ajalt\" target=\"_blank\" rel=\"noopener\">AJ Alt<\/a> d&#8217;avoir fait la requ\u00eate pull initiale avec ces extensions.<\/p>\n<h3>Am\u00e9lioration des performances de la fonction <code>String.replace<\/code><\/h3>\n<p>Nous sommes toujours ravis lorsque la communaut\u00e9 Kotlin sugg\u00e8re des am\u00e9liorations, et ce fut le cas sur ce point. Dans cette version, nous avons modifi\u00e9 l&#8217;impl\u00e9mentation de la fonction <code>String.replace()<\/code>.<\/p>\n<p>La variante sensible \u00e0 la casse utilise une boucle de remplacement manuelle bas\u00e9e sur <code>indexOf<\/code>, tandis que la variante insensible \u00e0 la casse utilise une correspondance d&#8217;expression r\u00e9guli\u00e8re.<\/p>\n<p>Cette am\u00e9lioration acc\u00e9l\u00e8re l&#8217;ex\u00e9cution de la fonction dans certains cas.<\/p>\n<h2>Abandon des extensions Kotlin Android<\/h2>\n<p><a name=\"deprecation-of-kotlin-android-extensions\"><\/a><\/p>\n<p>Depuis leur cr\u00e9ation, les extensions Kotlin Android ont jou\u00e9 un r\u00f4le majeur dans la popularit\u00e9 croissante de Kotlin au sein de l&#8217;\u00e9cosyst\u00e8me Android. Avec ces extensions, nous avons fourni aux d\u00e9veloppeurs des outils pratiques et efficaces pour r\u00e9duire le code standard\u00a0:<\/p>\n<ul>\n<li>Vues synth\u00e9tiques (<code>kotlinx.android.synthetics<\/code>) pour l&#8217;interaction avec l&#8217;interface utilisateur.<\/li>\n<li>G\u00e9n\u00e9rateur d&#8217;impl\u00e9mentation <code>parcelable<\/code> (<code>@Parcelize<\/code>) pour faire passer des objets en tant que <code>Parcel<\/code>[s].<\/li>\n<\/ul>\n<p>Au d\u00e9part, nous avons pens\u00e9 ajouter d&#8217;autres composants \u00e0 <code>kotlin-android-extensions<\/code>. Mais nous ne l&#8217;avons pas fait et nous avons m\u00eame re\u00e7u des <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-25280\" target=\"_blank\" rel=\"noopener\">demandes d&#8217;utilisateurs<\/a> pour diviser le plugin en parties ind\u00e9pendantes.<\/p>\n<p>D&#8217;un autre c\u00f4t\u00e9, l&#8217;\u00e9cosyst\u00e8me Android est en constante \u00e9volution et les d\u00e9veloppeurs disposent de nouveaux outils qui simplifient leur travail. Certaines lacunes que comblaient les extensions Kotlin Android ont \u00e9t\u00e9 combl\u00e9es par les m\u00e9canismes natifs de Google. Par exemple, en ce qui concerne la syntaxe concise pour l&#8217;interaction avec l&#8217;interface utilisateur, il existe maintenant Android Jetpack, qui comporte une <a href=\"https:\/\/developer.android.com\/topic\/libraries\/view-binding\" target=\"_blank\" rel=\"noopener\">liaison de vue<\/a> qui remplace <code>findViewById<\/code>, tout comme les synth\u00e9tiques Kotlin.<\/p>\n<p>Compte tenu de ces deux facteurs, nous avons d\u00e9cid\u00e9 de remplacer les synth\u00e9tiques par la liaison de vue et de d\u00e9placer le g\u00e9n\u00e9rateur d&#8217;impl\u00e9mentation Parcelable vers un plugin s\u00e9par\u00e9.<\/p>\n<p>Dans la version 1.4.20, nous avons extrait le g\u00e9n\u00e9rateur d&#8217;impl\u00e9mentations Parcelable de <code>kotlin-android-extensions<\/code> et avons commenc\u00e9 le cycle d&#8217;obsolescence pour le reste, qui se limite actuellement aux synth\u00e9tiques. Pour le moment, ils continuent de fonctionner avec un avertissement d&#8217;obsolescence. \u00c0 l&#8217;avenir, vous devrez basculer votre projet vers une autre solution. Voici la <a href=\"https:\/\/goo.gle\/kotlin-android-extensions-deprecation\" target=\"_blank\" rel=\"noopener\">marche \u00e0 suivre<\/a> pour la migration de projets Android \u00e0 partir des synth\u00e9tiques vers les liaisons de vues.<\/p>\n<p>Le g\u00e9n\u00e9rateur d&#8217;impl\u00e9mentation Parcelable est maintenant disponible dans le nouveau plugin<\/p>\n<p><code>kotlin-parcelize<\/code>. Appliquez ce plugin au lieu de <code>kotlin-android-extensions<\/code> ou en plus de ce dernier si vous souhaitez continuer \u00e0 utiliser des synth\u00e9tiques. L&#8217;annotation <code>@Parcelize<\/code> est d\u00e9plac\u00e9e vers le paquet <code>kotlinx.parcelize<\/code>.<\/p>\n<\/p>\n<h2>Comment faire la mise \u00e0 jour<\/h2>\n<p><a name=\"how-to-update\"><\/a><\/p>\n<p>Avant de mettre \u00e0 jour vos projets vers la derni\u00e8re version de Kotlin, vous pouvez essayer les nouvelles fonctionnalit\u00e9s des biblioth\u00e8ques standards et du langage en ligne sur <a href=\"http:\/\/play.kotl.in\/\" target=\"_blank\" rel=\"noopener\">play.kotl.in<\/a>.<\/p>\n<p>Dans IntelliJ IDEA et Android Studio, vous pouvez mettre \u00e0 jour le plugin Kotlin vers la version 1.4.20\u00a0\u2013d\u00e9couvrez comment faire <a href=\"https:\/\/kotlinlang.org\/releases.html#updating-to-a-new-release\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>Si vous souhaitez travailler sur des projets cr\u00e9\u00e9s avec des versions pr\u00e9c\u00e9dentes de Kotlin, utilisez la version Kotlin <code>1.4.20<\/code> dans la configuration de votre projet. Pour en savoir plus, consultez la documentation <a href=\"http:\/\/kotlinlang.org\/docs\/reference\/using-gradle.html\" target=\"_blank\" rel=\"noopener\">pour Gradle<\/a> et <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/using-maven.html\" target=\"_blank\" rel=\"noopener\">pour Maven<\/a>.<\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger le compilateur de ligne de commande \u00e0 partir de la <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.4.20\" target=\"_blank\" rel=\"noopener\">page de la version sur Github<\/a>.<\/p>\n<p>Avec cette version, vous pouvez utiliser les biblioth\u00e8que suivantes\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.atomicfu\" target=\"_blank\" rel=\"noopener\">kotlinx.atomicfu<\/a> version <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.atomicfu\/0.14.4\" target=\"_blank\" rel=\"noopener\">0.14.4<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\" target=\"_blank\" rel=\"noopener\">kotlinx.coroutines<\/a> version <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.coroutines\/1.4.1\" target=\"_blank\" rel=\"noopener\">1.4.1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\" target=\"_blank\" rel=\"noopener\">kotlinx.serialization<\/a> version <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.serialization.runtime\/1.0.1\" target=\"_blank\" rel=\"noopener\">1.0.1<\/a><\/li>\n<li><a href=\"https:\/\/ktor.io\/\" target=\"_blank\" rel=\"noopener\">ktor<\/a> version <a href=\"https:\/\/bintray.com\/kotlin\/ktor\/ktor\/1.4.1\" target=\"_blank\" rel=\"noopener\">1.4.1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.html\" target=\"_blank\" rel=\"noopener\">kotlinx.html<\/a> version <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.html\/releases\/tag\/0.7.2\" target=\"_blank\" rel=\"noopener\">0.7.2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx-nodejs\" target=\"_blank\" rel=\"noopener\">kotlinx-nodejs<\/a> version <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.nodejs\/0.0.6\" target=\"_blank\" rel=\"noopener\">0.0.6<\/a><\/li>\n<\/ul>\n<p>Les versions des biblioth\u00e8ques de <code>kotlin-wrappers<\/code> (<code>kotlin-react<\/code> etc.) se trouvent dans le <a href=\"https:\/\/github.com\/JetBrains\/kotlin-wrappers\" target=\"_blank\" rel=\"noopener\">r\u00e9f\u00e9rentiel correspondant<\/a>.<\/p>\n<p>Les d\u00e9tails de la version et la liste des biblioth\u00e8ques compatibles sont \u00e9galement disponibles <a href=\"https:\/\/kotlinlang.org\/releases.html#release-details\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>Si vous rencontrez des probl\u00e8mes avec la nouvelle version, vous pouvez trouver de l&#8217;aide sur <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (obtenez une invitation <a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up?_ga=2.134077326.1218289669.1605167163-154294388.1603171954\" target=\"_blank\" rel=\"noopener\">ici<\/a>) et les signaler via <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<h2>Contributeurs externes<\/h2>\n<p><a name=\"external-contributors\"><\/a><\/p>\n<p>Nous remercions tous nos contributeurs externes dont les requ\u00eates pull ont \u00e9t\u00e9 incluses dans cette version\u00a0:<\/p>\n<p><a href=\"https:\/\/github.com\/jsjeon\" target=\"_blank\" rel=\"noopener\">Jinseong Jeon<\/a> <a href=\"https:\/\/github.com\/t-kameyama\" target=\"_blank\" rel=\"noopener\">Toshiaki Kameyama<\/a> <a href=\"https:\/\/github.com\/sfs\" target=\"_blank\" rel=\"noopener\">Steven Sch\u00e4fer<\/a> <a href=\"https:\/\/github.com\/madsager\" target=\"_blank\" rel=\"noopener\">Mads Ager<\/a> <a href=\"https:\/\/github.com\/punzki\" target=\"_blank\" rel=\"noopener\">Mark Punzalan<\/a> <a href=\"https:\/\/github.com\/gavra0\" target=\"_blank\" rel=\"noopener\">Ivan Gavrilovic<\/a> <a href=\"https:\/\/github.com\/pyos\" target=\"_blank\" rel=\"noopener\">pyos<\/a> <a href=\"https:\/\/github.com\/jimgoog\" target=\"_blank\" rel=\"noopener\">Jim Sproch<\/a> <a href=\"https:\/\/github.com\/kandersen\" target=\"_blank\" rel=\"noopener\">Kristoffer Andersen<\/a> <a href=\"https:\/\/github.com\/aleksandrina-streltsova\" target=\"_blank\" rel=\"noopener\">Aleksandrina Streltsova<\/a> <a href=\"https:\/\/github.com\/cketti\" target=\"_blank\" rel=\"noopener\">cketti<\/a> <a href=\"https:\/\/github.com\/kvirolainen\" target=\"_blank\" rel=\"noopener\">Konstantin Virolainen<\/a> <a href=\"https:\/\/github.com\/ajalt\" target=\"_blank\" rel=\"noopener\">AJ Alt<\/a> <a href=\"https:\/\/github.com\/tunedal\" target=\"_blank\" rel=\"noopener\">Henrik Tunedal<\/a> <a href=\"https:\/\/github.com\/juan-chen\" target=\"_blank\" rel=\"noopener\">Juan Chen<\/a> <a href=\"https:\/\/github.com\/kotlinisland\" target=\"_blank\" rel=\"noopener\">KotlinIsland<\/a>, <a href=\"https:\/\/github.com\/valery1707\" target=\"_blank\" rel=\"noopener\">Valeriy Vyrva<\/a> <a href=\"https:\/\/github.com\/achmyr\" target=\"_blank\" rel=\"noopener\">Alex Chmyr<\/a> <a href=\"https:\/\/github.com\/cdracm\" target=\"_blank\" rel=\"noopener\">Alexey Kudravtsev<\/a> <a href=\"https:\/\/github.com\/mano7onam\" target=\"_blank\" rel=\"noopener\">Andrey Matveev<\/a> <a href=\"https:\/\/github.com\/liutikas\" target=\"_blank\" rel=\"noopener\">Aurimas Liutikas<\/a> <a href=\"https:\/\/github.com\/Dattish\" target=\"_blank\" rel=\"noopener\">Dat Trieu<\/a> <a href=\"https:\/\/github.com\/devbridie\" target=\"_blank\" rel=\"noopener\">Dereck Bridie<\/a> <a href=\"https:\/\/github.com\/efemoney\" target=\"_blank\" rel=\"noopener\">Efeturi Money<\/a> <a href=\"https:\/\/github.com\/elijahverdoorn\" target=\"_blank\" rel=\"noopener\">Elijah Verdoorn<\/a> <a href=\"https:\/\/github.com\/43851243+enteerman\" target=\"_blank\" rel=\"noopener\">Enteerman<\/a> <a href=\"https:\/\/github.com\/fee1-dead\" target=\"_blank\" rel=\"noopener\">fee1-dead<\/a> <a href=\"https:\/\/github.com\/fvasco\" target=\"_blank\" rel=\"noopener\">Francesco Vasco<\/a> <a href=\"https:\/\/github.com\/duckladydinh\" target=\"_blank\" rel=\"noopener\">Gia Thuan Lam<\/a> <a href=\"https:\/\/github.com\/gdarmont\" target=\"_blank\" rel=\"noopener\">Guillaume Darmont<\/a> <a href=\"https:\/\/github.com\/JakeWharton\" target=\"_blank\" rel=\"noopener\">Jake Wharton<\/a> <a href=\"https:\/\/github.com\/juliankotrba\" target=\"_blank\" rel=\"noopener\">Julian Kotrba<\/a> <a href=\"https:\/\/github.com\/kevin1e100\" target=\"_blank\" rel=\"noopener\">Kevin Bierhoff<\/a> <a href=\"https:\/\/github.com\/gharrma\" target=\"_blank\" rel=\"noopener\">Matthew Gharrity<\/a> <a href=\"https:\/\/github.com\/Matts966\" target=\"_blank\" rel=\"noopener\">Matts966<\/a> <a href=\"https:\/\/github.com\/rsauciuc\" target=\"_blank\" rel=\"noopener\">Raluca Sauciuc<\/a> <a href=\"https:\/\/github.com\/rnett\" target=\"_blank\" rel=\"noopener\">Ryan Nett<\/a> <a href=\"https:\/\/github.com\/pocmo\" target=\"_blank\" rel=\"noopener\">Sebastian Kaspari<\/a> <a href=\"https:\/\/github.com\/develar\" target=\"_blank\" rel=\"noopener\">Vladimir Krivosheev<\/a> <a href=\"https:\/\/github.com\/n-p-s\" target=\"_blank\" rel=\"noopener\">n-p-s<\/a> <a href=\"https:\/\/github.com\/pavlospt\" target=\"_blank\" rel=\"noopener\">Pavlos-Petros Tournaris<\/a> <a href=\"https:\/\/github.com\/rbares\" target=\"_blank\" rel=\"noopener\">Robert Bares<\/a> <a href=\"https:\/\/github.com\/shiraji\" target=\"_blank\" rel=\"noopener\">Yoshinori Isogai<\/a> <a href=\"https:\/\/github.com\/zekehul\" target=\"_blank\" rel=\"noopener\">Kris<\/a> <a href=\"https:\/\/github.com\/bodin\" target=\"_blank\" rel=\"noopener\">Derek Bodin<\/a> <a href=\"https:\/\/github.com\/Lurker2k\" target=\"_blank\" rel=\"noopener\">Dominik Wuttke<\/a> <a href=\"https:\/\/github.com\/samofcorinth\" target=\"_blank\" rel=\"noopener\">Sam Wang<\/a> <a href=\"https:\/\/github.com\/uzilan\" target=\"_blank\" rel=\"noopener\">Uzi Landsmann<\/a> <a href=\"https:\/\/github.com\/yurano\" target=\"_blank\" rel=\"noopener\">Yuya Urano<\/a> Norbert Nogacki Alexandre Juca<\/p>\n<p><em>Auteur de l&#8217;article original en anglais : <a href=\"https:\/\/blog.jetbrains.com\/author\/pavel-semyonovjetbrains-com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Pavel Semyonov<\/a><\/em><\/p>\n","protected":false},"author":813,"featured_media":95154,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/97220"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=97220"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/97220\/revisions"}],"predecessor-version":[{"id":97235,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/97220\/revisions\/97235"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/95154"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=97220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=97220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=97220"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=97220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}