{"id":389694,"date":"2024-06-29T08:46:06","date_gmt":"2024-06-29T08:46:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=389694"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=389694","title":{"rendered":"<span>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 macOS \u0434\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/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<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 macOS 10.15 Catalina \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0415\u0441\u043b\u0438 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 App Store \u0432\u0441\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e, \u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u0432\u0443\u043c\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 &#8212; \u0447\u0435\u0440\u0435\u0437 bash-\u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SPM executable).<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Xcode<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u0435\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c ascii-\u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0441 \u0433\u0440\u0443\u0441\u0442\u043d\u044b\u043c \u043a\u043e\u0442\u0438\u043a\u043e\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/81d\/b07\/dbf\/81db07dbfe93e8dddac0f64f37c0b325.png\" width=\"715\" height=\"504\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/81d\/b07\/dbf\/81db07dbfe93e8dddac0f64f37c0b325.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b5\/c45\/2f8\/9b5c452f812dafdde85c37a3779ba75d.png\" width=\"715\" height=\"503\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b5\/c45\/2f8\/9b5c452f812dafdde85c37a3779ba75d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u0432\u0430\u043d \u0441 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/322\/c08\/20a\/322c0820a1b95f62745ffdf85460a3b4.png\" width=\"865\" height=\"345\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/322\/c08\/20a\/322c0820a1b95f62745ffdf85460a3b4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 <a href=\"https:\/\/github.com\/apple\/swift-argument-parser\" rel=\"noopener noreferrer nofollow\">Swift Argument Parser<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f5d\/67c\/d9a\/f5d67cd9aecaaaae696972b0a6edf0a9.png\" width=\"1400\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f5d\/67c\/d9a\/f5d67cd9aecaaaae696972b0a6edf0a9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <code>main.swift<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>Argument Parser<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"swift\">import ArgumentParser import Foundation  struct SadCat: ParsableCommand {     static let configuration: CommandConfiguration {         .init(             commandName: \"sadcat\",             abstract: \"Displays a sad cat in the console\",             version: \"1.0.0\",             subcommands: [                 AsciiCat.self             ]         )     } }  SadCat.main()<\/code><\/pre>\n<p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a: <code>sadcat show<\/code>. <code>AsciiCat.self<\/code> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0431\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>show<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0443\u0431\u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"swift\">struct AsciiCat: ParsableCommand {     static let configuration: CommandConfiguration {         .init(             commandName: \"show\",             abstract: \"Show ascii art with sad cat\"         )     }          func run() throws {         let cat = \"\"\"                  \u3000\u3000\u3000\u3000\u3000\uff0f\uff1e\u3000 \u30d5         \u3000\u3000\u3000\u3000\u3000| \u3000_\u3000 _|         \u3000 \u3000\u3000\u3000\uff0f`\u30df _x \u5f61         \u3000\u3000 \u3000 \/\u3000\u3000\u3000 \u3000 |         \u3000\u3000\u3000 \/\u3000 \u30fd\u3000\u3000 \uff89         \u3000\uff0f\uffe3|\u3000\u3000 |\u3000|\u3000|         \u3000| (\uffe3\u30fd\uff3f_\u30fd_)_)         \u3000\uff3c\u4e8c\u3064          \"\"\"                  print(cat)     } }<\/code><\/pre>\n<p>\u0412\u0441\u0435 &#8212; \u0434\u0435\u043c\u043e-\u043f\u0440\u043e\u0435\u043a\u0442 \u0433\u043e\u0442\u043e\u0432!<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0432 \u0441\u0445\u0435\u043c\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e3\/e9d\/4cc\/9e3e9d4cc6e9fd348bd42da38b2f56e9.png\" width=\"208\" height=\"149\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e3\/e9d\/4cc\/9e3e9d4cc6e9fd348bd42da38b2f56e9.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/14d\/c82\/f52\/14dc82f52817cad6dbc622fbe3a38277.png\" width=\"917\" height=\"509\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/14d\/c82\/f52\/14dc82f52817cad6dbc622fbe3a38277.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u043e\u0433\u0434\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>Run<\/strong>, \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e9a\/7bc\/cae\/e9a7bccaeb6d672819973e2611889333.png\" width=\"1400\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e9a\/7bc\/cae\/e9a7bccaeb6d672819973e2611889333.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0435\u043b\u0438\u0437\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0438\u0437 \u043c\u0435\u043d\u044e Xcode <code>Product -> Archive<\/code>:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3ed\/38a\/6cd\/3ed38a6cdd8fd0dc4dace7a726500d72.png\" width=\"271\" height=\"33\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ed\/38a\/6cd\/3ed38a6cdd8fd0dc4dace7a726500d72.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b3\/56f\/818\/2b356f818ccfaffaad661a2cfcdfd176.png\" width=\"270\" height=\"149\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b3\/56f\/818\/2b356f818ccfaffaad661a2cfcdfd176.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u043a\u043d\u0435 <code>Window -> Organizer<\/code>, \u0449\u0435\u043b\u043a\u043d\u0443\u0432 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043f\u043e \u0430\u0440\u0445\u0438\u0432\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ae1\/b92\/9b4\/ae1b929b4dc7a94ff71e6e9ca41a797b.png\" width=\"1066\" height=\"403\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae1\/b92\/9b4\/ae1b929b4dc7a94ff71e6e9ca41a797b.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1ef\/ae6\/137\/1efae6137b617fb1d62cb0875fdd0fe0.png\" width=\"447\" height=\"143\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ef\/ae6\/137\/1efae6137b617fb1d62cb0875fdd0fe0.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0fc\/b4f\/43e\/0fcb4f43e0cf4c328c786d996f213be5.png\" width=\"1017\" height=\"176\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0fc\/b4f\/43e\/0fcb4f43e0cf4c328c786d996f213be5.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 <code>Products<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 \u043d\u0430\u043c \u0435\u0449\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0432\u043e\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 (\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c) &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440 \u0438 \u0447\u0435\u0440\u0435\u0437 Homebrew.<\/p>\n<h4>\u041f\u0443\u0442\u044c 1 &#8212; \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u0447\u0430\u043b \u0432\u0430\u0448\u0443 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043a\u0430\u043a <code>sadcat show<\/code> (\u0442.\u0435. \u0431\u0435\u0437 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b), \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 <code>\/usr\/local\/bin\/<\/code>:<\/p>\n<pre><code class=\"bash\">% cd \u043f\u0443\u0442\u044c_\u0434\u043e_\u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0439_\u0443\u0442\u0438\u043b\u0438\u0442\u044b % cp -f sadcat \/usr\/local\/bin\/sadcat<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u0430 \u0432 Finder, \u043e\u0442\u043a\u0440\u044b\u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443: <code>open \/usr\/local\/bin\/<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>sadcat show<\/code>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code class=\"bash\">zsh: permission denied: sadcat<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b:<\/p>\n<pre><code class=\"bash\">% chmod u+x \/usr\/local\/bin\/sadcat<\/code><\/pre>\n<p>\u0421\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>sadcat show<\/code>, \u0438 \u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4ef\/308\/c9c\/4ef308c9cda6cf0e33f6f031c7513482.png\" width=\"295\" height=\"280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ef\/308\/c9c\/4ef308c9cda6cf0e33f6f031c7513482.png\"\/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"bash\">zsh: killed     sadcat show<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0449\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 macOS \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <strong>\u0417\u0430\u0449\u0438\u0442\u0430 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong> \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca1\/1ea\/01f\/ca11ea01f68b9681a9a4ee723ff17b26.png\" width=\"781\" height=\"587\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ca1\/1ea\/01f\/ca11ea01f68b9681a9a4ee723ff17b26.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<pre><code>% sadcat show  \u3000\u3000\u3000\u3000\u3000\uff0f\uff1e\u3000 \u30d5 \u3000\u3000\u3000\u3000\u3000| \u3000_\u3000 _| \u3000 \u3000\u3000\u3000\uff0f`\u30df _x \u5f61 \u3000\u3000 \u3000 \/\u3000\u3000\u3000 \u3000 | \u3000\u3000\u3000 \/\u3000 \u30fd\u3000\u3000 \uff89 \u3000\uff0f\uffe3|\u3000\u3000 |\u3000|\u3000| \u3000| (\uffe3\u30fd\uff3f_\u30fd_)_) \u3000\uff3c\u4e8c\u3064<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0443\u0436 \u0442\u043e\u0447\u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0437\u0432\u0430\u0442\u044c user-friendly. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u0443 (\u0437\u0430\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440).<\/p>\n<h4>\u041f\u0443\u0442\u044c 2 &#8212; \u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0432 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440<\/h4>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 <strong>Developer ID Application<\/strong> \u0438 <strong>Developer ID Installer<\/strong> (\u0435\u0441\u043b\u0438 \u0438\u0445 \u0443 \u0432\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435\u0442), \u0430 \u0442\u0430\u043a\u0436\u0435 <strong>Application Specific Password<\/strong>  (\u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c <a href=\"https:\/\/developer.apple.com\/programs\/\" rel=\"noopener noreferrer nofollow\">Apple Developer Program<\/a>):<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 &#8212; <strong>Developer ID Application<\/strong> \u0438 <strong>Developer ID Installer<\/strong>. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435 Apple, \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Xcode: <code>Xcode -> Preferences -> Accounts -> Manage Certificates<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <strong>Application Specific Password<\/strong> \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435 <a href=\"https:\/\/appleid.apple.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/appleid.apple.com\/<\/a>. \u041e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>altool<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0432\u044f\u0437\u043a\u0443 \u043a\u043b\u044e\u0447\u0435\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c:<\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<p>Keychain Item Name: <code>Developer-altool<\/code><\/p>\n<\/li>\n<li>\n<p>Account Name: <strong>\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430<\/strong> \u0432\u0430\u0448\u0435\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>Password: \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 <strong>Application Specific Password<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 Xcode-\u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<p>\u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c <strong>Automatically manage signing<\/strong>, \u0437\u0430\u0434\u0430\u0435\u043c <strong>Bundle Identifier<\/strong> \u0438 \u0432 <strong>Signing Certificate<\/strong> \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c <strong>Developer ID Application<\/strong>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/72d\/599\/ad0\/72d599ad0b1f9f251b1ee0a6ccc10bf6.png\" width=\"722\" height=\"266\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/72d\/599\/ad0\/72d599ad0b1f9f251b1ee0a6ccc10bf6.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <strong>Hardened Runtime<\/strong> \u0432 <strong>Build Settings<\/strong> \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 <strong>Yes<\/strong>. \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <strong>Hardened Runtime<\/strong> \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u042d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Apple:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/329\/4b3\/e64\/3294b3e64b7d896ec36c082ed87cffec.png\" width=\"645\" height=\"156\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/329\/4b3\/e64\/3294b3e64b7d896ec36c082ed87cffec.png\"\/><figcaption><\/figcaption><\/figure>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0435\u043c pkg<\/strong><\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0438\u0442\u044c <strong>pkg<\/strong>, <strong>dmg<\/strong> \u0438\u043b\u0438 <strong>zip<\/strong> \u0444\u0430\u0439\u043b, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0432\u0430\u0448\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430. <strong>pkg<\/strong> \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>pkgbuild<\/code>:<\/p>\n<pre><code class=\"bash\">% pkgbuild --root \u043f\u0443\u0442\u044c_\u0434\u043e_\u043f\u0430\u043f\u043a\u0438_Products_\u0432\u043d\u0443\u0442\u0440\u0438_\u0430\u0440\u0445\u0438\u0432\u0430 \\            --identifier \"com.example.sadcat\" \\            --version \"1.0.0\" \\            --install-location \"\/\" \\            --sign \"Developer ID Installer: Rinat Abidullin (ABCD123456)\" \\            build\/SadCat-1.0.0.pkg<\/code><\/pre>\n<p>\u0414\u0432\u0430 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u043f\u0446\u0438\u044f\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><code>--sign<\/code> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u0433\u043e <code>Developer ID Installer<\/code> \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 (\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>% security find-identity -p basic -v)<\/code><\/p>\n<\/li>\n<li>\n<p><code>--root<\/code> &#8212; \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0430 <strong>Products<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 (<code>Product -> Archive<\/code>) \u0438\u043b\u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u043f\u0430\u043f\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e Xcode \u0431\u0438\u043b\u0434\u0438\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>xcodebuild install<\/code> (\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0432 <strong>Build Settings<\/strong> \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <strong>Installation Build Products Location<\/strong>, \u043d\u043e, \u043f\u043e\u0445\u043e\u0436\u0435, Xcode 12.5 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430)<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0417\u0430\u0432\u0435\u0440\u044f\u0435\u043c pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a<\/strong><\/p>\n<p>\u0423 Xcode \u0435\u0441\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 <code>xcrun altool<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 Apple \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">% xcrun altool --notarize-app \\              --primary-bundle-id \"com.example.sadcat\" \\              --username \"username@example.com\" \\              --password \"@keychain:Developer-altool\" \\              --asc-provider \"ABCD123456\" \\              --file \"SadCat-1.0.0.pkg\"<\/code><\/pre>\n<p>\u0433\u0434\u0435:<\/p>\n<ul>\n<li>\n<p><code>--username<\/code> &#8212; <strong>\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430<\/strong> \u0432\u0430\u0448\u0435\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>--password<\/code> &#8212; \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u043a\u043b\u044e\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u043b\u044f Application Specific Password<\/p>\n<\/li>\n<li>\n<p><code>--asc-provider<\/code> &#8212; \u044d\u0442\u043e Team ID (\u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432). \u0415\u0441\u043b\u0438 \u0432\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u0447\u043b\u0435\u043d\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043c \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f <code>RequestUUID<\/code> (\u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0439\u0442\u0435 \u0435\u0433\u043e). \u0421\u0435\u0440\u0432\u0435\u0440 Apple \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">% xcrun altool --notarization-info \"Your-Request-UUID\" \\              --username \"username@example.com\" \\              --password \"@keychain:Developer-altool\"<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0435\u0442 \u0432\u0430\u043c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432\u0430\u0448 pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0441\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 macOS, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 \u043d\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f Apple, \u0442.\u0435. mac \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0430 offline-\u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 &#8212; \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c notarization ticket \u043a pkg-\u0444\u0430\u0439\u043b\u0443:<\/p>\n<pre><code class=\"bash\">% xcrun stapler staple build\/SadCat-1.0.0.pkg<\/code><\/pre>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (bash)<\/strong><\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u044f \u0432\u0437\u044f\u043b <a href=\"https:\/\/scriptingosx.com\/2019\/09\/notarize-a-command-line-tool\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041e\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0438\u0436\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e Xcode 12.5 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>Installation Build Products Location<\/strong> \u0432 <strong>Build Settings<\/strong> (\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043c\u043e\u0438\u0445 \u043a\u0440\u0438\u0432\u044b\u0445 \u0440\u0443\u043a\u0430\u0445). \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043c\u043e\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u044c \u0434\u043e \u043f\u0430\u043f\u043a\u0438 <strong>Products<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u0438\u0437 Xcode:<\/p>\n<pre><code class=\"bash\"># put your dev account information into these variables  # the email address of your developer account dev_account=\"username@example.com\"  # the name of your Developer ID installer certificate signature=\"Developer ID Installer: Rinat Abidullin (ABCD123456)\"  # the 10-digit team id dev_team=\"ABCD123456\"  # the label of the keychain item which contains an app-specific password dev_keychain_label=\"Developer-altool\"   # put your project's information into these variables version=\"1.0.0\" identifier=\"com.example.sadcat\" productname=\"SadCat\"   # code starts here  projectdir=$(dirname $0)  builddir=\"$projectdir\/build\" pkgroot=\"\/Users\/rinatab\/Library\/Developer\/Xcode\/Archives\/2021-08-08\/FirebaseDashboardReport 08.08.2021, 19.58.xcarchive\/Products\/\"   # functions requeststatus() { # $1: requestUUID     requestUUID=${1?:\"need a request UUID\"}     req_status=$(xcrun altool --notarization-info \"$requestUUID\" \\                               --username \"$dev_account\" \\                               --password \"@keychain:$dev_keychain_label\" 2>&amp;1 \\                  | awk -F ': ' '\/Status:\/ { print $2; }' )     echo \"$req_status\" }  notarizefile() { # $1: path to file to notarize, $2: identifier     filepath=${1:?\"need a filepath\"}     identifier=${2:?\"need an identifier\"}          # upload file     echo \"## uploading $filepath for notarization\"     requestUUID=$(xcrun altool --notarize-app \\                                --primary-bundle-id \"$identifier\" \\                                --username \"$dev_account\" \\                                --password \"@keychain:$dev_keychain_label\" \\                                --asc-provider \"$dev_team\" \\                                --file \"$filepath\" 2>&amp;1 \\                   | awk '\/RequestUUID\/ { print $NF; }')                                     echo \"Notarization RequestUUID: $requestUUID\"          if [[ $requestUUID == \"\" ]]; then          echo \"could not upload for notarization\"         exit 1     fi              # wait for status to be not \"in progress\" any more     request_status=\"in progress\"     while [[ \"$request_status\" == \"in progress\" ]]; do         echo -n \"waiting... \"         sleep 10         request_status=$(requeststatus \"$requestUUID\")         echo \"$request_status\"     done          # print status information     xcrun altool --notarization-info \"$requestUUID\" \\                  --username \"$dev_account\" \\                  --password \"@keychain:$dev_keychain_label\"     echo           if [[ $request_status != \"success\" ]]; then         echo \"## could not notarize $filepath\"         exit 1     fi }  # check if pkgroot exists where we expect it if [[ ! -d $pkgroot ]]; then     echo \"couldn't find pkgroot $pkgroot\"     exit 1 fi  ## build the pkg  pkgpath=\"$builddir\/$productname-$version.pkg\"  echo \"## building pkg: $pkgpath\"  pkgbuild --root \"$pkgroot\" \\          --version \"$version\" \\          --identifier \"$identifier\" \\          --sign \"$signature\" \\          \"$pkgpath\"  # upload for notarization notarizefile \"$pkgpath\" \"$identifier\"  # staple result echo \"## Stapling $pkgpath\" xcrun stapler staple \"$pkgpath\"  echo '## Done!'  # show the pkg in Finder open -R \"$pkgpath\"  exit 0<\/code><\/pre>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (swift)<\/strong><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435 \u043d\u0430 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0435, \u0430 \u043d\u0430 swift. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432 Xcode, \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e Swift Package Manager. \u041f\u043e\u043a\u0430\u0436\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 (<code>PkgAndNotarize<\/code> \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430) \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (SPM \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0442\u0430\u0440\u0433\u0435\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c, \u043a\u0430\u043a \u0438 \u0443 \u043f\u0430\u043f\u043a\u0438), \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0435 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>cd<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 SPM:<\/p>\n<pre><code class=\"bash\">% swift package init --type executable<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435:<\/p>\n<pre><code>Creating executable package: PkgAndNotarize Creating Package.swift Creating README.md Creating .gitignore Creating Sources\/ Creating Sources\/PkgAndNotarize\/main.swift Creating Tests\/ Creating Tests\/PkgAndNotarizeTests\/ Creating Tests\/PkgAndNotarizeTests\/PkgAndNotarizeTests.swift<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u043d\u043e \u0441\u0431\u0438\u043b\u0434\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"bash\">% swift build % swift run Hello, world!<\/code><\/pre>\n<p>\u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 ArgumentParser (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u043d\u0435\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438). \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>Package.swift<\/code>:<\/p>\n<pre><code class=\"swift\">import PackageDescription  let package = Package(     name: \"PkgAndNotarize\",     platforms: [             .macOS(.v10_13)         ],     products: [         .executable(name: \"swiftpkg\", targets: [\"PkgAndNotarize\"])     ],     dependencies: [         .package(url: \"https:\/\/github.com\/apple\/swift-argument-parser\", from: \"0.4.4\"),     ],     targets: [         .target(             name: \"PkgAndNotarize\",             dependencies: [                 .product(name: \"ArgumentParser\", package: \"swift-argument-parser\"),             ]),         .testTarget(             name: \"PkgAndNotarizeTests\",             dependencies: [\"PkgAndNotarize\"]),     ] )<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 <code>main.swift<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043e\u043f\u0446\u0438\u044e &#8212; \u043f\u0443\u0442\u044c \u0434\u043e \u0430\u0440\u0445\u0438\u0432\u0430 (<code>.xcarchive<\/code>):<\/p>\n<pre><code class=\"swift\">struct PkgAndNotarize: ParsableCommand {     static let configuration = CommandConfiguration()          @Option(name: .long, parsing: .next, help: \"Path to .xcarchive file\")     var archive: String          func run() throws {         ...    } }  PkgAndNotarize.main()<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b (<code>config<\/code>), \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u041a\u043e\u043d\u0444\u0438\u0433 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0442\u0430\u043a:<\/p>\n<pre><code>account => username@example.com developerIDInstaller => Developer ID Installer: Rinat Abidullin (ABCD123456) teamID => ABCD123456 keychainLabel => Developer-altool identifier => com.example.sadcat pkgName => SadCat pkgVersion => 1.0.1<\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>run()<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0443 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0432 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0435 (\u043d\u0443 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0441\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439). \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"swift\">\/\/ Wrapper function for shell commands \/\/ Must provide full path to executable func shell(launchPath: String, _ arguments: [String] = []) throws -> String? {     let task = Process()     task.executableURL = URL(fileURLWithPath: launchPath)     task.arguments = arguments          let pipe = Pipe()     task.standardOutput = pipe     task.standardError = pipe          try task.run()          let data = pipe.fileHandleForReading.readDataToEndOfFile()     let output = String(data: data, encoding: .utf8)          task.waitUntilExit()          if task.terminationStatus != 0 {         throw ShellError.with(info: output ?? \"Unknown error\")     }          return output }<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e <code>launchPath<\/code> &#8212; \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>\/usr\/bin\/pkgbuild<\/code>. \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 <code>type<\/code> \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">% type pkgbuild pkgbuild is \/usr\/bin\/pkgbuild<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>shell<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043a\u0430\u043a:<\/p>\n<pre><code class=\"bash\">% pkgbuild --root \u043f\u0443\u0442\u044c_\u0434\u043e_\u043f\u0430\u043f\u043a\u0438_Products_\u0432\u043d\u0443\u0442\u0440\u0438_\u0430\u0440\u0445\u0438\u0432\u0430 \\            --identifier \"com.example.sadcat\" \\            --version \"1.0.0\" \\            --install-location \"\/\" \\            --sign \"Developer ID Installer: Rinat Abidullin (ABCD123456)\" \\            build\/SadCat-1.0.0.pkg<\/code><\/pre>\n<p>\u0432 swift \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043a\u0430\u043a:<\/p>\n<pre><code class=\"swift\">let output = try shell(     launchPath: \"\/usr\/bin\/pkgbuild\",     [         \"--root\",         productsPathInArchive,         \"--identifier\",         config.identifier,         \"--version\",         config.pkgVersion,         \"--sign\",         config.developerIDInstaller,         pkgFile     ] )<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 swift, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 (\u0431\u0438\u043b\u0434 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 <code>.build<\/code>):<\/p>\n<pre><code class=\"bash\">% swift build --configuration release<\/code><\/pre>\n<p>\u0418 \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432 <code>\/usr\/local\/bin\/<\/code>.<\/p>\n<p>\u0412\u0441\u0435! \u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0438 \u0437\u0430\u0432\u0435\u0440\u0438\u0442\u044c pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440:<\/p>\n<pre><code class=\"bash\">% swiftpkg --archive \/Users\/rinatab\/Library\/Developer\/Xcode\/Archives\/2021-08-14\/SadCat\\ 14.08.2021\\,\\ 18.39.xcarchive Creating pkg... Sending pkg for notarization... Notarization RequestUUID = a9b3d582-2cf6-56b9-9c7e-076d5ce256bf Waiting new status... in progress Waiting new status... in progress Waiting new status... in progress Waiting new status... in progress Waiting new status... in progress Waiting new status... success Stapling SadCat-1.0.1.pkg Done!<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e1c\/32f\/a8c\/e1c32fa8c12b61fe0535c82fc639bed3.png\" width=\"179\" height=\"81\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e1c\/32f\/a8c\/e1c32fa8c12b61fe0535c82fc639bed3.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u041f\u0443\u0442\u044c 3 &#8212; Homebrew<\/h4>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d. \u041d\u043e \u043e\u043d \u043c\u043d\u0435 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043d\u043e \u043d\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h2>\n<ul>\n<li>\n<p><a href=\"https:\/\/scriptingosx.com\/2019\/09\/notarize-a-command-line-tool\/\" rel=\"noopener noreferrer nofollow\">Notarize a Command Line Tool<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.avanderlee.com\/swift\/command-line-tool-package-manager\/\" rel=\"noopener noreferrer nofollow\">Creating a command line tool using the Swift Package Manager<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/security\/notarizing_macos_software_before_distribution\/customizing_the_notarization_workflow\/notarizing_apps_when_developing_with_xcode_12_and_earlier\" rel=\"noopener noreferrer nofollow\">Notarizing Apps when Developing with Xcode 12 and Earlier<\/a><\/p>\n<\/li>\n<\/ul>\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\/572970\/\"> https:\/\/habr.com\/ru\/articles\/572970\/<\/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<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 macOS 10.15 Catalina \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0415\u0441\u043b\u0438 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 App Store \u0432\u0441\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e, \u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u0432\u0443\u043c\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 &#8212; \u0447\u0435\u0440\u0435\u0437 bash-\u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SPM executable).<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Xcode<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u0435\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c ascii-\u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0441 \u0433\u0440\u0443\u0441\u0442\u043d\u044b\u043c \u043a\u043e\u0442\u0438\u043a\u043e\u043c:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u0432\u0430\u043d \u0441 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b):<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 <a href=\"https:\/\/github.com\/apple\/swift-argument-parser\" rel=\"noopener noreferrer nofollow\">Swift Argument Parser<\/a>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 <code>main.swift<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>Argument Parser<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"swift\">import ArgumentParser import Foundation  struct SadCat: ParsableCommand {     static let configuration: CommandConfiguration {         .init(             commandName: \"sadcat\",             abstract: \"Displays a sad cat in the console\",             version: \"1.0.0\",             subcommands: [                 AsciiCat.self             ]         )     } }  SadCat.main()<\/code><\/pre>\n<p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a: <code>sadcat show<\/code>. <code>AsciiCat.self<\/code> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0431\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>show<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0443\u0431\u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"swift\">struct AsciiCat: ParsableCommand {     static let configuration: CommandConfiguration {         .init(             commandName: \"show\",             abstract: \"Show ascii art with sad cat\"         )     }          func run() throws {         let cat = \"\"\"                  \u3000\u3000\u3000\u3000\u3000\uff0f\uff1e\u3000 \u30d5         \u3000\u3000\u3000\u3000\u3000| \u3000_\u3000 _|         \u3000 \u3000\u3000\u3000\uff0f`\u30df _x \u5f61         \u3000\u3000 \u3000 \/\u3000\u3000\u3000 \u3000 |         \u3000\u3000\u3000 \/\u3000 \u30fd\u3000\u3000 \uff89         \u3000\uff0f\uffe3|\u3000\u3000 |\u3000|\u3000|         \u3000| (\uffe3\u30fd\uff3f_\u30fd_)_)         \u3000\uff3c\u4e8c\u3064          \"\"\"                  print(cat)     } }<\/code><\/pre>\n<p>\u0412\u0441\u0435 &#8212; \u0434\u0435\u043c\u043e-\u043f\u0440\u043e\u0435\u043a\u0442 \u0433\u043e\u0442\u043e\u0432!<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0432 \u0441\u0445\u0435\u043c\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u043e\u0433\u0434\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>Run<\/strong>, \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0435\u043b\u0438\u0437\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0438\u0437 \u043c\u0435\u043d\u044e Xcode <code>Product -> Archive<\/code>:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u043a\u043d\u0435 <code>Window -> Organizer<\/code>, \u0449\u0435\u043b\u043a\u043d\u0443\u0432 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043f\u043e \u0430\u0440\u0445\u0438\u0432\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 <code>Products<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 \u043d\u0430\u043c \u0435\u0449\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0432\u043e\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 (\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c) &#8212; \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440 \u0438 \u0447\u0435\u0440\u0435\u0437 Homebrew.<\/p>\n<h4>\u041f\u0443\u0442\u044c 1 &#8212; \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u0447\u0430\u043b \u0432\u0430\u0448\u0443 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043a\u0430\u043a <code>sadcat show<\/code> (\u0442.\u0435. \u0431\u0435\u0437 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b), \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 <code>\/usr\/local\/bin\/<\/code>:<\/p>\n<pre><code class=\"bash\">% cd \u043f\u0443\u0442\u044c_\u0434\u043e_\u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0439_\u0443\u0442\u0438\u043b\u0438\u0442\u044b % cp -f sadcat \/usr\/local\/bin\/sadcat<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u0430 \u0432 Finder, \u043e\u0442\u043a\u0440\u044b\u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443: <code>open \/usr\/local\/bin\/<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>sadcat show<\/code>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code class=\"bash\">zsh: permission denied: sadcat<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b:<\/p>\n<pre><code class=\"bash\">% chmod u+x \/usr\/local\/bin\/sadcat<\/code><\/pre>\n<p>\u0421\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>sadcat show<\/code>, \u0438 \u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"bash\">zsh: killed     sadcat show<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0449\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 macOS \u0432 \u0440\u0430\u0437\u0434\u0435\u043b <strong>\u0417\u0430\u0449\u0438\u0442\u0430 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong> \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<pre><code>% sadcat show  \u3000\u3000\u3000\u3000\u3000\uff0f\uff1e\u3000 \u30d5 \u3000\u3000\u3000\u3000\u3000| \u3000_\u3000 _| \u3000 \u3000\u3000\u3000\uff0f`\u30df _x \u5f61 \u3000\u3000 \u3000 \/\u3000\u3000\u3000 \u3000 | \u3000\u3000\u3000 \/\u3000 \u30fd\u3000\u3000 \uff89 \u3000\uff0f\uffe3|\u3000\u3000 |\u3000|\u3000| \u3000| (\uffe3\u30fd\uff3f_\u30fd_)_) \u3000\uff3c\u4e8c\u3064<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0443\u0436 \u0442\u043e\u0447\u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0437\u0432\u0430\u0442\u044c user-friendly. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u0443 (\u0437\u0430\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440).<\/p>\n<h4>\u041f\u0443\u0442\u044c 2 &#8212; \u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0432 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 pkg-\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440<\/h4>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 <strong>Developer ID Application<\/strong> \u0438 <strong>Developer ID Installer<\/strong> (\u0435\u0441\u043b\u0438 \u0438\u0445 \u0443 \u0432\u0430\u0441 \u0435\u0449\u0435 \u043d\u0435\u0442), \u0430 \u0442\u0430\u043a\u0436\u0435 <strong>Application Specific Password<\/strong>  (\u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c <a href=\"https:\/\/developer.apple.com\/programs\/\" rel=\"noopener noreferrer nofollow\">Apple Developer Program<\/a>):<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 &#8212; <strong>Developer ID Application<\/strong> \u0438 <strong>Developer ID Installer<\/strong>. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435 Apple, \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Xcode: <code>Xcode -> Preferences -> Accounts -> Manage Certificates<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <strong>Application Specific Password<\/strong> \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0435 <a href=\"https:\/\/appleid.apple.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/appleid.apple.com\/<\/a>. \u041e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>altool<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0432\u044f\u0437\u043a\u0443 \u043a\u043b\u044e\u0447\u0435\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c:<\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<p>Keychain Item Name: <code>Developer-altool<\/code><\/p>\n<\/li>\n<li>\n<p>Account Name: <strong>\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430<\/strong> \u0432\u0430\u0448\u0435\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>Password: \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 <strong>Application Specific Password<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 Xcode-\u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<p>\u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c <strong>Automatically manage signing<\/strong>, \u0437\u0430\u0434\u0430\u0435\u043c <strong>Bundle Identifier<\/strong> \u0438 \u0432 <strong>Signing Certificate<\/strong> \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c <strong>Developer ID Application<\/strong>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <strong>Hardened Runtime<\/strong> \u0432 <strong>Build Settings<\/strong> \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 <strong>Yes<\/strong>. \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <strong>Hardened Runtime<\/strong> \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u042d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0434\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Apple:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0435\u043c pkg<\/strong><\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0438\u0442\u044c <strong>pkg<\/strong>, <strong>dmg<\/strong> \u0438\u043b\u0438 <strong>zip<\/strong> \u0444\u0430\u0439\u043b, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0432\u0430\u0448\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430. <strong>pkg<\/strong> \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>pkgbuild<\/code>:<\/p>\n<pre><code class=\"bash\">% pkgbuild --root \u043f\u0443\u0442\u044c_\u0434\u043e_\u043f\u0430\u043f\u043a\u0438_Products_\u0432\u043d\u0443\u0442\u0440\u0438_\u0430\u0440\u0445\u0438\u0432\u0430 \\            --identifier \"com.example.sadcat\" \\            --version \"1.0.0\" \\            --install-location \"\/\" \\            --sign \"Developer ID Installer: Rinat Abidullin (ABCD123456)\" \\            build\/SadCat-1.0.0.pkg<\/code><\/pre>\n<p>\u0414\u0432\u0430 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u043f\u0446\u0438\u044f\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><code>--sign<\/code> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u0433\u043e <code>Developer ID Installer<\/code> \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 (\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>% security find-identity -p basic -v)<\/code><\/p>\n<\/li>\n<li>\n<p><code>--root<\/code> &#8212; \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0430 <strong>Products<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 (<code>Product -> Archive<\/code>) \u0438\u043b\u0438 \u043f\u0443\u0442\u044c \u0434\u043e \u043f\u0430\u043f\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e Xcode \u0431\u0438\u043b\u0434\u0438\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>xcodebuild install<\/code> (\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0432 <strong>Build Settings<\/strong> \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <strong>Installation Build Products Location<\/strong>, \u043d\u043e, \u043f\u043e\u0445\u043e\u0436\u0435, Xcode 12.5 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430)<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0417\u0430\u0432\u0435\u0440\u044f\u0435\u043c pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a<\/strong><\/p>\n<p>\u0423 Xcode \u0435\u0441\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 <code>xcrun altool<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 Apple \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">% xcrun altool --notarize-app \\              --primary-bundle-id \"com.example.sadcat\" \\              --username \"username@example.com\" \\              --password \"@keychain:Developer-altool\" \\              --asc-provider \"ABCD123456\" \\              --file \"SadCat-1.0.0.pkg\"<\/code><\/pre>\n<p>\u0433\u0434\u0435:<\/p>\n<ul>\n<li>\n<p><code>--username<\/code> &#8212; <strong>\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430<\/strong> \u0432\u0430\u0448\u0435\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>--password<\/code> &#8212; \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u043a\u043b\u044e\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u043b\u044f Application Specific Password<\/p>\n<\/li>\n<li>\n<p><code>--asc-provider<\/code> &#8212; \u044d\u0442\u043e Team ID (\u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432). \u0415\u0441\u043b\u0438 \u0432\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u0447\u043b\u0435\u043d\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043c \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f <code>RequestUUID<\/code> (\u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0439\u0442\u0435 \u0435\u0433\u043e). \u0421\u0435\u0440\u0432\u0435\u0440 Apple \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">% xcrun altool --notarization-info \"Your-Request-UUID\" \\              --username \"username@example.com\" \\              --password \"@keychain:Developer-altool\"<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0435\u0442 \u0432\u0430\u043c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432\u0430\u0448 pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0441\u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 macOS, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 \u043d\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0435\u043d\u0438\u044f Apple, \u0442.\u0435. mac \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b pkg-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0430 offline-\u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 &#8212; \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c notarization ticket \u043a pkg-\u0444\u0430\u0439\u043b\u0443:<\/p>\n<pre><code class=\"bash\">% xcrun stapler staple build\/SadCat-1.0.0.pkg<\/code><\/pre>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (bash)<\/strong><\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u044f \u0432\u0437\u044f\u043b <a href=\"https:\/\/scriptingosx.com\/2019\/09\/notarize-a-command-line-tool\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041e\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0438\u0436\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e Xcode 12.5 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>Installation Build Products Location<\/strong> \u0432 <strong>Build Settings<\/strong> (\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043c\u043e\u0438\u0445 \u043a\u0440\u0438\u0432\u044b\u0445 \u0440\u0443\u043a\u0430\u0445). \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043c\u043e\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u044c \u0434\u043e \u043f\u0430\u043f\u043a\u0438 <strong>Products<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u0438\u0437 Xcode:<\/p>\n<pre><code class=\"bash\"># put your dev account information into these variables  # the email address of your developer account dev_account=\"username@example.com\"  # the name of your Developer ID installer certificate signature=\"Developer ID Installer: Rinat Abidullin (ABCD123456)\"  # the 10-digit team id dev_team=\"ABCD123456\"  # the label of the keychain item which contains an app-specific password dev_keychain_label=\"Developer-altool\"   # put your project's information into these variables version=\"1.0.0\" identifier=\"com.example.sadcat\" productname=\"SadCat\"   # code starts here  projectdir=$(dirname $0)  builddir=\"$projectdir\/build\" pkgroot=\"\/Users\/rinatab\/Library\/Developer\/Xcode\/Archives\/2021-08-08\/FirebaseDashboardReport 08.08.2021, 19.58.xcarchive\/Products\/\"   # functions requeststatus() { # $1: requestUUID     requestUUID=${1?:\"need a request UUID\"}     req_status=$(xcrun altool --notarization-info \"$requestUUID\" \\                               --username \"$dev_account\" \\                               --password \"@keychain:$dev_keychain_label\" 2>&amp;1 \\                  | awk -F ': ' '\/Status:\/ { print $2; }' )     echo \"$req_status\" }  notarizefile() { # $1: path to file to notarize, $2: identifier     filepath=${1:?\"need a filepath\"}     identifier=${2:?\"need an identifier\"}          # upload file     echo \"## uploading $filepath for notarization\"     requestUUID=$(xcrun altool --notarize-app \\                                --primary-bundle-id \"$identifier\" \\                                --username<\/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-389694","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/389694","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=389694"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/389694\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=389694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=389694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=389694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}