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
Должно получится сейчас что-то вроде такого
Теперь запустим
go run main.go
Ура победа
Ну вот и все, мы научились, хотя я вроде что-то говорил про разные системы и так далее, что все сложно, а тут так просто, что-то не так. Вспомним на базовом уровне как мы запускаем приложения
go build -o hello_world
Мы использовали флаг -o чтобы сообщить в каком виде будет бинарник
Вот и наш бинарник hello_world, он запускается с ./hello_world, это не очень удобно, плюс не у всех такая же os и архитектура процессора, как у тебя, поэтому не все смогут запустить, да и большая часть людей на windows и они не знакомы с терминалом, поэтому нам надо собрать под разные системы и в итоге мы получим несколько бинарников.
Go кросс-платформенный и это его плюс, можно из одной платформы собрать под другую. Обычно на Go собирают под другие платформы следующим образом:
env GOOS=windows GOARCH=amd64 go build -o hello_world.exe
И все? Так просто? Конечно нет
Значит надо придется собирать через докер, но там еще и еще копать, а мы с тобой не хотим заморачиваться, мы хотим быстро написать и отправить друзьям. 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
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
Ура победа? А вот и нет еще, теперь загрузим в интернет, скачаем от туда .dmg и установим приложение
Такое возникает на современных macOS, потому что при первом запуске приложения система проверяет подписано и нотариализованно оно, и если нет, то помещает его в карантин
sudo xattr -rd com.apple.quarantine /Applications/hello_world.app
Так можно снять карантин, и в итоге мы получили все что нужно, но каждый раз так муторно делать - тяжело, неприятно, поэтому я написал Makefile для того, чтобы все это автоматизировать.
Комментарии (10)
gohrytt
08.10.2022 18:24Файн конечно максимально интеесный в будущем проект, но пока с текущим внешним видом встроенных компонентов будем обьективны шансов стать популярным у него мало.
Pastoral
08.10.2022 18:34Что "про iOS можно забыть ведь там только через App Store" это не совсем так, на представлении приложений как находящихся в разработке альтернативные магазины работают, но подписывать всё равно нужно, так что не велика потеря.
Ссылке Здесь лучше бы было вести на https://fyne.io/.
valerijhegaj Автор
10.10.2022 15:17Про приложения iOS в разработке не знал, спасибо, изучу этот вопрос
Про ссылку спасибо, вроде поправил, но не очень уверен что оно поправилось, моя первая статья)
LeshiyUrban
09.10.2022 07:09+2Fyne очень тяжелый. Я на него возлагал большие надежды, но на Линуксе и Маке более-менее реалистичное приложение (много экранов, уведомления, таблицы...) ест батарейку и память больше чем хорошо написанное приложение на электроне.
Pastoral
09.10.2022 18:06Вот тут подробнее - а какая ему разница сколько там экранов если они всё равно ничего не делают? Скорее всего всё та же детская ошибка что и везде - проверка наличия событий функцией немедленно возвращающей что их нет. В цикле. Где-то видел, кажется по поводу SDL, как решение в виде задержки на фиксированное число миллисекунд было принято как нормальное.
Запустил fyne_demo на Линукс - то 0 то 1 процент CPU, запустил hello world Flutter - всё время 0, но бодро кликая по кнопке можно поднять за 20% - тоже не нормально, ИМХО. Запустил аналог на Lazarus - так 0%, но бодро кликая можно поднять до 1%, а бодро шевеля мышкой - аж до 3%.
Всё новое - радикально порченное старое?
LeshiyUrban
10.10.2022 02:18Вот одна из проблем, на которую я сам напоролся https://github.com/fyne-io/fyne/issues/2506
Pastoral
10.10.2022 12:26+1Ага, "polls GLFW events 60 times a second, triggered by the messages on a channel created by
time.Ticker".
Именно это я и имел в виду.
Stasenko_Konstantin
10.10.2022 14:46+1Код библиотеки и правда читается очень легко. Когда писал всякое по учебе частенько приходилось туда нырять, но в основном это происходило из-за скудной документации.
Ztare
Но зачем?
Буханка и троллейбус.jpg
valerijhegaj Автор
Ну в рунете мало информации о fyne Golang, я собрал тут минимум для того, чтобы пользоваться библиотекой, а сам fyne, он скорее для обучения, например человек написал логику работы игры на Golang, и хочет скинуть своим друзьям, и не заморачиваться насчет того, как оформить внешне