В настоящее время, в отличие от Python или NodeJS, Go не позволяет указывать зависимости разработки отдельно от зависимостей приложения. Однако автор предпочитает явно указывать зависимости разработки для лучшей воспроизводимости.
Работая над новым CLI-инструментом для проверки неработающих URL-адресов в файлах markdown, автор столкнулся с интересным соглашением: можно указать зависимости разработки в файле
tools.go
и затем исключить их при сборке бинарного файла, используя тег сборки.Вот как это работает. Предположим, у нашего проекта
foo
есть следующая структура:foo
├── go.mod
├── go.sum
└── main.go
Файл
main.go
содержит простую функцию "hello-world", использующую стороннюю зависимость:package main
import (
"fmt"
// Cowsay - это сторонняя зависимость приложения
cowsay "github.com/Code-Hex/Neo-cowsay"
)
func main() {
fmt.Println(cowsay.Say(cowsay.Phrase("Hello, World!")))
}
Здесь
Neo-cowsay
— это зависимость приложения. Для инициализации проекта запускаются следующие команды:go mod init example.com/foo # создает файлы go.mod и go.sum
go mod tidy # устанавливает зависимости приложения
Теперь предположим, что мы хотим добавить следующие зависимости разработки:
golangci-lint
для линтинга проекта в CI и gofumpt
как более строгий gofmt
. Поскольку эти инструменты не импортируются напрямую, они не отслеживаются инструментарием сборки.Но можно воспользоваться следующим воркфлоу:
1. Разместить файл
tools.go
в корневой директории.2. Импортировать зависимости разработки в этом файле.
3. Запустить
go mod tidy
, чтобы отслеживать как зависимости приложения, так и зависимости разработки через go.mod
и go.sum
.4. Указать тег сборки в
tools.go
, чтобы исключить зависимости разработки из бинарного файла.В этом случае файл
tools.go
выглядит следующим образом:// go:build tools
package tools
import (
// Зависимости разработки
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
_ "mvdan.cc/gofumpt"
)
Теперь, если вы запустите
go mod tidy
, инструментарий Go будет отслеживать зависимости через файлы go.mod
и go.sum
. Вы можете проверить зависимости в go.mod
.Хотя зависимости разработки отслеживаются вместе с зависимостями приложения, тег сборки
// go:build tools
в начале файла tools.go
скажет инструментарию сборки игнорировать их при создании бинарного файла.Из корневой директории
foo
можно собрать проект, запустив:go build main.go
Это создаст бинарный файл
main
в корневой директории. Чтобы убедиться, что бинарный файл не содержит зависимости разработки, запустите:go tool nm main | grep -Ei 'golangci-lint|gofumpt'
Это не вернет ничего, если зависимости разработки не упакованы в бинарный файл.
Но если вы сделаете это для зависимости приложения, она выведет артефакты:
go tool nm main | grep -Ei 'cowsay'
Команда выведет:
1000b6d40 T github.com/Code-Hex/Neo-cowsay.(*Cow).Aurora
1000b6fb0 T github.com/Code-Hex/Neo-cowsay.(*Cow).Aurora.func1
1000b5610 T github.com/Code-Hex/Neo-cowsay.(*Cow).Balloon
1000b6020 T github.com/Code-Hex/Neo-cowsay.(*Cow).Balloon.func1
...
Если по какой-то причине вы хотите включить зависимости разработки в свой бинарный файл, вы можете передать тег
tools
при сборке бинарного файла:go build --tags tools main.go
#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Redowan's Reflections
Omitting dev dependencies in Go binaries
As of now, unlike Python or NodeJS, Go doesn’t allow you to specify your development
dependencies separately from those of the application. However, I like to specify the dev
dependencies explicitly for better reproducibility.
While working on a new CLI tool…
dependencies separately from those of the application. However, I like to specify the dev
dependencies explicitly for better reproducibility.
While working on a new CLI tool…
👍33❤2🤔2🥱2
testing
и дополнен библиотекой Gomega.Фреймворк предоставляет подход к написанию тестов, близкий к методологии BDD, и используется для упрощения процесса написания сложных тестовых сценариев, делая вывод тестов более читаемым и понятным.
👉 GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - onsi/gomega: Ginkgo's Preferred Matcher Library
Ginkgo's Preferred Matcher Library. Contribute to onsi/gomega development by creating an account on GitHub.
🥱12👍6❤2🥰2
🤖 Команда Google недавно сделала новое семейство мультимодальных ИИ-моделей Gemini доступным через API с щедрым уровнем бесплатного использования, а также выпустила SDK для нескольких популярных ЯП, включая Go.
Eli Bendersky показал простой пример работы с Go SDK, в котором текстовые вопросы к модели сочетаются с изображениями.
👉 Подробнее
Eli Bendersky показал простой пример работы с Go SDK, в котором текстовые вопросы к модели сочетаются с изображениями.
👉 Подробнее
🔥14❤2👍2🤩2🌚2
Go-разрабы, кто-то из вас уже попробовал новый редактор Zed? Если да, то как впечатления?👇
Forwarded from Библиотека программиста | программирование, кодинг, разработка
Программируйте со скоростью мысли
🛠 Zed — высокопроизводительный многопользовательский редактор кода с открытым исходным кодом от создателей Atom и Tree-sitter. Он сочетает в себе мощь IDE с оперативностью легкого редактора, обеспечивая производительность, которую вы можете почувствовать под рукой.
📌 Он написан на Rust и поддерживает:
✅ Полное синтаксическое дерево для каждого буфера по мере ввода, обеспечивая точную подсветку кода, автоматический отступ, просмотр схемы с возможностью поиска
✅ GitHub Copilot с возможностью генерации/рефакторинга кода с помощью GPT-4
✅ Встроенный полнофункциональный терминал для доступа к командной строке
✅ Модальное редактирования в стиле Vim, а также использование хоткеев и командной палитры
✅ Работу с кодом на любом устройстве
✅ Набор светлых/темных тем, а также возможности кастомизации
✅ Каналы для обсуждения, планирования и написания кода с командой, включая возможности аудио и текстового чата
👉 GitHub
👉 Сайт
🤔21🥱10❤5👍1
Внутри каждого из нас живет критик. А как вы справляетесь со своим?
Anonymous Poll
22%
Хвалю себя за маленькие шаги
38%
Трезво оцениваю ситуацию
11%
Заменяю негативные мысли позитивными
14%
Критикую его в ответ
40%
Не справляюсь
2%
Свой вариант (напишу в комментарии)
Хотите интегрировать функциональность JavaScript в Go-проект? Просто используйте goja, движок ECMAScript/JavaScript, разработанный на чистом Go.
Он позволяет интегрировать функциональность JavaScript непосредственно в проекты на Go, без необходимости использования внешних JS-движков👇
🔗 GitHub
Он позволяет интегрировать функциональность JavaScript непосредственно в проекты на Go, без необходимости использования внешних JS-движков👇
🔗 GitHub
❤14😁11🌚5👍3🤔3
🏃 Самоучитель по Go для начинающих. Часть 6. Функции и аргументы. Области видимости. Рекурсия. Defer
В этом уроке рассмотрим функции, аргументы, области видимости, затронем тему указателей, узнаем про рекурсию и её применение в программировании, а также научимся использовать ключевое слово defer.
👉 Читать статью
👉 Часть 1
👉 Часть 2
👉 Часть 3
👉 Часть 4
👉 Часть 5
В этом уроке рассмотрим функции, аргументы, области видимости, затронем тему указателей, узнаем про рекурсию и её применение в программировании, а также научимся использовать ключевое слово defer.
👉 Читать статью
👉 Часть 1
👉 Часть 2
👉 Часть 3
👉 Часть 4
👉 Часть 5
👍14🥱7❤1🤔1
Как вы обычно отдыхаете?
Anonymous Poll
24%
У самурая нет отдыха, только хардкор
13%
Делаю что-то своими руками
41%
Лежу, туплю и расслабляюсь
3%
Хожу на массаж
18%
Занимаюсь йогой/спортом
28%
Гуляю на свежем воздухе
6%
Хожу в походы (активный отдых)
53%
Читаю книги/играю в игры/смотрю кино или сериалы
18%
Пилю пет-проект
4%
Свой вариант (напишу в комментариях)
Hidden Lake — по умолчанию F2F (friend-to-friend) сеть, где каждый пользователь устанавливает доверенных участников, с которыми впоследствии будет связываться и которые смогут отправлять ему сообщения.
Если один абонент для другого не будет находиться в списке друзей, и при этом попытается отправить ему сообщение, то получатель данное сообщение просто проигнорирует.
Это все понятно и хочется практики? Автор демонстрирует пример файлообменника на основе сети Hidden Lake, разработанный на Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤔8👏1
🤩 Пополняемый плейлист с докладами на конференции GopherCon 2023:
🌐 Обзор изменений в Go, Russ Cox
🌐 Будущее JSON в Go, Joe Tsai
🌐 Постулаты, которые помогут преодолеть синдром самозванца, Kate Pond: переосмысление постулатов Go, представленных Робом Пайком в 2015 году
#чтопроисходит
#чтопроисходит
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍1
👨🎓 Опытные разработчики часто дают совет начинающим: «Лучший способ стать лучше в любом языке программирования — писать больше кода и как можно больше практиковаться».
🤩 Поначалу это действительно так, но по мере того, как вы начнёте осваивать язык, лучший способ совершенствоваться — это также читать код других разрабов.
📌 Вот несколько случайных проектов, с которых можно начать:
🔧 xbar — позволяет поместить выходные данные любого скрипта/программы в строку меню macOS
🔧 service — стартовый набор для написания сервисов на Go с использованием Kubernetes
🔧 Bubble Tea — мощный легковесный TUI-фреймворк
🔧 GoBoy — эмулятор Nintendo GameBoy и GameBoy Color, написанный на go
🤩 Поначалу это действительно так, но по мере того, как вы начнёте осваивать язык, лучший способ совершенствоваться — это также читать код других разрабов.
📌 Вот несколько случайных проектов, с которых можно начать:
🔧 xbar — позволяет поместить выходные данные любого скрипта/программы в строку меню macOS
🔧 service — стартовый набор для написания сервисов на Go с использованием Kubernetes
🔧 Bubble Tea — мощный легковесный TUI-фреймворк
🔧 GoBoy — эмулятор Nintendo GameBoy и GameBoy Color, написанный на go
GitHub
GitHub - matryer/xbar: Put the output from any script or program into your macOS Menu Bar (the BitBar reboot)
Put the output from any script or program into your macOS Menu Bar (the BitBar reboot) - matryer/xbar
🔥11
This media is not supported in your browser
VIEW IN TELEGRAM
🛠 Baby API — простой Go CRUD API фреймворк. Вы можете использовать его для кастомной обработки запросов/ответов с помощью реализованных Renderer и Binder из go-chi/render.
Используйте предоставленные функции расширения для добавления дополнительных функций API:
Чтобы показать фреймворк в действии, автор написал простой веб-проект с помощью HTMX и Go. Все подробности — под катом.
👉 Читать
Используйте предоставленные функции расширения для добавления дополнительных функций API:
OnCreateOrUpdate
, Storage
, AddCustomRoute
, Patch
и многие другие.package main
import "github.com/calvinmclean/babyapi"
type TODO struct {
babyapi.DefaultResource
Title string
Description string
Completed bool
}
func main() {
api := babyapi.NewAPI[*TODO](
"TODOs", "/todos",
func() *TODO { return &TODO{} },
)
api.RunCLI()
}
Чтобы показать фреймворк в действии, автор написал простой веб-проект с помощью HTMX и Go. Все подробности — под катом.
👉 Читать
👍11
Please open Telegram to view this post
VIEW IN TELEGRAM
😁60🔥8👾2👍1