{"id":480468,"date":"2026-05-21T05:56:29","date_gmt":"2026-05-21T05:56:29","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=480468"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=480468","title":{"rendered":"Arguments to Config \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u043c\u043e\u0449\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 CLI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 C#"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 <a href=\"https:\/\/habr.com\/en\/articles\/1021594\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439<\/a> \u044f \u043f\u0438\u0441\u0430\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043b CLI-\u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 C#, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0432 \u0442.\u0447. \u043e\u0442 MS. \u041d\u043e \u044d\u0442\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u0410 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u0442.\u0435. \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/409\/db5\/82d\/409db582d275cac2a435cdefb9d13469.png\" width=\"812\" height=\"487\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/409\/db5\/82d\/409db582d275cac2a435cdefb9d13469.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/409\/db5\/82d\/409db582d275cac2a435cdefb9d13469.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u0432\u043e\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u042f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0443 \u0434\u0440\u0443\u0433\u0438\u0445, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0447\u0430\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0441\u043c\u0430\u043f\u0438\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0442\u0438\u043f\u0430 <code>git commit<\/code> \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0410, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u043c\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u0428\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043e\u0431\u043b\u043e\u0436\u0438\u0432 \u0435\u0451 \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043d\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u2014 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b. \u0410 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 (\u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0434\u0440\u0443\u0433\u043e\u0439 \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442).<\/p>\n<h4>\u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b.<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435. \u0412\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 python, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0432 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Azure, \u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0438 curl&#8217;\u043e\u043c \u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0432 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u043e\u0439. \u041d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u042f \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043b\u044e, \u043a\u043e\u0433\u0434\u0430 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 README \u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 (\u043d\u0443, \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0431\u0434\u0438\u043b \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u042f \u0442\u0430\u043c \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0443\u0447\u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438.<\/p>\n<p>\u0422\u0443\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438: <a href=\"https:\/\/github.com\/Mansiper\/ArgsToConfig\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/Mansiper\/ArgsToConfig<\/a><br \/>\u0422\u0443\u0442 \u043f\u0430\u043a\u0435\u0442: <a href=\"https:\/\/www.nuget.org\/packages\/Mansiper.ArgsToConfig\" rel=\"noopener noreferrer nofollow\">https:\/\/www.nuget.org\/packages\/Mansiper.ArgsToConfig<\/a><\/p>\n<h2>\u0424\u0438\u0447\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/h2>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u0430 tuple (\u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e);<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 &#8212;help \u0438 &#8212;version;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 pathspec;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043b\u044e\u0431\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 ValidationAttribute;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434 (\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432)<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0438\u0431\u043a\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0438 \u043c\u043d. \u0434\u0440.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/h4>\n<pre><code class=\"cs\">\/\/ \u041a\u043e\u043c\u0430\u043d\u0434\u0430: app connect -u alice -p secret runclass AppConfig{    [ArgsObject(\"connect\", Description = \"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\")]    public ConnectionConfig Connect { get; set; } = null!;    [ArgsHasParameter(\"run\")]    public bool? Run { get; set; }}record ConnectionConfig{    [ArgsValueFor(\"-u\")]    public string User { get; set; } = null!;    [ArgsValueFor(\"-p\")]    public string Pass { get; set; } = null!;}\/\/ \u0410 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:var (config, errors, position) = ArgumentsReader.ToObject&lt;AppConfig&gt;(args);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430:<\/p>\n<pre><code class=\"cs\">\/\/\u043a\u043e\u043c\u0430\u043d\u0434\u0430: app pipeline pull --fetch commit -m \"fix\" push runclass ExecConfig{    [ArgsHasParameter(\"pipeline\")]    public bool? Pipeline { get; set; }    [ArgsPipeline]    public IPipelineCommand[]? Commands { get; set; }    [ArgsHasParameter(\"run\")]    public bool? Run { get; set; }}interface IPipelineCommand { }[ArgsPipelineCommand(\"pull\")]class PullCommand : IPipelineCommand{    [ArgsHasParameter(\"--fetch\")]    public bool? Fetch { get; set; }}[ArgsPipelineCommand(\"commit\")]class CommitCommand : IPipelineCommand{    [ArgsValueFor(\"-m\")]    public string? Message { get; set; }}[ArgsPipelineCommand(\"push\")]class PushCommand : IPipelineCommand{    [ArgsHasParameter(\"--force\")]    public bool? Force { get; set; }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0427\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?<\/h4>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u0431\u044b \u0437\u0430\u043a\u043e\u043b\u0435\u0431\u0430\u043b\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u044e \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 1600 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 \u043f\u043e\u043c\u043e\u0449\u0438 LLM, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0442\u0443\u0434\u0430 \u0432\u0441\u0451 \u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u0447\u0438, \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433 Claude \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0437\u0430\u043a\u0438\u043d\u0443\u043b \u0432 Claude \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432 README. \u041e\u043d &#171;\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b&#187; \u043e \u043c\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043b \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0432 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0447, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u043b. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u043b \u043f\u0430\u0440\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0434\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <code>ValidationAttribute<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0438\u0437 \u043d\u0438\u0445, \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0435\u0449\u0451 \u0440\u0430\u0437 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u0430 \u0447\u0442\u043e \u043e\u043d \u043c\u043d\u0435 \u0432\u044b\u0434\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/summary>\n<div class=\"spoiler__content\">\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th><\/th>\n<th>\n<p align=\"center\"><strong>Mansiper.ArgsToConfig<\/strong><\/p>\n<p align=\"center\">(\u043c\u043e\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430)<\/p>\n<\/th>\n<th>\n<p align=\"center\"><strong>CommandLineParser<\/strong><\/p>\n<\/th>\n<th data-colwidth=\"123\" width=\"123\">\n<p align=\"center\"><strong>System.CommandLine<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"center\"><strong>McMaster.Extensions.CommandLineUtils<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"center\"><strong>Spectre.Console.Cli<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">NuGet package<\/p>\n<\/td>\n<td>\n<p align=\"center\"><code>Mansiper.ArgsToConfig<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\"><code>CommandLineParser<\/code><\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\"><code>System.CommandLine<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\"><code>McMaster.Extensions.CommandLineUtils<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\"><code>Spectre.Console.Cli<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Maintainer<\/p>\n<\/td>\n<td>\n<p align=\"center\">Community (Mansiper)<\/p>\n<\/td>\n<td>\n<p align=\"center\">Community<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">Microsoft<\/p>\n<\/td>\n<td>\n<p align=\"center\">Community (natemcmaster)<\/p>\n<\/td>\n<td>\n<p align=\"center\">Community (.NET Foundation)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Stable since<\/p>\n<\/td>\n<td>\n<p align=\"center\">&lt; 1.0 (pre-release)<\/p>\n<\/td>\n<td>\n<p align=\"center\">2005<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">2024 (beta \u2192 stable)<\/p>\n<\/td>\n<td>\n<p align=\"center\">2017<\/p>\n<\/td>\n<td>\n<p align=\"center\">2021<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">API style<\/p>\n<\/td>\n<td>\n<p align=\"center\">Attribute-only<\/p>\n<\/td>\n<td>\n<p align=\"center\">Attribute + Fluent<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">Imperative builder<\/p>\n<\/td>\n<td>\n<p align=\"center\">Attribute + Builder<\/p>\n<\/td>\n<td>\n<p align=\"center\">Attribute (opinionated)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">License<\/p>\n<\/td>\n<td>\n<p align=\"center\">MIT<\/p>\n<\/td>\n<td>\n<p align=\"center\">MIT<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">MIT<\/p>\n<\/td>\n<td>\n<p align=\"center\">Apache 2.0<\/p>\n<\/td>\n<td>\n<p align=\"center\">MIT<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Target frameworks<\/p>\n<\/td>\n<td>\n<p align=\"center\">.NET 8+ (modern)<\/p>\n<\/td>\n<td>\n<p align=\"center\">.NET Standard 2.0, .NET Fx 4.0+<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">.NET 6+<\/p>\n<\/td>\n<td>\n<p align=\"center\">.NET Standard 2.0+<\/p>\n<\/td>\n<td>\n<p align=\"center\">.NET Standard 2.0, .NET 8+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">External dependencies<\/p>\n<\/td>\n<td>\n<p align=\"center\">None<\/p>\n<\/td>\n<td>\n<p align=\"center\">None<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">None<\/p>\n<\/td>\n<td>\n<p align=\"center\">None<\/p>\n<\/td>\n<td>\n<p align=\"center\">Spectre.Console<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Attribute-based declaration<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f Partial (via DragonFruit)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Fluent builder API<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Method-parameter inference<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Returns errors without exceptions<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f (callback-based)<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f (exception or callback)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Object-to-args round-trip (<code>ToArgs<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Synopsis \/ usage string generation<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Named flags (<code>--verbose<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Positional arguments<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">True\/false flag pairs (<code>--sign<\/code>\/<code>--no-sign<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Short + long aliases (<code>-v|--verbose<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Combined short flags (<code>-am<\/code>\u00a0\u2192\u00a0<code>-a -m<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>--flag=value<\/code>\u00a0syntax<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>-fflag<\/code>\u00a0inline value (<code>-o.\/bin<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Repeated flags as collection<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Pathspec (<code>--<\/code>\u00a0separator)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Enum mapping from flags<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Bit-flag (Flags) enum<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Tuple splitting from single arg<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Dictionary from repeated flags<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (via IDictionary option)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Pipeline command sequences<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Primitives (<code>string<\/code>,\u00a0<code>int<\/code>,\u00a0<code>bool<\/code>,\u00a0<code>double<\/code>, \u2026)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>DateTime<\/code>,\u00a0<code>DateOnly<\/code>,\u00a0<code>TimeOnly<\/code>,\u00a0<code>TimeSpan<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f\u00a0<code>DateTime<\/code>\u00a0only<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f\u00a0<code>DateTime<\/code>\u00a0only<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f via custom converter<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>Guid<\/code>,\u00a0<code>Uri<\/code>,\u00a0<code>Version<\/code>,\u00a0<code>IPAddress<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f\u00a0<code>Uri<\/code>\u00a0via ctor<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705\u00a0<code>Uri<\/code>, others via converter<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>FileInfo<\/code>,\u00a0<code>DirectoryInfo<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Any\u00a0<code>IConvertible<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Custom converter<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (<code>TypeConverter<\/code>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Value tuples<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Nullable types (optional by nullability)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Records &amp; structs as config objects<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Subcommand support<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (verbs)<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Arbitrary nesting depth<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Record\/struct as subcommand<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Global\/recursive options<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Async command execution<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">DI integration<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (via DI)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>System.ComponentModel.DataAnnotations<\/code><\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (<code>[Required]<\/code>,\u00a0<code>[Range]<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Allowed-values list<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f Custom validator<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f Custom validator<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Existing file validation<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f Custom<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Existing directory validation<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f Custom<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Legal filename characters<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mutual exclusion (<code>[ArgsOneOf]<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mutual requirement (<code>[ArgsMutuallyRequired]<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Conditional dependency (<code>[ArgsIfSet]<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Ordering constraint (<code>[ArgsAfter]<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Custom\u00a0<code>Validate()<\/code>\u00a0override<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Error position reporting<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Env var fallback per argument<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>.env<\/code>\u00a0file auto-loading<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Config file \/\u00a0<code>appsettings.json<\/code>\u00a0support<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u26a0\ufe0f Via host builder<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (via\u00a0<code>IConfiguration<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Response file support (<code>@file<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Auto-generated help (<code>--help<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>--version<\/code>\u00a0flag<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Help grouping \/ sections<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Cached help generation<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Unknown-argument callback<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Rich terminal output (colors, tables)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (via Spectre.Console)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Shell tab completion<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c (via Cocona: yes)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">NuGet downloads (approx.)<\/p>\n<\/td>\n<td>\n<p align=\"center\">&lt; 1 K (new)<\/p>\n<\/td>\n<td>\n<p align=\"center\">80 M+<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">50 M+<\/p>\n<\/td>\n<td>\n<p align=\"center\">25 M+<\/p>\n<\/td>\n<td>\n<p align=\"center\">30 M+<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GitHub stars (approx.)<\/p>\n<\/td>\n<td>\n<p align=\"center\">0<\/p>\n<\/td>\n<td>\n<p align=\"center\">4 K+<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">3 K+<\/p>\n<\/td>\n<td>\n<p align=\"center\">2 K+<\/p>\n<\/td>\n<td>\n<p align=\"center\">1 K+ (part of Spectre.Console 10 K+)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Active maintenance<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f Slow<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u26a0\ufe0f Slow<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">.NET Foundation member<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Test helper package<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (<code>Spectre.Console.Testing<\/code>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">F# support<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u2705 (separate pkg)<\/p>\n<\/td>\n<td data-colwidth=\"123\" width=\"123\">\n<p align=\"center\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u274c<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/details>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u044f \u0443\u0437\u043d\u0430\u043b \u043d\u0435\u043c\u0430\u043b\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0438 \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442\u044b (\u043c\u043e\u0433 \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u043c\u0443\u0434\u0440\u0451\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0445\u043e\u0442\u044f, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f 99,9% \u0441\u043b\u0443\u0447\u0430\u0435\u0432).<\/p>\n<\/div>\n<p>\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\/1037556\/\">https:\/\/habr.com\/ru\/articles\/1037556\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043b CLI-\u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 C#, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439.\u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0432 \u0442.\u0447. \u043e\u0442 MS. \u041d\u043e \u044d\u0442\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u0410 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u0442.\u0435. \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.\u041f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u0432\u043e\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u042f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0443 \u0434\u0440\u0443\u0433\u0438\u0445, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0447\u0430\u043b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0441\u043c\u0430\u043f\u0438\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0442\u0438\u043f\u0430 git commit \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0410, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u043c\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u0428\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043e\u0431\u043b\u043e\u0436\u0438\u0432 \u0435\u0451 \u0442\u0435\u0441\u0442\u0430\u043c\u0438.\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043d\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u2014 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b. \u0410 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 (\u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0434\u0440\u0443\u0433\u043e\u0439 \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442).\u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b.\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435. \u0412\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 python, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0432 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 Azure, \u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0438 curl&#8217;\u043e\u043c \u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0432 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u043e\u0439. \u041d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f.\u042f \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043b\u044e, \u043a\u043e\u0433\u0434\u0430 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 README \u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 (\u043d\u0443, \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0431\u0434\u0438\u043b \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u042f \u0442\u0430\u043c \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0443\u0447\u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438.\u0422\u0443\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438: https:\/\/github.com\/Mansiper\/ArgsToConfig\u0422\u0443\u0442 \u043f\u0430\u043a\u0435\u0442: https:\/\/www.nuget.org\/packages\/Mansiper.ArgsToConfig\u0424\u0438\u0447\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0439;\u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u0430 tuple (\u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e);\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 &#8212;help \u0438 &#8212;version;\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443;\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438;\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 pathspec;\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043b\u044e\u0431\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 ValidationAttribute;\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434 (\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432)\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439;\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432;\u0433\u0438\u0431\u043a\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432\u0438 \u043c\u043d. \u0434\u0440.\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:\/\/ \u041a\u043e\u043c\u0430\u043d\u0434\u0430: app connect -u alice -p secret runclass AppConfig{    [ArgsObject(&#171;connect&#187;, Description = &#171;\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f&#187;)]    public ConnectionConfig Connect { get; set; } = null!;    [ArgsHasParameter(&#171;run&#187;)]    public bool? Run { get; set; }}record ConnectionConfig{    [ArgsValueFor(&#171;-u&#187;)]    public string User { get; set; } = null!;    [ArgsValueFor(&#171;-p&#187;)]    public string Pass { get; set; } = null!;}\/\/ \u0410 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:var (config, errors, position) = ArgumentsReader.ToObject&lt;AppConfig&gt;(args);\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430:\/\/\u043a\u043e\u043c\u0430\u043d\u0434\u0430: app pipeline pull &#8212;fetch commit -m &#171;fix&#187; push runclass ExecConfig{    [ArgsHasParameter(&#171;pipeline&#187;)]    public bool? Pipeline { get; set; }    [ArgsPipeline]    public IPipelineCommand[]? Commands { get; set; }    [ArgsHasParameter(&#171;run&#187;)]    public bool? Run { get; set; }}interface IPipelineCommand { }[ArgsPipelineCommand(&#171;pull&#187;)]class PullCommand : IPipelineCommand{    [ArgsHasParameter(&#171;&#8212;fetch&#187;)]    public bool? Fetch { get; set; }}[ArgsPipelineCommand(&#171;commit&#187;)]class CommitCommand : IPipelineCommand{    [ArgsValueFor(&#171;-m&#187;)]    public string? Message { get; set; }}[ArgsPipelineCommand(&#171;push&#187;)]class PushCommand : IPipelineCommand{    [ArgsHasParameter(&#171;&#8212;force&#187;)]    public bool? Force { get; set; }}\u0427\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?\u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u0431\u044b \u0437\u0430\u043a\u043e\u043b\u0435\u0431\u0430\u043b\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u044e \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 1600 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 \u043f\u043e\u043c\u043e\u0449\u0438 LLM, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0442\u0443\u0434\u0430 \u0432\u0441\u0451 \u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u0447\u0438, \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433 Claude \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0437\u0430\u043a\u0438\u043d\u0443\u043b \u0432 Claude \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432 README. \u041e\u043d &#171;\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b&#187; \u043e \u043c\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043b \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0432 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0447, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u043b. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u043b \u043f\u0430\u0440\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0434\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 ValidationAttribute. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0438\u0437 \u043d\u0438\u0445, \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0435\u0449\u0451 \u0440\u0430\u0437 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u0430 \u0447\u0442\u043e \u043e\u043d \u043c\u043d\u0435 \u0432\u044b\u0434\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.\u0422\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430Mansiper.ArgsToConfig(\u043c\u043e\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430)CommandLineParserSystem.CommandLineMcMaster.Extensions.CommandLineUtilsSpectre.Console.CliNuGet packageMansiper.ArgsToConfigCommandLineParserSystem.CommandLineMcMaster.Extensions.CommandLineUtilsSpectre.Console.CliMaintainerCommunity (Mansiper)CommunityMicrosoftCommunity (natemcmaster)Community (.NET Foundation)Stable since&lt; 1.0 (pre-release)20052024 (beta \u2192 stable)20172021API styleAttribute-onlyAttribute + FluentImperative builderAttribute + BuilderAttribute (opinionated)LicenseMITMITMITApache 2.0MITTarget frameworks.NET 8+ (modern).NET Standard 2.0, .NET Fx 4.0+.NET 6+.NET Standard 2.0+.NET Standard 2.0, .NET 8+External dependenciesNoneNoneNoneNoneSpectre.ConsoleAttribute-based declaration\u2705\u2705\u26a0\ufe0f Partial (via DragonFruit)\u2705\u2705Fluent builder API\u274c\u2705\u2705\u2705\u274cMethod-parameter inference\u274c\u274c\u2705\u274c\u274cReturns errors without exceptions\u2705\u26a0\ufe0f (callback-based)\u26a0\ufe0f (exception or callback)\u26a0\ufe0f\u26a0\ufe0fObject-to-args round-trip (ToArgs)\u2705\u274c\u274c\u274c\u274cSynopsis \/ usage string generation\u2705\u274c\u274c\u274c\u274cNamed flags (&#8212;verbose)\u2705\u2705\u2705\u2705\u2705Positional arguments\u2705\u2705\u2705\u2705\u2705True\/false flag pairs (&#8212;sign\/&#8212;no-sign)\u2705\u274c\u274c\u274c\u274cShort + long aliases (-v|&#8212;verbose)\u2705\u2705\u2705\u2705\u2705Combined short flags (-am\u00a0\u2192\u00a0-a -m)\u2705\u2705\u2705\u2705\u2705&#8212;flag=value\u00a0syntax\u2705\u2705\u2705\u2705\u2705-fflag\u00a0inline value (-o.\/bin)\u2705\u2705\u274c\u274c\u274cRepeated flags as collection\u2705\u2705\u2705\u2705\u2705Pathspec (&#8212;\u00a0separator)\u2705\u274c\u2705\u274c\u274cEnum mapping from flags\u2705\u2705\u2705\u2705\u2705Bit-flag (Flags) enum\u2705\u274c\u274c\u274c\u274cTuple splitting from single arg\u2705\u274c\u274c\u274c\u274cDictionary from repeated flags\u2705\u274c\u274c\u274c\u2705 (via IDictionary option)Pipeline command sequences\u2705\u274c\u274c\u274c\u274cPrimitives (string,\u00a0int,\u00a0bool,\u00a0double, \u2026)\u2705\u2705\u2705\u2705\u2705DateTime,\u00a0DateOnly,\u00a0TimeOnly,\u00a0TimeSpan\u2705\u26a0\ufe0f\u00a0DateTime\u00a0only\u2705\u26a0\ufe0f\u00a0DateTime\u00a0only\u26a0\ufe0f via custom converterGuid,\u00a0Uri,\u00a0Version,\u00a0IPAddress\u2705\u26a0\ufe0f\u00a0Uri\u00a0via ctor\u2705\u00a0Uri, others via converter\u26a0\ufe0f\u26a0\ufe0fFileInfo,\u00a0DirectoryInfo\u2705\u274c\u2705\u2705\u274cAny\u00a0IConvertible\u2705\u26a0\ufe0f\u26a0\ufe0f\u26a0\ufe0f\u274cCustom converter\u2705\u2705\u2705\u2705\u2705 (TypeConverter)Value tuples\u2705\u274c\u274c\u274c\u274cNullable types (optional by nullability)\u2705\u2705\u2705\u2705\u2705Records &amp; structs as config objects\u2705\u274c\u274c\u274c\u274cSubcommand support\u2705\u2705 (verbs)\u2705\u2705\u2705Arbitrary nesting depth\u2705\u2705\u2705\u2705\u2705Record\/struct as subcommand\u2705\u274c\u274c\u274c\u274cGlobal\/recursive options\u274c\u274c\u2705\u2705\u2705Async command execution\u274c\u274c\u2705\u2705\u2705DI integration\u274c\u274c\u2705\u2705 (via DI)\u2705System.ComponentModel.DataAnnotations\u2705\u274c\u274c\u2705 ([Required],\u00a0[Range])\u274cAllowed-values list\u2705\u274c\u26a0\ufe0f Custom validator\u274c\u26a0\ufe0f Custom validatorExisting file validation\u2705\u274c\u26a0\ufe0f\u274c\u26a0\ufe0f CustomExisting directory validation\u2705\u274c\u26a0\ufe0f\u274c\u26a0\ufe0f CustomLegal filename characters\u2705\u274c\u274c\u274c\u274cMutual exclusion ([ArgsOneOf])\u2705\u274c\u274c\u274c\u274cMutual requirement ([ArgsMutuallyRequired])\u2705\u274c\u274c\u274c\u274cConditional dependency ([ArgsIfSet])\u2705\u274c\u274c\u274c\u274cOrdering constraint ([ArgsAfter])\u2705\u274c\u274c\u274c\u274cCustom\u00a0Validate()\u00a0override\u274c\u274c\u2705\u274c\u2705Error position reporting\u2705\u274c\u274c\u274c\u274cEnv var fallback per argument\u2705\u274c\u2705\u274c\u274c.env\u00a0file auto-loading\u2705\u274c\u274c\u274c\u274cConfig file \/\u00a0appsettings.json\u00a0support\u274c\u274c\u26a0\ufe0f Via host builder\u2705 (via\u00a0IConfiguration)\u274cResponse file support (@file)\u274c\u274c\u2705\u274c\u274cAuto-generated help (&#8212;help)\u2705\u2705\u2705\u2705\u2705&#8212;version\u00a0flag\u2705\u2705\u2705\u2705\u2705Help grouping \/ sections\u2705\u274c\u274c\u274c\u274cCached help generation\u2705\u274c\u274c\u274c\u274cUnknown-argument callback\u2705\u2705\u2705\u2705\u2705Rich terminal output (colors, tables)\u274c\u274c\u274c\u274c\u2705 (via Spectre.Console)Shell tab completion\u274c\u274c\u2705\u274c\u274c (via Cocona: yes)NuGet downloads (approx.)&lt; 1 K (new)80 M+50 M+25 M+30 M+GitHub stars (approx.)04 K+3 K+2 K+1 K+ (part of Spectre.Console 10 K+)Active maintenance\u2705\u26a0\ufe0f Slow\u2705\u26a0\ufe0f Slow\u2705.NET Foundation member\u274c\u274c\u2705\u274c\u2705Test helper package\u274c\u274c\u274c\u274c\u2705 (Spectre.Console.Testing)F# support\u274c\u2705 (separate pkg)\u2705\u274c\u274c\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u044f \u0443\u0437\u043d\u0430\u043b \u043d\u0435\u043c\u0430\u043b\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.\u041f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0438 \u0431\u0430\u0433-\u0440\u0435\u043f\u043e\u0440\u0442\u044b (\u043c\u043e\u0433 \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u043c\u0443\u0434\u0440\u0451\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0445\u043e\u0442\u044f, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f 99,9% \u0441\u043b\u0443\u0447\u0430\u0435\u0432).\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1037556\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-480468","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480468","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=480468"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480468\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=480468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=480468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=480468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}