{"id":406940,"date":"2023-11-20T12:19:48","date_gmt":"2023-11-20T11:19:48","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=blog&#038;p=406940"},"modified":"2023-11-28T07:47:53","modified_gmt":"2023-11-28T06:47:53","slug":"amper-lepsi-build-tooling-user-experience","status":"publish","type":"blog","link":"https:\/\/blog.jetbrains.com\/cs\/blog\/2023\/11\/20\/amper-lepsi-build-tooling-user-experience\/","title":{"rendered":"Amper \u2013\u2060 lep\u0161\u00ed Build Tooling User Experience\u00a0"},"content":{"rendered":"<p>Od lid\u00ed, kte\u0159\u00ed si osvojuj\u00ed jazyk Kotlin, se k n\u00e1m opakovan\u011b dost\u00e1v\u00e1, \u017ee pr\u00e1ce se syst\u00e9my pro sestavov\u00e1n\u00ed (build systems) je pro n\u011b n\u00e1ro\u010dn\u00e1. \u0158ada projekt\u016f sice ke konfiguraci prost\u0159ed\u00ed vyu\u017e\u00edv\u00e1 pr\u016fvodce, ale i o ty je t\u0159eba pe\u010dovat. Objevuj\u00ed se nov\u00e9 moduly, platformy, z\u00e1vislosti a spousta dal\u0161\u00edch zm\u011bn, co\u017e pak \u010dasto kon\u010d\u00ed t\u00edm, \u017ee v\u00fdvoj\u00e1\u0159i tr\u00e1v\u00ed v\u00edce \u010dasu bojem se syst\u00e9mem pro sestaven\u00ed a IDE, ne\u017e aby se v\u011bnovali skute\u010dn\u00e9 pr\u00e1ci. A s t\u00edm, jak se jazyk Kotlin st\u00e1v\u00e1 skute\u010dn\u011b multiplatformn\u00edm, je to pro lidi, kte\u0159\u00ed jsou v ekosyst\u00e9mu JVM nov\u00ed, o to markantn\u011bj\u0161\u00ed.<\/p>\n<p>V JetBrains u\u017e n\u011bjakou dobu prov\u00e1d\u00edme \u0159adu intern\u00edch experiment\u016f, abychom se pokusili prost\u0159ed\u00ed pro v\u00fdvoj\u00e1\u0159e pat\u0159i\u010dn\u011b zlep\u0161it \u2013\u2060 a to nejen z hlediska definov\u00e1n\u00ed projekt\u016f, ale tak\u00e9 z hlediska toolingu. Tyto snahy jsou v souladu s <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\/\">dal\u0161\u00edmi iniciativami<\/a>, na kter\u00fdch pracujeme v souvislosti s <a href=\"https:\/\/www.jetbrains.com\/kotlin-multiplatform\/\" target=\"_blank\" rel=\"noreferrer noopener\">Kotlin Multiplatform<\/a>.<\/p>\n<p>A dnes se o jeden takov\u00fd projekt chceme ve\u0159ejn\u011b pod\u011blit. Je j\u00edm Amper. Ne\u017e se do toho ale pust\u00edme, je t\u0159eba zm\u00ednit n\u00e1sledovn\u00e9 \u2013\u2060 v\u0161e je zat\u00edm ve velmi experiment\u00e1ln\u00ed f\u00e1zi a na\u0161\u00edm hlavn\u00edm c\u00edlem tohoto zp\u0159\u00edstupn\u011bn\u00ed je validace my\u0161lenek, kter\u00e9 za t\u00edm stoj\u00ed, a z\u00edsk\u00e1n\u00ed va\u0161ich n\u00e1zor\u016f.<\/p>\n<h2 class=\"wp-block-heading\">Co je to Amper?<\/h2>\n<p>Amper je n\u00e1stroj pro konfiguraci projekt\u016f. Klade si za c\u00edl zlep\u0161it u\u017eivatelsk\u00e9 prost\u0159ed\u00ed konfigurace projekt\u016f a dostupnost n\u00e1stroj\u016f, v podstat\u011b tedy podporu v IDE. Sou\u010dasn\u011b se ale chce st\u00e1t neot\u0159el\u00fdm \u0159e\u0161en\u00edm, se kter\u00fdm bude radost pracovat.<\/p>\n<p>Pr\u00e1v\u011b te\u010f pracujeme na nejr\u016fzn\u011bj\u0161\u00edch aspektech, mimo jin\u00e9 na konfiguraci projekt\u016f za \u00fa\u010delem sestavov\u00e1n\u00ed, publikov\u00e1n\u00ed a mnoha dal\u0161\u00edch v\u011bc\u00ed. Sou\u010dasn\u00e1 f\u00e1ze se nicm\u00e9n\u011b soust\u0159ed\u00ed p\u0159edev\u0161\u00edm na konfiguraci projekt\u016f pro \u00fa\u010dely sestavov\u00e1n\u00ed.<\/p>\n<p>Te\u010f se nejv\u00edc \u0159e\u0161\u00ed p\u0159\u00edpad pou\u017eit\u00ed pro Kotlin a Kotlin Multiplatform, ale Amper podporuje i Javu a Swift (v r\u00e1mci po\u017eadavku na \u201emultiplatformnost\u201c). Stejn\u00fd p\u0159\u00edstup ke konfiguraci by v\u0161ak v budoucnu mohl fungovat i pro dal\u0161\u00ed jazyky a technologick\u00e9 stacky.<\/p>\n<p>Amper je implementov\u00e1n jako plugin Gradlu a pro \u00fa\u010dely konfigurace projektu pou\u017e\u00edv\u00e1 form\u00e1t YAML. V tuto chv\u00edli je c\u00edlem validovat u\u017eivatelsk\u00e9 prost\u0159ed\u00ed. Proto jsme se rozhodli stav\u011bt na osv\u011bd\u010den\u00e9m n\u00e1stroji pro sestavov\u00e1n\u00ed, jako je Gradle, a vytvo\u0159it nad n\u00edm konfigura\u010dn\u00ed vrstvu.<\/p>\n<p>S ohledem na pou\u017eit\u00ed jazyka YAML mo\u017en\u00e1 n\u011bkter\u00e9 z v\u00e1s napadne, pro\u010d ne Kotlin? Rozhodnut\u00ed o tomto markup jazyce sice nen\u00ed kone\u010dn\u00e9, ale chceme zvolit deklarativn\u00ed p\u0159\u00edstup. Podle na\u0161eho p\u0159esv\u011bd\u010den\u00ed to umo\u017en\u00ed nejen jednodu\u0161\u0161\u00ed konfiguraci, kter\u00e1 je m\u00e9n\u011b n\u00e1chyln\u00e1 k chyb\u00e1m, ale pom\u016f\u017ee n\u00e1m to i poskytovat lep\u0161\u00ed tooling. A jak u\u017e jsme \u0159ekli, experiment s v\u00e1mi chceme sd\u00edlet a chceme validovat my\u0161lenky, kter\u00e9 za n\u00edm stoj\u00ed, tak\u017ee jsme pochopiteln\u011b zvolili ten nejjednodu\u0161\u0161\u00ed p\u0159\u00edstup. O tom, zda nakonec pou\u017eijeme jako frontendov\u00fd jazyk zrovna Kotlin, se teprve rozhodne. Prozat\u00edm n\u00e1m jde jenom o uvedenou validaci.<\/p>\n<h2 class=\"wp-block-heading\">Sem s k\u00f3dem!<\/h2>\n<p>Uva\u017eujme zcela z\u00e1kladn\u00ed projekt v JVM \u201eHello, World!\u201c s n\u00e1sleduj\u00edc\u00ed adres\u00e1\u0159ovou strukturou v prost\u0159ed\u00ed 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>Soubory <code>main.kt<\/code> a <code>MyTest.kt<\/code> jsou prost\u011b jen b\u011b\u017en\u00e9 soubory jazyka Kotlin, ve kter\u00fdch nen\u00ed nic zvl\u00e1\u0161tn\u00edho. Zaj\u00edmavou \u010d\u00e1st\u00ed je <code>module.yaml<\/code>, co\u017e je soubor manifestu Amperu. Pro v\u00fd\u0161e uvedenou projektovou strukturu to je jednoduch\u00e9:<\/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 \nproduct: jvm\/app<\/pre>\n<p>Nic v\u00edc. Sady n\u00e1stroj\u016f Kotlinu a Javy, testovac\u00ed framework a dal\u0161\u00ed pot\u0159ebn\u00e9 funkce jsou nakonfigurov\u00e1ny a ihned k dispozici. M\u016f\u017eete za\u010d\u00edt buildovat, spustit, ps\u00e1t a prov\u00e1d\u011bt testy a mnoho dal\u0161\u00edho. Podrobn\u011bj\u0161\u00ed informace najdete v <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/0.1\/examples\/jvm-with-tests\" target=\"_blank\" rel=\"noopener\">kompletn\u00edm p\u0159\u00edkladu<\/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>Te\u010f se pro zm\u011bnu mrkneme na projekt v Compose Multiplatform s aplikacemi JVM pro Android, iOS a desktopy s n\u00e1sleduj\u00edc\u00ed projektovou strukturou ve Fleetu:<\/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>Pov\u0161imn\u011bte si, \u017ee slo\u017eka <code>src\/<\/code> obsahuje k\u00f3d v Kotlinu i ve Swiftu dohromady. Samoz\u0159ejm\u011b by klidn\u011b mohlo j\u00edt i o Kotlin a Javu.<\/p>\n<p>Dal\u0161\u00edm aspektem, kter\u00fd je t\u0159eba vyzdvihnout, je sd\u00edlen\u00fd modul se spole\u010dn\u00fdm k\u00f3dem ve slo\u017ece <code>src<\/code> a slo\u017eky k\u00f3du specifick\u00e9 pro jednotliv\u00e9 platformy <code>src@ios<\/code> a <code>src@android<\/code> (p\u0159e\u010dt\u011bte si v\u00edce o <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Documentation.md#project-layout\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md#project-layout\">rozlo\u017een\u00ed projekt\u016f<\/a>).<\/p>\n<p>Takhle vypad\u00e1 soubor manifestu <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: \ndependencies:\n  - ..\/shared\n\nsettings:\n  # Enable Compose Multiplatform framework\n  compose: enabled<\/pre>\n<p>Nen\u00ed to \u017e\u00e1dn\u00e1 v\u011bda: V uveden\u00e9m p\u0159\u00edpad\u011b se definuje aplikace pro iOS se z\u00e1vislost\u00ed na sd\u00edlen\u00e9m modulu a zap\u00edn\u00e1 se framework Compose Multiplatform. Zaj\u00edmav\u011bj\u0161\u00edm p\u0159\u00edkladem je <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  type: lib\n  platforms: [jvm, android, iosArm64, iosSimulatorArm64, iosX64]\n\n# Shared Compose dependencies:\ndependencies:\n  - org.jetbrains.compose.foundation:foundation:1.5.0-rc01: exported\n  - org.jetbrains.compose.material3:material3:1.5.0-rc01: exported\n\n# Android-only dependencies  \ndependencies@android:\n  # integration compose with activities\n  - androidx.activity:activity-compose:1.7.2: exported\n  - androidx.appcompat:appcompat:1.6.1: exported\n\n# iOS-only dependencies with a dependency on a CocoaPod\n#   note that CocoaPods dependencies are not yet implemented in the prototype\ndependencies@ios:\n  - pod: 'FirebaseCore'\n    version: '~&gt; 6.6'\n\nsettings:\n  # Enable Kotlin serialization\n  kotlin:\n    serialization: json\n  \n  # Enable Compose Multiplatform framework\n  compose: enabled<\/pre>\n<p>Za zm\u00ednku tu stoj\u00ed hned \u0159ada v\u011bc\u00ed. Zaprv\u00e9 si v\u0161imn\u011bte sekc\u00ed <code>dependencies:<\/code> specifick\u00fdch pro danou platformu s kvalifik\u00e1torem <code>@<\/code>. <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Documentation.md#platform-qualifier\" target=\"_blank\" rel=\"noopener\">Kvalifik\u00e1tor platformy<\/a> lze pou\u017e\u00edt jak v manifestu, tak v rozlo\u017een\u00ed souboru. Kvalifik\u00e1tor uspo\u0159\u00e1d\u00e1 k\u00f3d, z\u00e1vislosti a nastaven\u00ed s ohledem na konkr\u00e9tn\u00ed platformu.<br \/>\nZa druh\u00e9, sekce dependencies: umo\u017e\u0148uje nejen z\u00e1vislosti Kotlinu a Mavenu, ale potenci\u00e1ln\u011b i <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Documentation.md#native-dependencies\" target=\"_blank\" rel=\"noopener\">spr\u00e1vc\u00edch bal\u00ed\u010dk\u016f<\/a> specifick\u00fdch pro danou platformu, jako je CocoaPods, Swift Package Manager a na z\u00e1klad\u011b obdr\u017een\u00e9 zp\u011btn\u00e9 vazby i dal\u0161\u00ed.<\/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>Tyto p\u0159\u00edklady samoz\u0159ejm\u011b ukazuj\u00ed pouze omezenou sadu funkc\u00ed Amperu. Mrkn\u011bte na <a href=\"https:\/\/github.com\/JetBrains\/amper\" target=\"_blank\" rel=\"noreferrer noopener\">projekt na GitHubu<\/a> a prohl\u00e9dn\u011bte si <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Documentation.md\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/Documentation.md\">dokumentaci<\/a>, <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Tutorial.md\" target=\"_blank\" rel=\"noopener\">tutori\u00e1l<\/a> a <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/0.1\/examples\" target=\"_blank\" rel=\"noopener\">uk\u00e1zkov\u00e9 projekty<\/a>, abyste z\u00edskali lep\u0161\u00ed p\u0159ehled o designu a fungov\u00e1n\u00ed Amperu.<\/p>\n<h3 class=\"wp-block-heading\">Co v sou\u010dasn\u00e9 dob\u011b podporuje<\/h3>\n<p>Amper v sou\u010dasn\u00e9 dob\u011b podporuje vytv\u00e1\u0159en\u00ed aplikac\u00ed zam\u011b\u0159en\u00fdch na platformy JVM, Android, iOS, macOS a Linux. M\u016f\u017eete vytv\u00e1\u0159et aplikace zalo\u017een\u00e9 na jazyce Kotlin (jedno- i multiplatformn\u00ed) i na jazyce Java.<\/p>\n<p>Vzhledem k tomu, \u017ee Amper pou\u017e\u00edv\u00e1 jako backend Gradle, je podpora vlastn\u00edch \u00faloh, mo\u017enost publikovat knihovny do Mavenu, podpora CocoaPods a mo\u017enost balen\u00ed desktopov\u00fdch aplikac\u00ed zprost\u0159edkov\u00e1na p\u0159\u00edmo konfigurac\u00ed soubor\u016f pro sestaven\u00ed Gradle.<\/p>\n<h2 class=\"wp-block-heading\">Jak to vyzkou\u0161et<\/h2>\n<p>Amper si m\u016f\u017eete vyzkou\u0161et n\u011bkolika zp\u016fsoby.<\/p>\n<ul>\n<li>V <a href=\"https:\/\/www.jetbrains.com\/idea\/nextversion\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> 2023.3 od buildu 233.11799 na projekty JVM a Android.<\/li>\n<li>Ve <a href=\"https:\/\/www.jetbrains.com\/fleet\/download\" target=\"_blank\" rel=\"noopener\">Fleetu<\/a> od buildu 1.26.104 na projekty JVM, Android a Kotlin Multiplatform.<\/li>\n<li>Pou\u017eit\u00ed Gradlu k sestaven\u00ed Amper projekt\u016f z rozhran\u00ed CLI nebo CI\/CD.<\/li>\n<\/ul>\n<p>P\u0159e\u010dt\u011bte si <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Setup.md\" target=\"_blank\" rel=\"noopener\">n\u00e1vod k nastaven\u00ed<\/a>.<\/p>\n<p>P\u0159ipravili jsme tak\u00e9 n\u011bkolik <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/0.1\/examples\" target=\"_blank\" rel=\"noopener\">p\u0159\u00edklad\u016f<\/a> a mimo jin\u00e9 i <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Tutorial.md\" target=\"_blank\" rel=\"noopener\">n\u00e1vod<\/a>. D\u00e1le zde najdete podrobn\u011bj\u0161\u00ed <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/Documentation.md\" target=\"_blank\" rel=\"noopener\">dokumentaci<\/a>, kter\u00e1 se zab\u00fdv\u00e1 r\u016fzn\u00fdmi aspekty ohledn\u011b Amperu.<\/p>\n<h3 class=\"wp-block-heading\">Pot\u0159ebujeme va\u0161i zp\u011btnou vazbu<\/h3>\n<p>Projekt je ve f\u00e1zi, kdy se neobejdeme bez va\u0161\u00ed zp\u011btn\u00e9 vazby. Byli bychom r\u00e1di, kdybyste v\u0161e vyzkou\u0161eli a \u0159ekli n\u00e1m, zda je s n\u00edm definov\u00e1n\u00ed projekt\u016f jednodu\u0161\u0161\u00ed nebo jak\u00e9 p\u0159\u00edpady pou\u017eit\u00ed byste si p\u0159\u00e1li pokr\u00fdt. Uv\u00edt\u00e1me jak\u00e9koli podn\u011btn\u00e9 reakce. Sv\u00e9 n\u00e1vrhy a n\u00e1pady m\u016f\u017eete zas\u00edlat pomoc\u00ed na\u0161eho <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/AMPER\" target=\"_blank\" rel=\"noopener\">issue trackeru<\/a>, v podob\u011b koment\u00e1\u0159e k tomuto p\u0159\u00edsp\u011bvku nebo p\u0159es n\u00e1\u0161 ve\u0159ejn\u00fd <a href=\"https:\/\/kotlinlang.slack.com\/archives\/C062WG3A7T8\" target=\"_blank\" rel=\"noopener\">kan\u00e1l na Slacku<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">N\u011bkolik slov na z\u00e1v\u011br<\/h2>\n<p>Tak\u00e9 jsme pro v\u00e1s p\u0159ipravili <a href=\"https:\/\/github.com\/JetBrains\/amper\/blob\/0.1\/docs\/FAQ.md\" target=\"_blank\" rel=\"noopener\">FAQ<\/a> sekci, kter\u00e1 by v\u00e1m m\u011bla leccos zodpov\u011bd\u011bt. Cht\u011bli jsme se v\u0161ak explicitn\u011b vyj\u00e1d\u0159it k n\u011bkolika bod\u016fm.<\/p>\n<p>P\u0159edev\u0161\u00edm jsme pln\u011b odhodl\u00e1ni v aplikac\u00edch IntelliJ IDEA a Fleet podporovat technologie, jako jsou Maven a Gradle. Tento projekt nic nem\u011bn\u00ed na na\u0161em z\u00e1vazku v\u016f\u010di t\u011bmto technologi\u00edm a v t\u00e9to oblasti nad\u00e1le velmi \u00fazce spolupracujeme s na\u0161imi partnery.<\/p>\n<p>Za druh\u00e9, v sou\u010dasn\u00e9 f\u00e1zi nen\u00ed Amper samostatn\u00fdm n\u00e1strojem pro sestavov\u00e1n\u00ed. M\u00e1me sice spoustu n\u00e1pad\u016f, jak bychom cht\u011bli produkt posunout, ale p\u0159ed dal\u0161\u00edm v\u00fdvojem Amperu nejd\u0159\u00edv pot\u0159ebujeme validovat v\u011bci, na kter\u00fdch v sou\u010dasn\u00e9 dob\u011b pracujeme.<\/p>\n<p>Douf\u00e1me, \u017ee dal\u0161\u00ed p\u0159\u00edpadn\u00e9 ot\u00e1zky v\u00e1m zodpov\u00ed sekce <a href=\"https:\/\/github.com\/JetBrains\/amper\/tree\/main\/docs\/FAQ.md\" target=\"_blank\" rel=\"noopener\">nej\u010dast\u011bj\u0161\u00edch dotaz\u016f<\/a>. Pokud ne, nev\u00e1hejte se n\u00e1s zeptat v koment\u00e1\u0159\u00edch a my se vynasna\u017e\u00edme v\u0161e oz\u0159ejmit.<\/p>\n","protected":false},"author":1229,"featured_media":406955,"comment_status":"closed","ping_status":"closed","template":"","categories":[286],"tags":[],"cross-post-tag":[6910,6355],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/blog\/406940"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/users\/1229"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/comments?post=406940"}],"version-history":[{"count":5,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/blog\/406940\/revisions"}],"predecessor-version":[{"id":409780,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/blog\/406940\/revisions\/409780"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/media\/406955"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/media?parent=406940"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/categories?post=406940"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/tags?post=406940"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/cs\/wp-json\/wp\/v2\/cross-post-tag?post=406940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}