Fyne - это open-source библиотека для очень простого и быстрого создания кросс-платформенных приложений на Golang
Здесь можно вполне понять для чего нужен fyne, от себя могу сказать, что это очень простая библиотека для пользования, чтобы начать писать на ней программы с графическим интерфейсом не нужно никаких знаний
Можно глянуть одним глазком там довольно медленно и только совсем про базу рассказано, поэтому использовать можно как справочник, когда быстро набрасываешь свой первый интерфейс:
Тут очень хорошо на примере показано как делать, прикол fyne не в том чтобы использовать стандартный набор инструментов представленный в библиотеке, а в том чтобы на их основе писать под нужные интерфейсы соответствующие классы, плюс могу добавить, что код в библиотеке читается очень легко (не то что stl c++😩) и этого кода не очень много, довольно быстро в нем разобраться:
Если ты не любишь смотреть, а любишь читать, то на хабре есть пару статей, про то, как писать под fyne, там тоже можно получить некоторую базу, но советую все же посмотреть вторую ссылку на ютубе, хотя бы на скорости 2 и пропуская большую часть для ознакомления, там самый лучший материал, который я нашел в инете
Теперь когда мы с тобой ознакомились с базой, и написали что-то, встает вопрос куда нажать, чтобы мы могли скинуть штуку, которую накодили, но тут возникает проблема, у всех разные системы, могу выделить три основных под которые можно скомпилить windows, linux (я все проверял на ubuntu, но вроде у одного моего друга какой-то хакерский linux, но он запустил мой бинарник под linux) и macOS (самая проблемная😩) ну и может быть андроид, но у меня его нет, предполагаю там не сложно, про iOS можно забыть ведь там только через App Store, а мы не серьезные дядьки делающие серьезные приложения, мы с тобой два абобуса, и хотим друзьям скинуть приколюху (если ты серьезный дядька, иди лучше gotk4 поизучай, fyne не очень оптимально)
Сначала скачаем Go
macOS
brew install go
linux
sudo apt install golang
Напишем первый hello main, https://developer.fyne.io/started/hello
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello World")
w.SetContent(widget.NewLabel("Hello World!"))
w.ShowAndRun()
}
Далее генерируем go.mod (эту команду напишем в директории проекта)
go mod init hello_world
Теперь скачаем все нужные зависимости
go mod tidy
Должно получится сейчас что-то вроде такого
![](https://habrastorage.org/getpro/habr/upload_files/179/c29/639/179c29639ac2f605b4168b15d72cc84b.png)
Теперь запустим
go run main.go
Ура победа
![](https://habrastorage.org/getpro/habr/upload_files/cde/27b/5a1/cde27b5a13ab90b9284f4017c218f4ef.png)
Ну вот и все, мы научились, хотя я вроде что-то говорил про разные системы и так далее, что все сложно, а тут так просто, что-то не так. Вспомним на базовом уровне как мы запускаем приложения
go build -o hello_world
Мы использовали флаг -o чтобы сообщить в каком виде будет бинарник
![](https://habrastorage.org/getpro/habr/upload_files/839/815/fbb/839815fbbd9c80573f22bca25bc5b7a4.png)
Вот и наш бинарник hello_world, он запускается с ./hello_world, это не очень удобно, плюс не у всех такая же os и архитектура процессора, как у тебя, поэтому не все смогут запустить, да и большая часть людей на windows и они не знакомы с терминалом, поэтому нам надо собрать под разные системы и в итоге мы получим несколько бинарников.
Go кросс-платформенный и это его плюс, можно из одной платформы собрать под другую. Обычно на Go собирают под другие платформы следующим образом:
env GOOS=windows GOARCH=amd64 go build -o hello_world.exe
И все? Так просто? Конечно нет
![вот что пишется на macOS amr64 вот что пишется на macOS amr64](https://habrastorage.org/getpro/habr/upload_files/8d6/23d/be1/8d623dbe139fbb17e0a6c32ef9e4bd58.png)
Значит надо придется собирать через докер, но там еще и еще копать, а мы с тобой не хотим заморачиваться, мы хотим быстро написать и отправить друзьям. fyne предлагает свое решение этой проблемы
go get fyne.io/fyne/v2/cmd/fyne
Далее по идее разработчиков мы должны сразу писать через команду fyne, но так не везде и не всегда работает
go install fyne.io/fyne/v2/cmd/fyne
#~/go/bin/fyne вот где сейчас fyne
PATH=$PATH:~/go/bin #можешь отредачить .bash_profile
Теперь нам доступна команда fyne, скачаем и закинем любой .png в проект и назовем ее Icon.png
![](https://habrastorage.org/getpro/habr/upload_files/014/bf2/4f7/014bf24f7cd7e2206248afb64d0c577f.png)
fyne install
И все, теперь оно установилось, //дописать
fyne package
fyne package -os windows
Но мы получим примерно это
# runtime/cgo
gcc_libinit_windows.c:8:10: fatal error: 'windows.h' file not found
error building application: exit status 2
Поэтому нам придется загрузить все зависимости для других OS, но это не самое лучшее решение, лучше всего через докер компилировать, в fyne есть туториал как это делать fyne-cross
go get github.com/fyne-io/fyne-cross
go install github.com/fyne-io/fyne-cross
Теперь мы можем пользоваться командой fyne-cross (не забудь скачать docker)
fyne-cross windows -arch amd64 -name hello_world
fyne-cross linux -arch amd64 -name hello_world
fyne-cross создал папку fine-cross, что по-моему выглядит неэстетично, ниже мы избавимся от этой папки и будем все сохранять в директорию download
mkdir -p download
mkdir -p download/linux-amd64
mkdir -p download/windows-amd64
mv fyne-cross/dist/linux-amd64/hello_world.tar.xz download/linux-amd64/hello_world.tar.xz
mv fyne-cross/dist/windows-amd64/hello_world.zip download/windows-amd64/hello_world.zip
Теперь перейдем к macOS (к сожалению сборка под нее поддерживается только если у тебя эта os)
fyne-cross darwin -arch=amd64 -name hello_world -app-id valerijhegaj.hello_world
fyne-cross darwin -arch=arm64 -name hello_world -app-id valerijhegaj.hello_world
Вообще чтобы приложение нормально работало на macOS его нужно подписывать и нотариализовывать, но это может занять много времени, поэтому я нашел небольшой hack, сначала мы сделаем dmg образ, как обычно это делают разработчики под macOS
brew install node
npm install create-dmg
mkdir -p download/macos-amd64
mkdir -p download/macos-arm64
create-dmg fyne-cross/dist/darwin-amd64/hello_world.app download/macos-amd64
create-dmg fyne-cross/dist/darwin-amd64/hello_world.app download/macos-arm64
mv download/macos-amd64/hello_world\ 1.0.dmg download/macos-amd64/hello_world.dmg
mv download/macos-arm64/hello_world\ 1.0.dmg download/macos-arm64/hello_world.dmg
Вообще под arm можно отдельно не собирать, потому что Mac на apple silicon умеет запускать приложения для x86-64, теперь почистим мусор
rm -rf fyne-cross
![](https://habrastorage.org/getpro/habr/upload_files/598/54e/76a/59854e76a93c7227accf7ced2d4cb40a.png)
![](https://habrastorage.org/getpro/habr/upload_files/efe/7e0/203/efe7e0203bf7a3eadfec0fc154a38a85.png)
Ура победа? А вот и нет еще, теперь загрузим в интернет, скачаем от туда .dmg и установим приложение
![](https://habrastorage.org/getpro/habr/upload_files/8e0/902/cb4/8e0902cb48a8cc48eb5ca8b696cba24f.png)
Такое возникает на современных macOS, потому что при первом запуске приложения система проверяет подписано и нотариализованно оно, и если нет, то помещает его в карантин
sudo xattr -rd com.apple.quarantine /Applications/hello_world.app
Так можно снять карантин, и в итоге мы получили все что нужно, но каждый раз так муторно делать - тяжело, неприятно, поэтому я написал Makefile для того, чтобы все это автоматизировать.