Создайте проект CLI с нуля, используя язык Go | Обзор проекта

Go внешний интерфейс
Создайте проект CLI с нуля, используя язык Go | Обзор проекта

Привет всем, яЛуожу из @Da Ning

Эта статья была впервые опубликована вОфициальный сайт Луожу

Эта статья была разрешена сообществу разработчиков для публичного использования Nuggets № эксклюзивного использования, включая, помимо прочего, редактирование, оригинальный ярлык и другие акции.

Участие в этом мероприятии просто для веселья, XDM не паникуйте

Описание Проекта

tuya-panel-cliЭто инструмент разработки на основе языка Go для разработчиков смарт-панелей Tuya.

Основная функция основана наtuya-panel-demoСклад инициализирует панельный проект, упаковывает разработанный проект и автоматически проверяет наличие обновлений в фоновом режиме инструмента.

Проект разработан на основе популярного проекта Go CLI framework Cobra, который в основном достиг требований и целей проектирования, как и ожидалось, нашел отправную точку для дальнейшего улучшения экологии разработчика в будущем и добавил важную часть (скин) в формирование замкнутого цикла развития.

Я несет ответственность за предприниматься в проекте, выбор технологий (спина будет введен), проектирование программы, программа и доставку проекта посадки на весь процесс. Конечно, это не было ничего похвастаться, как вы можете видеть, также не сложный проект. Причина, по которой я хотел бы повторно установить, потому что этот проект от 0-1, а затем я полностью 1.1 контролировать проект.

история проекта

Tuya Smart — глобальный лидер IoT AI + IOT, где находится Луожу.IoTOSДепартамент в основном предоставляет разработчикам возможность использовать Tuya IoTOS и самостоятельно выбирать различные чипы для разработки интеллектуальных продуктов.

С ростом числа разработчиков как внутри компании, так и за ее пределами поддержка двух наборов инструментов разработки больше не является тенденцией. Чтобы лучше обслуживать большинство разработчиков. Нам нужно построить единую платформу для разработчиков. Инструменты разработчика (CLI), безусловно, являются хорошей отправной точкой.

Технический отбор

Прежде чем приступить к разработке, Луожу изучил решения Node, Deno и Go соответственно. Причина, по которой мы не использовали Node напрямую для разработки, заключается в том, что Boss требует, чтобы исходный код не был открытым, а во-вторых, потому что многие наши разработчики встраиваются. Для максимального удобства разработчиков (нет необходимости устанавливать среду выполнения) нам нужно решение, способное упаковать CLI в бинарный файл.

Node

Как мы все знаем, интерфейс командной строки, разработанный Node, необходимо установить через NPM, а разработчикам необходимо заранее установить среду Node локально. Для фронтенд-разработчика это может быть обычным явлением, но для тех, кто не является фронтенд-разработчиком или не программистом, дополнительная среда конфигурации, необходимая для запуска ваших скриптов, может показаться непосильной.

Есть ли у Node решение для упаковки бинарных файлов?

Ответ положительный, нашел Луо Чжу в своем исследовании.oclifиpkg, оба из которых могут упаковывать разработанные программы на разных платформах. Разница в том, что pkg — это всего лишь инструмент для простой упаковки программ в двоичные исполняемые файлы, а oclif — это полноценная среда командной строки, поддерживающая систему плагинов.

До сих пор oclif казался тем, что нам нужно, но, к сожалению, он был отклонен из-за упаковки среды Node в установщик, из-за чего установочный пакет был слишком большим и напрямую открывал исходный код (pkg передается напрямую из-за слишком простые функции).

Deno

Бамбук любит Лос-Дено,Deno от входа до запуска | 🏆 Первый выпуск технической тематикиДокажите, что я написал Hello World. Поскольку он очень близок к Node с точки зрения синтаксиса и API, он стал вторым решением для рассмотрения.

Deno полностью поддерживает кроссплатформенную компиляцию после добавления поддержки компиляции для платформы Windows в версии 1.7.0.seveЭто простая демонстрация CLI, которую я написал.

Причина отказа от Deno заключается в том, что экология не идеальна и требует самостоятельной сборки большого количества колес. Например, нет зрелой кросс-платформенной компиляции, разбора флагов, подключаемых модулей анкеты, цветного текста, загрузки и подключаемых модулей индикатора выполнения. Что касается фреймворков CLI, подобных Node Commander и cac, то их нет. seve - это большая дыра, которую я вырыл.Первоначальным намерением было создать версию Commander для Deno.После того, как я связался с cac, я передумал.

Go

Ло Чжу тоже любитель го.Быстро начните работу с Go и просмотрите колонку Nuggets | 🏆 Технический специальный выпуск 2Доказательство того, что я написал Hello World. Причина, по которой я, наконец, задумался о Go, в том, что это было очень небольшое психологическое давление на мое психологическое давление как на фронтенд-разработчика Node и Deno, и GO знаком не только мне. Если не первые два, выполнить требования невозможно, боюсь, я не выберу Go.

Кроссплатформенная компиляция

Сам Go поддерживает команды компиляции, далее следует использовать встроенную команду gobuildСкрипт упаковки, написанный командой:

#!/bin/bash
name="tuya-panel-cli"
# Windows
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o ${name}.exe main.go
# Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${name} main.go
# MacOS
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o ${name} main.go

Вы можете найти приведенный выше скрипт очень громоздким, и в Go также есть сторонние плагины компиляции, которые можно использовать, такие какgoxиxgo.

