Pull to refresh

Golang fyne Куда нажать? :-(

Reading time4 min
Views14K

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

И все? Так просто? Конечно нет

вот что пишется на macOS amr64
вот что пишется на macOS amr64

Значит надо придется собирать через докер, но там еще и еще копать, а мы с тобой не хотим заморачиваться, мы хотим быстро написать и отправить друзьям. 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 для того, чтобы все это автоматизировать.

Tags:
Hubs:
+2
Comments10

Articles