{"id":466056,"date":"2025-07-04T15:00:51","date_gmt":"2025-07-04T15:00:51","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=466056"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=466056","title":{"rendered":"<span>\u041a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 Rust \u043e\u0442 \u0438 \u0434\u043e: GUI + CLI + CI + Docker \u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 DotPlus \u043d\u0430 Linux \u0438 ARM<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\ud83d\udd27 \u041a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0430 CLI \u0438 GUI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Rust \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>DotPlus \u2014 \u044d\u0442\u043e Rust-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434 Windows, \u043d\u043e \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u0431\u044b\u043b\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0434 Linux \u0438 Docker.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 <strong>Linux-\u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 GUI \u0438 CLI<\/strong> \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u043f\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440.<\/p>\n<h3>\u2757 \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e cargo build?<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 x86_64, \u043d\u043e \u0438 \u043f\u043e\u0434 ARM (Raspberry Pi, \u0441\u0435\u0440\u0432\u0435\u0440\u044b), \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>cargo build<\/code> \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u044b <strong>\u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b<\/strong> (<code>gcc-aarch64-linux-gnu<\/code> \u0438 \u0434\u0440.)<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 sysroot, musl, glibc<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <strong>GUI<\/strong> (\u0447\u0435\u0440\u0435\u0437 <code>eframe<\/code> \u0438 <code>egui<\/code>) \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 OpenGL, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u043b\u0438 <code>rfd<\/code> (\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0438)<\/p>\n<\/li>\n<\/ul>\n<h3>\ud83d\udee0 \u0420\u0435\u0448\u0435\u043d\u0438\u0435: cross-rs<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 <code>--target<\/code>-\u0444\u043b\u0430\u0433\u043e\u0432 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 toolchain, \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/cross-rs\/cross\" rel=\"noopener noreferrer nofollow\"><code>cross<\/code><\/a> \u2014 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442  \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 Rust, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">cross build --release --target aarch64-unknown-linux-gnu<\/code><\/pre>\n<ul>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043a\u0430\u043a \u0441 CLI, \u0442\u0430\u043a \u0438 \u0441 GUI (\u0435\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 dev-\u043f\u0430\u043a\u0435\u0442\u044b)<\/p>\n<\/li>\n<\/ul>\n<h3>\u2699\ufe0f \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f: cross.toml<\/h3>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0435\u0433\u043e <code>cross.toml<\/code>, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"yaml\">[target.aarch64-unknown-linux-gnu] image = \"ghcr.io\/cross-rs\/aarch64-unknown-linux-gnu:edge\"  [target.armv7-unknown-linux-gnueabihf] image = \"ghcr.io\/cross-rs\/armv7-unknown-linux-gnueabihf:edge\"  [target.x86_64-unknown-linux-gnu] image = \"ghcr.io\/cross-rs\/x86_64-unknown-linux-gnu:edge\"<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0437\u044b <code>edge<\/code> \u2014 \u044d\u0442\u043e \u0441\u0432\u0435\u0436\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 <code>egui<\/code>, <code>eframe<\/code> \u0438 <code>rfd<\/code> \u0432 Linux-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h3>\ud83e\uddf1 GUI + CLI: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0444\u0438\u0447<\/h3>\n<pre><code class=\"yaml\">[features] default = [\"gui\"] gui = [\"eframe\", \"egui\", \"rfd\", \"egui_extras\"] notifications = [\"notify-rust\"]<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443: <\/p>\n<ul>\n<li>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 CLI-\u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0431\u0435\u0437 GUI (<code>--no-default-features<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 Linux \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c <strong>\u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/strong>, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 GTK\/Wayland GUI \u0447\u0435\u0440\u0435\u0437 <code>eframe<\/code><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c:<\/strong> \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 headless-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<h3>\ud83e\ude93 \u041e\u0442 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0443\u0441\u043f\u0435\u0445 \u0441 <code>cross<\/code>, \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c:<\/p>\n<ul>\n<li>\n<p><strong>musl-\u0441\u0431\u043e\u0440\u043a\u0438 <\/strong>(\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0438\u043d\u043a\u0443\u0435\u043c\u044b\u0435) \u0431\u044b\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u2014 <code>eframe<\/code> \u0438 <code>rfd<\/code> \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><strong>Windows ARM <\/strong>MIPS \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b \u0438 \u0441\u043b\u0430\u0431\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>cross<\/code><\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u0438\u0448\u043a\u043e\u043c &#171;\u0447\u0438\u0441\u0442\u0430\u044f&#187; \u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0435\u0437 Docker <\/strong>\u2014 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0434\u0435\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 GUI \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e, \u0438 \u043e\u043d\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0430 GitHub Actions runner&#8217;\u0430\u0445<\/p>\n<\/li>\n<\/ul>\n<h3>\u2705 \u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h3>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>cross<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 GUI+CLI \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043f\u043e\u0434 Linux \u0434\u043b\u044f \u0442\u0440\u0451\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\"><code>x86_64-unknown-linux-gnu<\/code><\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u2705 GUI\/CLI<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\"><code>aarch64-unknown-linux-gnu<\/code><\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u2705 GUI\/CLI<\/p>\n<\/td>\n<td>\n<p align=\"left\">ARM64 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, RPi 4 \u0438 \u043d\u043e\u0432\u0435\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\"><code>armv7-unknown-linux-gnueabihf<\/code><\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u2705 GUI\/CLI<\/p>\n<\/td>\n<td>\n<p align=\"left\">RPi 3 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 ARMv7 SBC<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u2705 \u0418\u0442\u043e\u0433: \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f cross<\/h3>\n<p>DotPlus \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Linux \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0438 CLI. \u041e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 UX, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 Raspberry Pi \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<h3>\ud83d\ude80 CI\/CD: \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u0432<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <code>cross<\/code> \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e: \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0439, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b:<\/p>\n<ul>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c DotPlus \u043f\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b <code>.deb<\/code> \u0438 <code>.rpm<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c Docker-\u043e\u0431\u0440\u0430\u0437<\/p>\n<\/li>\n<li>\n<p>\u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437 \u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u0440\u043e\u0434\u0438\u043b\u0441\u044f CI\/CD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 \u0431\u0430\u0437\u0435 <strong>GitHub Actions<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<h4>\ud83d\udcc2 \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/h4>\n<p>CI\/CD \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043e\u0434\u043d\u043e\u043c workflow-\u0444\u0430\u0439\u043b\u0435 \ud83d\udcc4 build-multiarch.yml:<\/p>\n<pre><code class=\"yaml\">name: Build dotplus (.deb\/.rpm) for all architectures  on:   push:     branches: [linux]     tags: [\"v*\"]   workflow_dispatch:  jobs:   build:     runs-on: ubuntu-latest     env:       CROSS_SKIP_VERSION_CHECK: \"1\"     steps:       - name: \ud83e\uddfe Checkout         uses: actions\/checkout@v4        - name: \u26a1\ufe0f Cache Cargo         uses: actions\/cache@v4         with:           path: |             ~\/.cargo\/bin             ~\/.cargo\/registry             ~\/.cargo\/git           key: ${{ runner.os }}-cargo-${{ hashFiles('**\/Cargo.lock') }}           restore-keys: |             ${{ runner.os }}-cargo-        - name: \ud83e\uddec Enable QEMU for multi-arch RPM         uses: docker\/setup-qemu-action@v3         with:           platforms: all        - name: \ud83e\udd80 Install Rust         uses: actions-rs\/toolchain@v1         with:           toolchain: stable           override: true           components: rustfmt        - name: \ud83c\udfaf Add targets         run: |           rustup target add \\             x86_64-unknown-linux-gnu \\             aarch64-unknown-linux-gnu \\             armv7-unknown-linux-gnueabihf        - name: \ud83d\udc33 Install Docker &amp; Cross         run: |           sudo apt update           sudo apt install -y docker.io containerd           if ! command -v cross &amp;&gt;\/dev\/null; then             cargo install cross           else             echo \"\u2705 cross \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\"           fi        - name: \ud83d\udce6 Install deb\/rpm tools         run: |           sudo apt install -y \\             dpkg-dev debhelper rpm rpm2cpio fakeroot \\             qemu-user-static binfmt-support \\             gcc-multilib libc6-dev-i386 pkg-config \\             libssl-dev libstdc++-12-dev        - name: \ud83d\udd27 Make script executable         run: chmod +x tools\/generate.sh        - name: \ud83d\udee0 Run build script         run: .\/tools\/generate.sh        - name: \u2601\ufe0f Upload artifacts         uses: actions\/upload-artifact@v4         with:           name: dotplus-packages           path: |             build\/**\/dotplus_*.deb             build\/**\/RPMS\/**\/*.rpm    docker:     runs-on: ubuntu-latest     needs: build     steps:       - name: \ud83e\uddfe Checkout         uses: actions\/checkout@v4        - name: \ud83e\udd80 Install Rust + cross         run: |           rustup update           rustup target add x86_64-unknown-linux-musl           cargo install cross        - name: \ud83d\udee0 Build static binary (musl, CLI-only)         run: cross build --release --target x86_64-unknown-linux-musl --no-default-features        - name: \ud83e\uddf0 Prepare Docker context         run: |           if [[ -f target\/x86_64-unknown-linux-musl\/release\/dotplus ]]; then             cp target\/x86_64-unknown-linux-musl\/release\/dotplus docker\/dotplus           else             echo \"\u274c Static binary not found\"             exit 1           fi        - name: \ud83d\udc33 Build Docker image         run: docker build -t dotplus-cli -f docker\/Dockerfile.cli .\/docker        - name: \u2601\ufe0f Save Docker image as archive         run: docker save dotplus-cli | gzip &gt; dotplus-cli.tar.gz        - name: \u2601\ufe0f Upload Docker image artifact         uses: actions\/upload-artifact@v4         with:           name: dotplus-cli-docker           path: dotplus-cli.tar.gz <\/code><\/pre>\n<p>\ud83d\udcc4 build-multiarch.yml \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0443\u0448\u0435 \u0432 \u0432\u0435\u0442\u043a\u0438 <code>release-linux<\/code> \u0438\u043b\u0438 <code>release-docker<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443, \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443, \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u0434\u0435\u043f\u043b\u043e\u0439.<\/p>\n<h4>\u2699\ufe0f \u042d\u0442\u0430\u043f\u044b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/h4>\n<p><strong>\u0414\u0430\u0442\u0430:<\/strong> 01.07.2025<br \/><strong>\u0424\u0430\u0439\u043b Workflow:<\/strong> <code>build-multiarch.yml<\/code><br \/><strong>\u0422\u0440\u0438\u0433\u0433\u0435\u0440:<\/strong> Push \u0432 \u0432\u0435\u0442\u043a\u0443 <code>linux<\/code><\/p>\n<p>\ud83d\udce6 \u042d\u0442\u0430\u043f 1: <code>build<\/code> (\u23f1 ~16 \u043c\u0438\u043d\u0443\u0442)<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0428\u0430\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2699\ufe0f <code>Set up job<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udce5 <code>Checkout<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u26a1 <code>Cache Cargo<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\udde9 <code>Enable QEMU for multi-arch RPM<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\udd80 <code>Install Rust<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Rust<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83c\udfaf <code>Add targets<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udc33 <code>Install Docker &amp; Cross<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Docker \u0438 <code>cross<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\uddf0 <code>Install deb\/rpm tools<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udd27 <code>Make script executable<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u25b6\ufe0f <code>Run build script<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 <code>.deb<\/code> \u0438 <code>.rpm<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2b06\ufe0f <code>Upload artifacts<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u267b\ufe0f Post-steps<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043e\u0442\u043a\u0430\u0442 QEMU, \u043a\u044d\u0448\u0430 \u0438 <code>checkout<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf9\/ce9\/f74\/bf9ce9f741812720525f5297cc2f2aed.png\" alt=\"\ud83d\udce4 \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b: .deb, .rpm\" title=\"\ud83d\udce4 \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b: .deb, .rpm\" width=\"1888\" height=\"895\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bf9\/ce9\/f74\/bf9ce9f741812720525f5297cc2f2aed.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf9\/ce9\/f74\/bf9ce9f741812720525f5297cc2f2aed.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\ud83d\udce4 <strong>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b:<\/strong> <code>.deb<\/code>, <code>.rpm<\/code><\/figcaption><\/div>\n<\/figure>\n<p>\ud83d\udc33 \u042d\u0442\u0430\u043f 2: <code>docker<\/code> (\u23f1 ~4 \u043c\u0438\u043d\u0443\u0442\u044b)<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0428\u0430\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2699\ufe0f <code>Set up job<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udce5 <code>Checkout<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\udd80 <code>Install Rust + cross<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Rust + \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udee0 <code>Build static binary<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 (musl, CLI-only)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\uddf3 <code>Prepare Docker context<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f Docker<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udd28 <code>Build Docker image<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udcbe <code>Save Docker image<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0432 \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2b06\ufe0f <code>Upload Docker artifact<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0440\u0445\u0438\u0432\u0430 \u043a\u0430\u043a \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u267b\ufe0f Post-steps<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043e\u0442\u043a\u0430\u0442 <code>checkout<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ea6\/b54\/e75\/ea6b54e75b19b2c77647c270b0f89ca7.png\" alt=\"\ud83d\udce4 \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442: \u0430\u0440\u0445\u0438\u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u0430\" title=\"\ud83d\udce4 \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442: \u0430\u0440\u0445\u0438\u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u0430\" width=\"1882\" height=\"856\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ea6\/b54\/e75\/ea6b54e75b19b2c77647c270b0f89ca7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ea6\/b54\/e75\/ea6b54e75b19b2c77647c270b0f89ca7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\ud83d\udce4 <strong>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442:<\/strong> \u0430\u0440\u0445\u0438\u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u0430<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aeb\/621\/81b\/aeb62181be14f9886c050b78ef945df9.png\" alt=\"\ud83d\udd04 \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430\" title=\"\ud83d\udd04 \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430\" width=\"1882\" height=\"700\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/aeb\/621\/81b\/aeb62181be14f9886c050b78ef945df9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aeb\/621\/81b\/aeb62181be14f9886c050b78ef945df9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\ud83d\udd04 \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<h4>\ud83d\udd04 \u041a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432<\/h4>\n<p>\u041a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>cross<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 Docker-\u043e\u0431\u0440\u0430\u0437\u0430\u0445:<\/p>\n<pre><code class=\"yaml\">- name: Build for aarch64   run: cross build --release --target aarch64-unknown-linux-gnu  - name: Build for armv7   run: cross build --release --target armv7-unknown-linux-gnueabihf  - name: Build for x86_64   run: cross build --release --target x86_64-unknown-linux-gnu<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0441\u0440\u0435\u0434\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f GUI-\u0447\u0430\u0441\u0442\u044c \u043d\u0430 Linux.<\/p>\n<h4>\ud83d\udce6 \u041f\u0430\u043a\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: .deb \u0438 .rpm \u0438\u0437 CI<\/h4>\n<ul>\n<li>\n<p><code>dotplus_1.0.0_amd64.deb<\/code><\/p>\n<\/li>\n<li>\n<p><code>dotplus_1.0.0_arm64.deb<\/code><\/p>\n<\/li>\n<li>\n<p><code>dotplus_1.0.0_armhf.deb<\/code><\/p>\n<\/li>\n<li>\n<p><code>dotplus-1.0.0-1.x86_64.rpm<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"bash\">sudo dpkg -i dotplus_1.0.0_amd64.deb # \u0438\u043b\u0438 sudo rpm -i dotplus-1.0.0-1.x86_64.rpm<\/code><\/pre>\n<h4>\ud83d\udd27 \u041a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e?<\/h4>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b:<\/p>\n<p><code>templates\/<\/code><a href=\"http:\/\/control.in\" rel=\"noopener noreferrer nofollow\"><code>control.in<\/code><\/a> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f <code>.deb<\/code><\/p>\n<pre><code class=\"yaml\">Package: dotplus Version: {{VERSION}} Section: utils Priority: optional Architecture: {{ARCH}} Maintainer: Danil Nigmatullin &lt;danil.communication@gmail.com&gt; Depends: {{DEPENDS}} Description: QR and barcode generator with logo and CSV support (Rust CLI\/GUI)  DotPlus is a Rust-based GUI and command-line tool for generating QR codes and barcodes.  It supports logo embedding, CSV import, and auto-update functionality.  Suitable for both terminal workflows and desktop users.<\/code><\/pre>\n<p><code>templates\/<\/code><a href=\"http:\/\/spec.in\" rel=\"noopener noreferrer nofollow\"><code>spec.in<\/code><\/a> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f <code>.rpm<\/code><\/p>\n<pre><code class=\"yaml\">Name:           dotplus Version:        {{VERSION}} Release:        1%{?dist} Summary:        QR and barcode generator with logo and CSV support (Rust CLI\/GUI)  License:        Freeware (Proprietary) URL:            https:\/\/github.com\/nigdanil\/dotplus  Source0:        dotplus BuildArch:      {{ARCH}} Requires:       {{REQUIRES}}  %description DotPlus is a Rust-based GUI and CLI tool for QR\/barcode generation with logo and CSV support.  %prep # No preparation steps needed  %install [ -f %{SOURCE0} ] || { echo \"Missing binary dotplus in SOURCES\"; exit 1; } [ -f %{_sourcedir}\/arialmt.ttf ] || { echo \"Missing font file arialmt.ttf\"; exit 1; }  mkdir -p %{buildroot}\/usr\/bin mkdir -p %{buildroot}\/usr\/share\/dotplus\/fonts  install -m 0755 %{SOURCE0} %{buildroot}\/usr\/bin\/dotplus install -m 0644 %{_sourcedir}\/arialmt.ttf %{buildroot}\/usr\/share\/dotplus\/fonts\/arialmt.ttf  %files \/usr\/bin\/dotplus \/usr\/share\/dotplus\/fonts\/arialmt.ttf  %changelog * Mon Jun 30 2025 Danil Nigmatullin &lt;danil.communication@gmail.com&gt; - {{VERSION}}-1 - Initial RPM build <\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \ud83d\udcc4 <code>tools\/<\/code><a href=\"http:\/\/generate.sh\" rel=\"noopener noreferrer nofollow\"><code>generate.sh<\/code><\/a>:<\/p>\n<pre><code class=\"bash\">    # tools\/generate.sh     #!\/usr\/bin\/env bash     set -e      VERSION=\"1.0.0\"     echo \"\ud83d\ude80 Starting multi-arch build: version $VERSION\"     START=$(date +%s)      ARCHS=(       \"amd64\"    # x86_64-unknown-linux-gnu       \"arm64\"    # aarch64-unknown-linux-gnu       \"armhf\"    # armv7-unknown-linux-gnueabihf     )     TARGETS=(       \"x86_64-unknown-linux-gnu\"       \"aarch64-unknown-linux-gnu\"       \"armv7-unknown-linux-gnueabihf\"     )     DEB_ARCHS=(       \"amd64\"       \"arm64\"       \"armhf\"     )     RPM_ARCHS=(       \"x86_64\"       \"aarch64\"       \"armv7hl\"     )      ROOT_DIR=\"$(git rev-parse --show-toplevel)\"      TEMPLATE_DIR=\"$ROOT_DIR\/templates\"      mkdir -p build      FAILED=()      for i in \"${!ARCHS[@]}\"; do       ARCH=\"${ARCHS[$i]}\"       TARGET=\"${TARGETS[$i]}\"       DEB_ARCH=\"${DEB_ARCHS[$i]}\"       RPM_ARCH=\"${RPM_ARCHS[$i]}\"        echo \"\ud83d\udd27 Building for $ARCH ($TARGET)...\"        CROSS_SKIP_VERSION_CHECK=1 cross build \\         --release \\         --target \"$TARGET\" \\         --manifest-path Cargo.toml \\         --verbose || { echo \"\u26a0\ufe0f Build failed for $TARGET\"; FAILED+=(\"$ARCH\"); continue; }        BIN=\"target\/$TARGET\/release\/dotplus\"        ls -lh \"target\/$TARGET\/release\"        if [[ ! -f \"$BIN\" ]]; then         echo \"\u274c Build failed for $TARGET\"         FAILED+=(\"$ARCH\")         continue       fi        BUILD_DIR=\"build\/$ARCH\"       DEB_DIR=\"$BUILD_DIR\/deb\"       RPM_DIR=\"$BUILD_DIR\/rpm\"        mkdir -p \"$DEB_DIR\/DEBIAN\"       mkdir -p \"$DEB_DIR\/usr\/bin\"       mkdir -p \"$RPM_DIR\/SOURCES\"        cp \"$BIN\" \"$DEB_DIR\/usr\/bin\/dotplus\"       cp \"$BIN\" \"$RPM_DIR\/SOURCES\/dotplus\"       cp src\/tools\/font\/arialmt.ttf \"$RPM_DIR\/SOURCES\/arialmt.ttf\"        # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (\u0448\u0440\u0438\u0444\u0442\u044b)       mkdir -p \"$DEB_DIR\/usr\/share\/dotplus\/fonts\"       cp src\/tools\/font\/arialmt.ttf \"$DEB_DIR\/usr\/share\/dotplus\/fonts\/\"        # === .deb ===       sed \\         -e \"s\/{{VERSION}}\/$VERSION\/\" \\         -e \"s\/{{ARCH}}\/$DEB_ARCH\/\" \\         -e \"s\/{{DEPENDS}}\/libc6 (&gt;= 2.29)\/\" \\         \"$TEMPLATE_DIR\/control.in\" &gt; \"$DEB_DIR\/DEBIAN\/control\"        dpkg-deb --build \"$DEB_DIR\" \"$BUILD_DIR\/dotplus_${VERSION}_${DEB_ARCH}.deb\"        # === .rpm ===       SPEC_OUT=\"$RPM_DIR\/dotplus.spec\"       sed \\         -e \"s\/{{VERSION}}\/$VERSION\/\" \\         -e \"s\/{{ARCH}}\/$RPM_ARCH\/\" \\         -e \"s\/{{REQUIRES}}\/glibc &gt;= 2.29\/\" \\         \"$TEMPLATE_DIR\/spec.in\" &gt; \"$SPEC_OUT\"        RPM_BUILDROOT=\"$RPM_DIR\/BUILDROOT\/dotplus-${VERSION}-1.${RPM_ARCH}\"        mkdir -p \"$RPM_BUILDROOT\/usr\/bin\"       cp \"$BIN\" \"$RPM_BUILDROOT\/usr\/bin\/dotplus\"       chmod +x \"$RPM_BUILDROOT\/usr\/bin\/dotplus\"        # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (\u0448\u0440\u0438\u0444\u0442\u044b)       FONT_SOURCE=\"src\/tools\/font\/arialmt.ttf\"       FONT_DEST=\"$RPM_DIR\/BUILDROOT\/dotplus-${VERSION}-1.${RPM_ARCH}\/usr\/share\/dotplus\/fonts\"       mkdir -p \"$FONT_DEST\"        if [[ -f \"$FONT_SOURCE\" ]]; then         cp \"$FONT_SOURCE\" \"$FONT_DEST\"         echo \"\u2705 \u0428\u0440\u0438\u0444\u0442 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d: $FONT_SOURCE \u2192 $FONT_DEST\"       else         echo \"\u26a0\ufe0f WARNING: $FONT_SOURCE \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 .spec\"         sed -i '\/\\\/usr\\\/share\\\/dotplus\\\/fonts\\\/arialmt.ttf\/d' \"$SPEC_OUT\"       fi        if [[ \"$ARCH\" == \"amd64\" ]]; then         echo \"\ud83d\udce6 Building RPM for $ARCH...\"         rpmbuild \\           --define \"_topdir $ROOT_DIR\/$RPM_DIR\" \\           --define \"_sourcedir $ROOT_DIR\/$RPM_DIR\/SOURCES\" \\           --define \"_builddir $ROOT_DIR\/$RPM_DIR\/BUILD\" \\           --define \"_specdir $ROOT_DIR\/$RPM_DIR\" \\           --define \"_rpmdir $ROOT_DIR\/$RPM_DIR\/RPMS\" \\           --define \"_buildrootdir $ROOT_DIR\/$RPM_DIR\/BUILDROOT\" \\           --target \"$RPM_ARCH-redhat-linux\" \\           -bb \"$SPEC_OUT\" || {             echo \"\u274c RPM build failed for $TARGET\"             FAILED+=(\"$ARCH\")             continue           }          RPM_OUTPUT=$(find \"$RPM_DIR\/RPMS\" -name \"*.rpm\")         if [[ -n \"$RPM_OUTPUT\" ]]; then           echo \"\u2705 RPM built for $ARCH: $RPM_OUTPUT\"         else           echo \"\u274c RPM not found for $ARCH\"           FAILED+=(\"$ARCH\")         fi       else         echo \"\u26a0\ufe0f Skipping RPM build for $ARCH\"       fi        echo \"\u2705 RPM build completed for $ARCH\"              echo \"\ud83d\udcc1 RPM output dir listing:\"       ls -lR \"$RPM_DIR\"        echo \"\ud83d\udce6 Checking built RPMs:\"       find \"$RPM_DIR\/RPMS\" -type f 2&gt;\/dev\/null || true      done      END=$(date +%s)     DURATION=$((END - START))      if [[ ${#FAILED[@]} -gt 0 ]]; then       echo \"\u274c Failed builds: ${FAILED[*]}\"     else       echo \"\u2705 All target builds succeeded\"     fi      echo \"\ud83c\udf89 Build finished in $DURATION seconds.\"      # \ud83e\uddea \u041f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b     echo \"\ud83d\udce6 Built package files:\"     find build -type f \\( -name \"*.deb\" -o -name \"*.rpm\" \\)      # \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 .deb \u0438 .rpm     PACKAGE_COUNT=$(find build -type f \\( -name \"*.deb\" -o -name \"*.rpm\" \\) | wc -l | tr -d '[:space:]')          echo \"\ud83e\uddea DEBUG: Found packages:\"     FOUND_PACKAGES=$(find build -type f \\( -name \"*.deb\" -o -name \"*.rpm\" \\))     echo \"$FOUND_PACKAGES\"      # \u0415\u0441\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u2014 \u043e\u0448\u0438\u0431\u043a\u0430     if [[ \"$PACKAGE_COUNT\" -lt 1 ]]; then       echo \"\u274c No packages were created (check target paths or build errors)\"       echo \"\ud83d\udca1 Hint: verify that .deb and .rpm were written to expected build\/**\/ paths\"       exit 1     fi      echo \"\u2705 Total packages created: $PACKAGE_COUNT\" <\/code><\/pre>\n<p>\u041e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 <code>.deb<\/code>\/<code>.rpm<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>dpkg-deb<\/code> \u0438 <code>rpmbuild<\/code>, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u0440\u0435\u043b\u0438\u0437\u0430.<\/p>\n<h4>\ud83d\udc33 Docker-\u0441\u0431\u043e\u0440\u043a\u0430<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f Docker-\u0441\u0431\u043e\u0440\u043a\u0430 CLI-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 DotPlus:<\/p>\n<pre><code class=\"yaml\">- name: Build Docker image   run: |     docker build -f docker\/Dockerfile.cli -t ghcr.io\/nigdanil\/dotplus:latest .     docker push ghcr.io\/nigdanil\/dotplus:latest<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 <code>Dockerfile.cli<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a:<\/p>\n<pre><code class=\"dart\">FROM debian:bookworm-slim COPY dotplus \/usr\/local\/bin\/dotplus ENTRYPOINT [\"dotplus\"]<\/code><\/pre>\n<h4>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432<\/h4>\n<p>\u0412\u0441\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438, <code>.deb<\/code>, <code>.rpm<\/code>) \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u044e\u0442\u0441\u044f \u043a GitHub Release. \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u044e: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442.<\/p>\n<h4>\ud83e\udde9 \u0427\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0443\u0447\u0435\u0441\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>\u274c <code>musl<\/code> \u0438 <code>arm64-darwin<\/code> \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u2014 \u043d\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b<\/p>\n<\/li>\n<li>\n<p>\u26a0\ufe0f <code>cross<\/code> \u043d\u0435 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437\u044b \u043c\u0435\u0436\u0434\u0443 \u043f\u0443\u0448\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Docker \u043d\u0443\u0436\u0435\u043d \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<h4>\ud83d\udccc \u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0440\u0435\u043b\u0438\u0437\u0430<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"171\" width=\"171\">\n<p align=\"left\">\u0424\u043e\u0440\u043c\u0430\u0442<\/p>\n<\/td>\n<td data-colwidth=\"192\" width=\"192\">\n<p align=\"left\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"171\" width=\"171\">\n<p align=\"left\"><code>.tar.gz<\/code> (\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a)<\/p>\n<\/td>\n<td data-colwidth=\"192\" width=\"192\">\n<p align=\"left\">x86_64, armhf, arm64<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"171\" width=\"171\">\n<p align=\"left\"><code>.deb<\/code><\/p>\n<\/td>\n<td data-colwidth=\"192\" width=\"192\">\n<p align=\"left\">x86_64, armhf, arm64<\/p>\n<\/td>\n<td>\n<p align=\"left\">Ubuntu, Debian, Raspberry Pi<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"171\" width=\"171\">\n<p align=\"left\"><code>.rpm<\/code><\/p>\n<\/td>\n<td data-colwidth=\"192\" width=\"192\">\n<p align=\"left\">x86_64<\/p>\n<\/td>\n<td>\n<p align=\"left\">Fedora, RHEL, CentOS, openSUSE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"171\" width=\"171\">\n<p align=\"left\">Docker<\/p>\n<\/td>\n<td data-colwidth=\"192\" width=\"192\">\n<p align=\"left\">\u041b\u044e\u0431\u0430\u044f (\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, CI\/CD, DevOps<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\ud83d\udc33 Docker: \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0438 \u043a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0438\u043b\u0441\u044f \u0432 \u0441\u0431\u043e\u0440\u043a\u0443<\/h4>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Docker-\u043e\u0431\u0440\u0430\u0437 DotPlus \u043d\u0435 \u0441\u0442\u043e\u044f\u043b\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0443\u043f\u043e\u0440 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e: Docker \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e &#171;\u0432 \u0434\u043e\u0432\u0435\u0441\u043e\u043a&#187;, \u0430 <strong>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442<\/strong>, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u043a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0443 \u0432 CI;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CLI \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c DotPlus \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445 DevOps \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<h4>\ud83d\udd0d \u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043d Docker?<\/h4>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Docker:<\/strong><\/p>\n<ol>\n<li>\n<p>\u2705 <strong>\u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 CI\/CD<\/strong><br \/> \u0414\u0430\u0436\u0435 <code>cross<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0442\u044b \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0448\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 GitHub Actions), Docker \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/strong><br \/> CLI-\u0432\u0435\u0440\u0441\u0438\u044f DotPlus \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Docker \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0446\u0435\u043d\u043d\u043e \u0434\u043b\u044f DevOps \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430-\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432<\/strong><br \/> \u041e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0437 \u2014 \u043e\u0434\u0438\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0415\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0431\u0443\u0434\u044c \u0442\u043e Windows, Linux \u0438\u043b\u0438 macOS (\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c Docker).<\/p>\n<\/li>\n<li>\n<p>\u2705 <strong>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 GUI \u0438 CLI<\/strong><br \/> Docker \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f CLI<\/strong>. \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0437, \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043d\u0435 \u0442\u044f\u043d\u0435\u0442 GUI-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<h3>\ud83d\udee0 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Dockerfile<\/h3>\n<p>\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>Dockerfile.cli<\/code>:<\/p>\n<pre><code class=\"dart\">FROM debian:bookworm-slim COPY dotplus \/usr\/local\/bin\/dotplus ENTRYPOINT [\"dotplus\"]<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 (\u043d\u0430 \u0431\u0430\u0437\u0435 slim-\u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 Debian), \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a <code>dotplus<\/code>. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u043b\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. <\/p>\n<h4>\u2699\ufe0f \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 CI<\/h4>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 CLI:<\/p>\n<pre><code class=\"yaml\">- name: Build Docker image   run: |     docker build -f docker\/Dockerfile.cli -t ghcr.io\/nigdanil\/dotplus:latest .     docker push ghcr.io\/nigdanil\/dotplus:latest<\/code><\/pre>\n<p>Docker-\u043e\u0431\u0440\u0430\u0437 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/hub.docker.com\/r\/nigdanil\/dotplus-cli\" rel=\"noopener noreferrer nofollow\">Docker Hub<\/a>, \u043e\u0442\u043a\u0443\u0434\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c:<\/p>\n<pre><code class=\"bash\">docker pull nigdanil\/dotplus-cli:latest<\/code><\/pre>\n<h4>\ud83d\ude80 \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-\u0432\u0435\u0440\u0441\u0438\u044e DotPlus<\/h4>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 CLI \u0432\u043d\u0443\u0442\u0440\u0438 Docker:<\/p>\n<pre><code class=\"bash\">docker run --rm -v $(pwd):\/out ghcr.io\/nigdanil\/dotplus:latest \\   --text \"Docker test\" --format qrcode --output \/out\/code.png<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435:<\/p>\n<ul>\n<li>\n<p><code>--rm<\/code> \u2014 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>-v $(pwd):\/out<\/code> \u2014 \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><code>--text<\/code>, <code>--format<\/code>, <code>--output<\/code> \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b CLI DotPlus<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DotPlus \u0432 \u043b\u044e\u0431\u043e\u043c CI, \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043d\u0430 macOS \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0432 WSL \u2014 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 Docker.<\/p>\n<p>\ud83d\udcbb \u0417\u0430\u043f\u0443\u0441\u043a DotPlus \u0447\u0435\u0440\u0435\u0437 Docker \u043d\u0430 Windows (<code>.bat<\/code>-\u0444\u0430\u0439\u043b\u044b)<\/p>\n<p>\ud83d\udc49 \u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Windows \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u044b \u0443\u0434\u043e\u0431\u043d\u044b\u0435 <code>.bat<\/code>-\u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 CLI DotPlus \u0432\u043d\u0443\u0442\u0440\u0438 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e QR \u0438 \u0448\u0442\u0440\u0438\u0445\u043a\u043e\u0434\u043e\u0432 <strong>\u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/strong>.<\/p>\n<p> \ud83d\udcc4 <code>run-qr.bat<\/code> \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432<\/p>\n<pre><code class=\"yaml\">@echo off REM \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f QR-\u043a\u043e\u0434\u043e\u0432 \u0438\u0437 CSV \u0447\u0435\u0440\u0435\u0437 Docker  docker run --rm -v \"%cd%\\examples:\/examples\" nigdanil\/dotplus-cli:1.0.0 ^   --mode qr ^   --csv \"\/examples\/magnit\/data\/qr\/magnit.csv\" ^   --logo \"\/examples\/magnit\/logo\/v1.png\" ^   --output \"\/examples\/magnit\/img\/qr\" ^   --cols 3 ^   --rows 3 ^   --qr-size 150 ^   --font-size 24 ^   --font-color \"#000000\"  pause<\/code><\/pre>\n<p>\ud83d\udcc4 <code>run-barcode.bat<\/code> \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f EAN-13 \u0448\u0442\u0440\u0438\u0445\u043a\u043e\u0434\u043e\u0432<\/p>\n<pre><code class=\"yaml\">@echo off REM \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0448\u0442\u0440\u0438\u0445\u043a\u043e\u0434\u043e\u0432 EAN-13 \u0438\u0437 CSV \u0447\u0435\u0440\u0435\u0437 Docker  docker run --rm -v \"%cd%\\examples:\/examples\" nigdanil\/dotplus-cli:1.0.0 ^   --mode barcode ^   --csv \"\/examples\/magnit\/data\/barcode\/magnit-barcodes-EAN-13.csv\" ^   --output \"\/examples\/magnit\/img\/barcode\" ^   --barcode-type EAN-13 ^   --cols 3 ^   --rows 4 ^   --width 300 ^   --height 100 ^   --font-size 22 ^   --label-height 40 ^   --offset-y 10 ^   --spacing-x 20 ^   --spacing-y 20  pause<\/code><\/pre>\n<p>\ud83d\udcc2 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/p>\n<pre><code class=\"bash\">D:\\dotplus-windows\\   \u251c\u2500\u2500 examples\\   \u251c\u2500\u2500 run-qr.bat   \u2514\u2500\u2500 run-barcode.bat<\/code><\/pre>\n<p>\ud83d\udccc \u0421\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u043f\u0430\u043f\u043a\u0443 <code>examples<\/code> \u0432\u043d\u0443\u0442\u0440\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Docker. <\/p>\n<h4>\u2705 \u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e?<\/h4>\n<ul>\n<li>\n<p>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c <code>Rust<\/code>, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0441\u0430\u043c <code>dotplus<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Docker<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e, \u0441\u043a\u0440\u0438\u043f\u0442\u044b, CI\/CD<\/p>\n<\/li>\n<\/ul>\n<h4>\ud83d\udccc \u0427\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Docker<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Docker<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0430 \u0432 CI<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>cross<\/code> + Docker-\u043e\u0431\u0440\u0430\u0437\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0431\u0440\u0430\u0437 \u0441 CLI \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 shell-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">CLI \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0431\u0440\u0430\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>dotplus<\/code> \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u2705 <strong>\u0412\u044b\u0432\u043e\u0434<\/strong>: Docker \u0441\u0442\u0430\u043b \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b DotPlus. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0438 \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 CLI. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u2014 \u0431\u0443\u0434\u044c \u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440, CI\/CD \u0438\u043b\u0438 \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h3>\ud83d\udcdc \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f DotPlus: \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043a \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0443<\/h3>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 DotPlus \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u043e\u0434 Linux, \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e: \u043f\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u0440\u0438\u0447\u0438\u043d \u044d\u0442\u043e\u043c\u0443 \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 \u043e\u043d\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043a\u0430\u043a \u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438, \u0442\u0430\u043a \u0438 \u0441 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435:<\/p>\n<blockquote>\n<p>\ud83d\udccc <strong>\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e, \u043d\u043e \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e.<\/strong><\/p>\n<\/blockquote>\n<h4>\u2753 \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a?<\/h4>\n<p><strong>\u0412\u043e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0438\u0441\u043a\u043e\u0432 \u0444\u043e\u0440\u043a\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0440\u0435\u043d\u0434\u0430<\/strong><br \/> \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u043c, \u0432\u0435\u043b\u0438\u043a \u0440\u0438\u0441\u043a &#171;\u0441\u0435\u0440\u044b\u0445&#187; \u043a\u043b\u043e\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0440\u0443\u0448\u0430\u0442\u044c \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f DotPlus \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443<\/strong><br \/> \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0447\u0430\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0432\u043d\u043e\u0441\u044f\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0434\u0430\u044e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u0449\u0438\u0442\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432<\/strong><br \/> DotPlus \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u043e\u0432, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 QR, \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0438 \u0442. \u0434. \u0418\u0445 \u0437\u0430\u0449\u0438\u0442\u0430 \u2014 \u043a\u043b\u044e\u0447 \u043a \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430\u0445, \u0430 \u043d\u0435 \u043d\u0430 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u0445 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430<\/strong><br \/> \u0412\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445.<\/p>\n<\/li>\n<\/ol>\n<h3>\u2705 \u0427\u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u043e \u043d\u043e\u0432\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438?<\/h3>\n<ul>\n<li>\n<p>\ud83d\udd13 \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <strong>\u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0446\u0435\u043b\u0435\u0439<\/strong> \u2014 \u043a\u0430\u043a \u0432 \u043b\u0438\u0447\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\ud83d\udce6 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 <strong>\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432<\/strong><\/p>\n<\/li>\n<li>\n<p>\ud83d\udc65 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u0445, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, CI\/CD \u0438 \u0442. \u043f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u274c \u0427\u0442\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e?<\/h3>\n<ul>\n<li>\n<p>\ud83d\udeab \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435, \u0430\u043d\u0430\u043b\u0438\u0437, \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\ud83d\udeab \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 <strong>\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/strong> \u0432\u0435\u0440\u0441\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\ud83d\udeab \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/p>\n<\/li>\n<\/ul>\n<h3>\ud83d\udcc1 \u041a\u0430\u043a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f DotPlus \u0441\u0435\u0439\u0447\u0430\u0441?<\/h3>\n<ul>\n<li>\n<p>\u2705 \u0422\u043e\u043b\u044c\u043a\u043e \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 (<code>.exe<\/code>, <code>.deb<\/code>, <code>.rpm<\/code>, <code>.tar.gz<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u2705 \u0427\u0435\u0440\u0435\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 GitHub Releases \u0438 Docker Registry<\/p>\n<\/li>\n<\/ul>\n<h3>\ud83d\udcc4 \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 (\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442)<\/h3>\n<blockquote>\n<p><strong>\u0422\u0438\u043f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438:<\/strong> \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u041f\u041e (\u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u043e\u0435)<br \/> <strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434:<\/strong> \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f<br \/> <strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:<\/strong> \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f<br \/> <strong>\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430:<\/strong> \u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430<br \/> <strong>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435:<\/strong> \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0432\u0438\u0434\u0435 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f<br \/> <strong>\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0430:<\/strong> \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u043e\u043c<\/p>\n<\/blockquote>\n<h3>\u26a0\ufe0f \u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0447\u0435\u0441\u0442\u043d\u043e?<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e, DotPlus \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c \u0441 Linux, Windows, Docker;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <strong>\u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u043d\u043b\u0430\u0439\u043d-\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 CLI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, GUI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u0441\u0435 \u043e\u043f\u0446\u0438\u0438 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f CSV, \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u044b, \u044d\u043a\u0441\u043f\u043e\u0440\u0442) <strong>\u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>.<\/p>\n<p>\u2705 <strong>\u0412\u044b\u0432\u043e\u0434<\/strong>: \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f DotPlus \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u0430\u044f, \u043d\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u2014 \u0431\u0435\u0437 \u0441\u0442\u0440\u0430\u0445\u0430 \u043f\u0435\u0440\u0435\u0434 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438.<\/p>\n<h4>\ud83d\udcc8 \u0418\u0442\u043e\u0433\u0438 \u0438 \u043f\u043b\u0430\u043d\u044b \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f DotPlus<\/h4>\n<p>DotPlus \u043f\u0440\u043e\u0448\u0451\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 Windows-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 CLI, GUI, Docker \u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u043c\u0438 \u043f\u043e\u0434 Linux. \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0431\u044b\u043b \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c, \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.<\/p>\n<h4>\u2705 \u0427\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\"><strong>\u0421\u0442\u0430\u0442\u0443\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udda5 GUI \u0434\u043b\u044f Windows \u0438 Linux<\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\">\u2705 \u0413\u043e\u0442\u043e\u0432\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430 \u0431\u0430\u0437\u0435 <code>eframe<\/code>\/<code>egui<\/code>, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0444\u043b\u0430\u0439\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\uddfe CLI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\">\u2705 \u0413\u043e\u0442\u043e\u0432\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f QR\/\u0448\u0442\u0440\u0438\u0445\u043a\u043e\u0434\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udce6 DEB \u0438 RPM-\u043f\u0430\u043a\u0435\u0442\u044b<\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\">\u2705 \u0412 \u0440\u0435\u043b\u0438\u0437\u0430\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udc33 Docker-\u043e\u0431\u0440\u0430\u0437<\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\">\u2705 \u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udd04 CI\/CD-\u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0440\u0435\u043b\u0438\u0437\u044b<\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\">\u2705 \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0432 GitHub Releases + GHCR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udd10 \u041f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f<\/p>\n<\/td>\n<td data-colwidth=\"180\" width=\"180\">\n<p align=\"left\">\u2705 \u0412\u0432\u0435\u0434\u0435\u043d\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0431\u0435\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\ud83d\udee0 \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/h4>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/cross-rs\/cross\" rel=\"noopener noreferrer nofollow\"><code>cross<\/code><\/a> \u0434\u043b\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 (x86_64, ARMv7, AArch64)<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f <code>.deb<\/code> \u0438 <code>.rpm<\/code> \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u0440\u0438\u043f\u0442 <code>tools\/<\/code><a href=\"http:\/\/generate.sh\" rel=\"noopener noreferrer nofollow\"><code>generate.sh<\/code><\/a><\/p>\n<\/li>\n<li>\n<p>CI\/CD \u043d\u0430 GitHub Actions, \u043e\u0434\u0438\u043d YAML \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0447\u0435\u0440\u0435\u0437  Docker Hub:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">docker pull nigdanil\/dotplus-cli:latest<\/code><\/pre>\n<h2>\ud83d\udd2e \u0427\u0442\u043e \u0432 \u043f\u043b\u0430\u043d\u0430\u0445?<\/h2>\n<p>\u0412\u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\"><strong>\u041f\u043b\u0430\u043d<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\"><strong>\u0421\u0442\u0430\u0442\u0443\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\ud83d\udcc4 \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 PDF \u0438 SVG<\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\ud83d\udd1c \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438 \u0442\u0438\u043f\u043e\u0433\u0440\u0430\u0444\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\ud83c\udf10 Web-\u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 WASM<\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\ud83d\udd1c \u0418\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0431\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\ud83d\udcc4 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 CSV<\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\ud83d\udd1c \u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\ud83d\udd04 \u0410\u0432\u0442\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f GUI<\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\ud83d\udd1c \u0411\u0443\u0434\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f Windows-\u0432\u0435\u0440\u0441\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\u2699\ufe0f \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 CLI<\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\ud83d\udd1c \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u043e\u043b\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\ud83d\udd14 \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439<\/p>\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\ud83d\udd1c \u0427\u0435\u0440\u0435\u0437 <code>notify-rust<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043a\u0430 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0438\u0447\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"221\" width=\"221\">\n<p align=\"left\">\n<\/td>\n<td data-colwidth=\"190\" width=\"190\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\ud83e\udd1d \u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0435<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0438\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0434\u0435\u044e \u2014 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0439\u0442\u0435 issue \u043d\u0430 GitHub:<\/p>\n<p>\ud83d\udccc <a href=\"https:\/\/github.com\/nigdanil\/dotplus\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/nigdanil\/dotplus<\/a><\/p>\n<h3>\u2705 \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/h3>\n<p>DotPlus \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c, \u043c\u043e\u0449\u043d\u044b\u043c \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 QR \u0438 \u0448\u0442\u0440\u0438\u0445\u043a\u043e\u0434\u043e\u0432.<br \/> \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, Docker \u0438 \u043e\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u2014 \u043e\u0442 \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u043e CI-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.<\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442 \u0438 \u0434\u0430\u0451\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/924976\/\"> https:\/\/habr.com\/ru\/articles\/924976\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\ud83d\udd27 \u041a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0430 CLI \u0438 GUI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Rust \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>DotPlus \u2014 \u044d\u0442\u043e Rust-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434 Windows, \u043d\u043e \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u0431\u044b\u043b\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0434 Linux \u0438 Docker.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 <strong>Linux-\u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 GUI \u0438 CLI<\/strong> \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u043f\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440.<\/p>\n<h3>\u2757 \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e cargo build?<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 x86_64, \u043d\u043e \u0438 \u043f\u043e\u0434 ARM (Raspberry Pi, \u0441\u0435\u0440\u0432\u0435\u0440\u044b), \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>cargo build<\/code> \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u044b <strong>\u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b<\/strong> (<code>gcc-aarch64-linux-gnu<\/code> \u0438 \u0434\u0440.)<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 sysroot, musl, glibc<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <strong>GUI<\/strong> (\u0447\u0435\u0440\u0435\u0437 <code>eframe<\/code> \u0438 <code>egui<\/code>) \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 OpenGL, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u043b\u0438 <code>rfd<\/code> (\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0438)<\/p>\n<\/li>\n<\/ul>\n<h3>\ud83d\udee0 \u0420\u0435\u0448\u0435\u043d\u0438\u0435: cross-rs<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 <code>--target<\/code>-\u0444\u043b\u0430\u0433\u043e\u0432 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 toolchain, \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/cross-rs\/cross\" rel=\"noopener noreferrer nofollow\"><code>cross<\/code><\/a> \u2014 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442  \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 Rust, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">cross build --release --target aarch64-unknown-linux-gnu<\/code><\/pre>\n<ul>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043a\u0430\u043a \u0441 CLI, \u0442\u0430\u043a \u0438 \u0441 GUI (\u0435\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 dev-\u043f\u0430\u043a\u0435\u0442\u044b)<\/p>\n<\/li>\n<\/ul>\n<h3>\u2699\ufe0f \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f: cross.toml<\/h3>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0435\u0433\u043e <code>cross.toml<\/code>, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"yaml\">[target.aarch64-unknown-linux-gnu] image = \"ghcr.io\/cross-rs\/aarch64-unknown-linux-gnu:edge\"  [target.armv7-unknown-linux-gnueabihf] image = \"ghcr.io\/cross-rs\/armv7-unknown-linux-gnueabihf:edge\"  [target.x86_64-unknown-linux-gnu] image = \"ghcr.io\/cross-rs\/x86_64-unknown-linux-gnu:edge\"<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0437\u044b <code>edge<\/code> \u2014 \u044d\u0442\u043e \u0441\u0432\u0435\u0436\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 <code>egui<\/code>, <code>eframe<\/code> \u0438 <code>rfd<\/code> \u0432 Linux-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h3>\ud83e\uddf1 GUI + CLI: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0444\u0438\u0447<\/h3>\n<pre><code class=\"yaml\">[features] default = [\"gui\"] gui = [\"eframe\", \"egui\", \"rfd\", \"egui_extras\"] notifications = [\"notify-rust\"]<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443: <\/p>\n<ul>\n<li>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 CLI-\u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0431\u0435\u0437 GUI (<code>--no-default-features<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 Linux \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c <strong>\u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/strong>, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 GTK\/Wayland GUI \u0447\u0435\u0440\u0435\u0437 <code>eframe<\/code><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c:<\/strong> \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 headless-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<h3>\ud83e\ude93 \u041e\u0442 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0443\u0441\u043f\u0435\u0445 \u0441 <code>cross<\/code>, \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c:<\/p>\n<ul>\n<li>\n<p><strong>musl-\u0441\u0431\u043e\u0440\u043a\u0438 <\/strong>(\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0438\u043d\u043a\u0443\u0435\u043c\u044b\u0435) \u0431\u044b\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u2014 <code>eframe<\/code> \u0438 <code>rfd<\/code> \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><strong>Windows ARM <\/strong>MIPS \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b \u0438 \u0441\u043b\u0430\u0431\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>cross<\/code><\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u0438\u0448\u043a\u043e\u043c &#171;\u0447\u0438\u0441\u0442\u0430\u044f&#187; \u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0435\u0437 Docker <\/strong>\u2014 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0434\u0435\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 GUI \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e, \u0438 \u043e\u043d\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0430 GitHub Actions runner&#8217;\u0430\u0445<\/p>\n<\/li>\n<\/ul>\n<h3>\u2705 \u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h3>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>cross<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 GUI+CLI \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043f\u043e\u0434 Linux \u0434\u043b\u044f \u0442\u0440\u0451\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\"><code>x86_64-unknown-linux-gnu<\/code><\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u2705 GUI\/CLI<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0435\u0441\u043a\u0442\u043e\u043f\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\"><code>aarch64-unknown-linux-gnu<\/code><\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u2705 GUI\/CLI<\/p>\n<\/td>\n<td>\n<p align=\"left\">ARM64 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, RPi 4 \u0438 \u043d\u043e\u0432\u0435\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"267\" width=\"267\">\n<p align=\"left\"><code>armv7-unknown-linux-gnueabihf<\/code><\/p>\n<\/td>\n<td data-colwidth=\"135\" width=\"135\">\n<p align=\"left\">\u2705 GUI\/CLI<\/p>\n<\/td>\n<td>\n<p align=\"left\">RPi 3 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 ARMv7 SBC<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u2705 \u0418\u0442\u043e\u0433: \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f cross<\/h3>\n<p>DotPlus \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Linux \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0438 CLI. \u041e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 UX, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 Raspberry Pi \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<h3>\ud83d\ude80 CI\/CD: \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u0432<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 <code>cross<\/code> \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e: \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0439, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b:<\/p>\n<ul>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c DotPlus \u043f\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b <code>.deb<\/code> \u0438 <code>.rpm<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c Docker-\u043e\u0431\u0440\u0430\u0437<\/p>\n<\/li>\n<li>\n<p>\u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437 \u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u0440\u043e\u0434\u0438\u043b\u0441\u044f CI\/CD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 \u0431\u0430\u0437\u0435 <strong>GitHub Actions<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<h4>\ud83d\udcc2 \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/h4>\n<p>CI\/CD \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043e\u0434\u043d\u043e\u043c workflow-\u0444\u0430\u0439\u043b\u0435 \ud83d\udcc4 build-multiarch.yml:<\/p>\n<pre><code class=\"yaml\">name: Build dotplus (.deb\/.rpm) for all architectures  on:   push:     branches: [linux]     tags: [\"v*\"]   workflow_dispatch:  jobs:   build:     runs-on: ubuntu-latest     env:       CROSS_SKIP_VERSION_CHECK: \"1\"     steps:       - name: \ud83e\uddfe Checkout         uses: actions\/checkout@v4        - name: \u26a1\ufe0f Cache Cargo         uses: actions\/cache@v4         with:           path: |             ~\/.cargo\/bin             ~\/.cargo\/registry             ~\/.cargo\/git           key: ${{ runner.os }}-cargo-${{ hashFiles('**\/Cargo.lock') }}           restore-keys: |             ${{ runner.os }}-cargo-        - name: \ud83e\uddec Enable QEMU for multi-arch RPM         uses: docker\/setup-qemu-action@v3         with:           platforms: all        - name: \ud83e\udd80 Install Rust         uses: actions-rs\/toolchain@v1         with:           toolchain: stable           override: true           components: rustfmt        - name: \ud83c\udfaf Add targets         run: |           rustup target add \\             x86_64-unknown-linux-gnu \\             aarch64-unknown-linux-gnu \\             armv7-unknown-linux-gnueabihf        - name: \ud83d\udc33 Install Docker &amp; Cross         run: |           sudo apt update           sudo apt install -y docker.io containerd           if ! command -v cross &amp;&gt;\/dev\/null; then             cargo install cross           else             echo \"\u2705 cross \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\"           fi        - name: \ud83d\udce6 Install deb\/rpm tools         run: |           sudo apt install -y \\             dpkg-dev debhelper rpm rpm2cpio fakeroot \\             qemu-user-static binfmt-support \\             gcc-multilib libc6-dev-i386 pkg-config \\             libssl-dev libstdc++-12-dev        - name: \ud83d\udd27 Make script executable         run: chmod +x tools\/generate.sh        - name: \ud83d\udee0 Run build script         run: .\/tools\/generate.sh        - name: \u2601\ufe0f Upload artifacts         uses: actions\/upload-artifact@v4         with:           name: dotplus-packages           path: |             build\/**\/dotplus_*.deb             build\/**\/RPMS\/**\/*.rpm    docker:     runs-on: ubuntu-latest     needs: build     steps:       - name: \ud83e\uddfe Checkout         uses: actions\/checkout@v4        - name: \ud83e\udd80 Install Rust + cross         run: |           rustup update           rustup target add x86_64-unknown-linux-musl           cargo install cross        - name: \ud83d\udee0 Build static binary (musl, CLI-only)         run: cross build --release --target x86_64-unknown-linux-musl --no-default-features        - name: \ud83e\uddf0 Prepare Docker context         run: |           if [[ -f target\/x86_64-unknown-linux-musl\/release\/dotplus ]]; then             cp target\/x86_64-unknown-linux-musl\/release\/dotplus docker\/dotplus           else             echo \"\u274c Static binary not found\"             exit 1           fi        - name: \ud83d\udc33 Build Docker image         run: docker build -t dotplus-cli -f docker\/Dockerfile.cli .\/docker        - name: \u2601\ufe0f Save Docker image as archive         run: docker save dotplus-cli | gzip &gt; dotplus-cli.tar.gz        - name: \u2601\ufe0f Upload Docker image artifact         uses: actions\/upload-artifact@v4         with:           name: dotplus-cli-docker           path: dotplus-cli.tar.gz <\/code><\/pre>\n<p>\ud83d\udcc4 build-multiarch.yml \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0443\u0448\u0435 \u0432 \u0432\u0435\u0442\u043a\u0438 <code>release-linux<\/code> \u0438\u043b\u0438 <code>release-docker<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443, \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443, \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u0434\u0435\u043f\u043b\u043e\u0439.<\/p>\n<h4>\u2699\ufe0f \u042d\u0442\u0430\u043f\u044b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/h4>\n<p><strong>\u0414\u0430\u0442\u0430:<\/strong> 01.07.2025<br \/><strong>\u0424\u0430\u0439\u043b Workflow:<\/strong> <code>build-multiarch.yml<\/code><br \/><strong>\u0422\u0440\u0438\u0433\u0433\u0435\u0440:<\/strong> Push \u0432 \u0432\u0435\u0442\u043a\u0443 <code>linux<\/code><\/p>\n<p>\ud83d\udce6 \u042d\u0442\u0430\u043f 1: <code>build<\/code> (\u23f1 ~16 \u043c\u0438\u043d\u0443\u0442)<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0428\u0430\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2699\ufe0f <code>Set up job<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udce5 <code>Checkout<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u26a1 <code>Cache Cargo<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\udde9 <code>Enable QEMU for multi-arch RPM<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\udd80 <code>Install Rust<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Rust<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83c\udfaf <code>Add targets<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udc33 <code>Install Docker &amp; Cross<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Docker \u0438 <code>cross<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\uddf0 <code>Install deb\/rpm tools<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udd27 <code>Make script executable<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u25b6\ufe0f <code>Run build script<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 <code>.deb<\/code> \u0438 <code>.rpm<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2b06\ufe0f <code>Upload artifacts<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u267b\ufe0f Post-steps<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043e\u0442\u043a\u0430\u0442 QEMU, \u043a\u044d\u0448\u0430 \u0438 <code>checkout<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width\">\n<div><figcaption>\ud83d\udce4 <strong>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b:<\/strong> <code>.deb<\/code>, <code>.rpm<\/code><\/figcaption><\/div>\n<\/figure>\n<p>\ud83d\udc33 \u042d\u0442\u0430\u043f 2: <code>docker<\/code> (\u23f1 ~4 \u043c\u0438\u043d\u0443\u0442\u044b)<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0428\u0430\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2699\ufe0f <code>Set up job<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udce5 <code>Checkout<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\udd80 <code>Install Rust + cross<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Rust + \u043a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udee0 <code>Build static binary<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 (musl, CLI-only)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83e\uddf3 <code>Prepare Docker context<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f Docker<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udd28 <code>Build Docker image<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\ud83d\udcbe <code>Save Docker image<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0432 \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2b06\ufe0f <code>Upload Docker artifact<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0440\u0445\u0438\u0432\u0430 \u043a\u0430\u043a \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u267b\ufe0f Post-steps<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0438\u0441\u0442\u043a\u0430: \u043e\u0442\u043a\u0430\u0442 <code>checkout<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width\">\n<div><figcaption>\ud83d\udce4 <strong>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442:<\/strong> \u0430\u0440\u0445\u0438\u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u0430<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\ud83d\udd04 \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<h4>\ud83d\udd04 \u041a\u0440\u043e\u0441\u0441-\u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432<\/h4>\n<p>\u041a\u0440\u043e\u0441\u0441-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>cross<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 Docker-\u043e\u0431\u0440\u0430\u0437\u0430\u0445:<\/p>\n<pre><code class=\"yaml\">- name: Build for aarch64   run: cross build --release --target aarch64-unknown-linux-gnu  - name: Build for armv7   run: cross build --release --target armv7-unknown-linux-gnueabihf  - name: Build for x86_64   run: cross build --release --target x86_64-unknown-linux-gnu<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0441\u0440\u0435\u0434\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f GUI-\u0447\u0430\u0441\u0442\u044c \u043d\u0430 Linux.<\/p>\n<h4>\ud83d\udce6 \u041f\u0430\u043a\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: .deb \u0438 .rpm \u0438\u0437 CI<\/h4>\n<ul>\n<li>\n<p><code>dotplus_1.0.0_amd64.deb<\/code><\/p>\n<\/li>\n<li>\n<p><code>dotplus_1.0.0_arm64.deb<\/code><\/p>\n<\/li>\n<li>\n<p><code>dotplus_1.0.0_armhf.deb<\/code><\/p>\n<\/li>\n<li>\n<p><code>dotplus-1.0.0-1.x86_64.rpm<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"bash\">sudo dpkg -i dotplus_1.0.0_amd64.deb # \u0438\u043b\u0438 sudo rpm -i dotplus-1.0.0-1.x86_64.rpm<\/code><\/pre>\n<h4>\ud83d\udd27 \u041a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e?<\/h4>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b:<\/p>\n<p><code>templates\/<\/code><a href=\"http:\/\/control.in\" rel=\"noopener noreferrer nofollow\"><code>control.in<\/code><\/a> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f <code>.deb<\/code><\/p>\n<pre><code class=\"yaml\">Package: dotplus Version: {{VERSION}} Section: utils Priority: optional Architecture: {{ARCH}} Maintainer: Danil Nigmatullin &lt;danil.communication@gmail.com&gt; Depends: {{DEPENDS}} Description: QR and barcode generator with logo and CSV support (Rust CLI\/GUI)  DotPlus is a Rust-based GUI and command-line tool for generating QR codes and barcodes.  It supports logo embedding, CSV import, and auto-update functionality.  Suitable for both terminal workflows and desktop users.<\/code><\/pre>\n<p><code>templates\/<\/code><a href=\"http:\/\/spec.in\" rel=\"noopener noreferrer nofollow\"><code>spec.in<\/code><\/a> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f <code>.rpm<\/code><\/p>\n<pre><code class=\"yaml\">Name:           dotplus Version:        {{VERSION}} Release:        1%{?dist} Summary:        QR and barcode generator with logo and CSV support (Rust CLI\/GUI)  License:        Freeware (Proprietary) URL:            https:\/\/github.com\/nigdanil\/dotplus  Source0:        dotplus BuildArch:      {{ARCH}} Requires:       {{REQUIRES}}  %description DotPlus is a<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-466056","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466056","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=466056"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466056\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=466056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=466056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=466056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}