CLI-фреймворк

urfaveОн относительно прост и удобен в использовании.Если это небольшая или однокомандная программа, рекомендуется выбрать, я выбираюcobra. В процессе исследования Кобры я разобрался и перевелКобра Китайская документацияОткапывать нуждающихся друзей может прямо проститутка. Давайте посмотрим на особенности Cobra:

  • Простые CLI на основе подкоманд:app server,app fetchЖдать;

  • полностью совместимыйPOSIX (интерфейс переносимой операционной системы)логотип (как короткий, так и длинный)

  • Вложенные подкоманды

  • Флаги для глобальных, локальных и каскадных

  • использоватьcobra init appnameиcobra add cmdnameЛегко создавать приложения и команды

  • Умные советы (app srver ...did you mean app server)

  • Справка по автоматически сгенерированным командам и флагам

  • Автоматическая идентификация-h,--helpВ ожидании помощи логотип

  • Автоматически сгенерированное автодополнение bash для вашего приложения

  • Автоматически создавать справочные страницы для вашего приложения

  • Псевдонимы команд, чтобы вы могли что-то менять, не нарушая их

  • Гибкость для определения собственной помощи, использования и т. д.

  • опционально сviperТесно интегрированный для12factorприменение

Из характеристик видно, что Cobra может не только предоставить нам богатые характеристики, но и позволить реализовать наши решения.

процесс практики

Проблемы, возникающие в процессе практики, и решения? Какой эффект в итоге был достигнут, или какая оптимизация и улучшение?

После того, как технический выбор является практикой реализации, разработчики рамок проекта могут непосредственно читать китайские документы, упомянутые выше, и не будут повторять их здесь. Ниже я опишу практический процесс по командам, реализованным tuya-panel-cli.

init шаблон инициализации

необходимость:tuya-panel-demoПроект содержит все шаблоны, нам нужно реализовать запрос пользователя на выбор подходящего шаблона и инициализацию в текущем каталоге

1. Опубликуйте шаблон:GitHub CIКогда обнаруживается, что новый тег git отправляется в хранилище, все шаблоны упаковываются и выпускаются в виде черновой версии, а выпуск официально выпускается после того, как администратор вручную пишет примечания к выпуску. Этот процесс согласуется с управлением версиями самого Deno. Читать об этой частиДин, проверьте исходный код Deno GitHub Action..

2. Выберите шаблон. Первая идея — поддерживатьtxtФайл, получать контент через http, что немного глупо, каждый раз, когда есть новый шаблон или шаблон удаления, его нужно поддерживать вручную; вторая идея - сканировать через краулерhttps://github.com/tuya/tuya-panel-demo/releases/latestИ выньте список шаблонов. Я использую плагин для рептилийcolly, выберите Подсказка.promptui.

3. Скачать шаблон: Я используюnet/httpРучная функция загрузки файла, а затем использованнаяarchiverРазархивируйте сжатый пакет в каталог кеша и, наконец, используйтеcopyКопировать в текущий каталог.

обновить команду обновления

Научитесь великолепному управлению скриптами от Denoописывает, как управлять нашими программами,Внедрение обновления Deno на основе GoОписывает, как встать на плечи гигантов и реализовать собственную команду апгрейда. Вот краткий обзор.

1. Опираясь на метод управления сценариями Deno, мы управляем версией через выпуск github (управление плагинами языка Go также является этой рутиной)

2. Прочтите исходный код команды обновления Deno и реализуйте ее в Go (таким образом познакомившись с Rust и влюбившись в него)

3. На основе имитации реализована функция проверки обновлений в фоновом режиме

4. Инкапсулированныйgo-releaseПлагин и открытый исходный код.

пакет упаковка

Эта команда перенесена из внутреннего проекта, и полученные знания заключаются в том, чтобы добавить верхнюю часть файла// +build windowsСкомпилируйте и используйте от имени платформы Windows,// +build linux darwinПредставляет скомпилированные и используемые в Linux и Mac.

homebrew

Чтобы дополнительно облегчить пользователей на дому, Luozhu выпустил Tuya-Panel-CLI дляyoungjuning/homebrew-tap, пожалуйста, обратитесь к статье, которую я написал в то время для конкретного содержанияНи за что? Ни за что! Кто-нибудь еще не отправляет пакеты Homebrew?

Резюме мышления

  • Технический отбор должен фактически написать демонстрацию, то, что выглядит подходящим, может не подходить на самом деле.
  • Выбор технологии должен учитывать время и экологию.Как профессиональный программист, вы не должны бояться мира за пределами своей зоны комфорта.
  • Проект удалось сдать вовремя, с одной стороны, благодаря мощности и простоте использования фреймворка Cobra, а с другой стороны, благодаря предыдущим базовым знаниям Go. Но тут хвастаться нечем, используемый синтаксис достаточно прост.
  • После выпуска проекта производится доработка и оперативная оптимизация документа. Никакого применения проблема не нашла.
  • Он еще не был связан с viper, и его можно будет добавить позже, если будет спрос.
  • В дальнейшем необходимо систематически изучать язык Go, чтобы лучше оптимизировать проект.

Самый важный момент понимания заключается в том, что вы должны своевременно записывать свое обучение и работу, точно так же, как вести учет.

Эта статья участвует в «Весенней рекрутинговой кампании Nuggets 2021», нажмите, чтобы просмотретьподробности о мероприятии