разработка под разные ОС

102 views
Skip to first unread message

Дмитрий Фролов

unread,
Aug 13, 2019, 2:00:39 PM8/13/19
to Golang Russian
Постоянно сталкиваюсь с неудобствами когда код не будет компилироваться на другой ОС, пример:
 switch runtime.GOOS {
 
case "linux":
     cmd
= exec.Command()
 
case "darwin":
     cmd
= exec.Command()
 
case "windows":
     cmd
= exec.Command()
     cmd
.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
 
}
Хотя строка - cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} будет выполняться только под виндовс, компилятор под другими системами будет ругаться на нее.
Решение простое, разделить функцию на три и внести ее в файлы где в имени файла будет _windows   _linux   _darwin
Это несколько напрягает: 
1)можно как-то указать что часть кода компилируется на конкретной системе?
2)можно как-то указать что файл компилируется и на linux  и на darwin, т.е. не разделять на два файла?

Daniel Podolsky

unread,
Aug 13, 2019, 2:34:21 PM8/13/19
to gola...@googlegroups.com
можно указать тег сборки !windows
> --
> Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/58f4b2a8-73bf-4038-a476-6215e8af6a3c%40googlegroups.com.

Никита Лебедев

unread,
Aug 13, 2019, 3:54:04 PM8/13/19
to gola...@googlegroups.com
Попробуйте сделать makefile с разными biild-target. В зависимости от системы будете собирать с нужным таргетом. Нужны подробности?

вт, 13 авг. 2019 г., 21:00 Дмитрий Фролов <frolov.d...@gmail.com>:
--

Alex Lurye

unread,
Aug 13, 2019, 4:42:55 PM8/13/19
to Golang Russian
Не надо костылить. Выше Daniel Podolsky дал правильный ответ. Добавлю ссылку на документацию: https://golang.org/pkg/go/build/#hdr-Build_Constraints

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/CAJOmaV3MNTvdJt5uPE_p%3D6kw%2Bm85q7%2Bu3LvYGU9m6%3Du%2BWR13hA%40mail.gmail.com.

Igor Maznitsa

unread,
Aug 13, 2019, 4:51:19 PM8/13/19
to Golang Russian
можно препроцессинг юзать в принципе, но просто так с голым Go как и с голой Java скажем так не проделать, надо юзать соответствующую обвязку

Daniel Podolsky

unread,
Aug 13, 2019, 5:20:45 PM8/13/19
to gola...@googlegroups.com
> можно препроцессинг юзать в принципе, но просто так с голым Go как и с голой Java скажем так не проделать, надо юзать соответствующую обвязку

что именно не сделать?

1. выносим cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} в
отдельную функцию в отдельном файле
2. ставим этому файлу тег компиляции windows
3. в другом файле создаем функцию с той же сигнатурой, что и в п.1, в
тело ей пишем panic("not supported"). на случай, если мы случайно эту
функцию на неправильной платформе вызовем.
4. этому файлу ставим тег !windows
5. PROFIT

Дмитрий Фролов

unread,
Aug 14, 2019, 12:47:43 PM8/14/19
to Golang Russian

Всем спасибо,
разобрался.

Никита Лебедев

unread,
Aug 15, 2019, 1:54:03 AM8/15/19
to gola...@googlegroups.com
Что по итогу получилось-то?

ср, 14 авг. 2019 г., 19:47 Дмитрий Фролов <frolov.d...@gmail.com>:

Всем спасибо,
разобрался.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/golang-ru/2a2c2340-6b0f-4c13-8e86-9c6662dc9266%40googlegroups.com.

Дмитрий Фролов

unread,
Aug 17, 2019, 4:23:17 PM8/17/19
to Golang Russian
Использую три файла с кодом для windows, linux, darwin чисто для таких специфичных функций, как в этом совете:
1. выносим cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} в 
отдельную функцию в отдельном файле 
2. ставим этому файлу тег компиляции windows 
3. в другом файле создаем функцию с той же сигнатурой, что и в п.1, в 
тело ей пишем panic("not supported"). на случай, если мы случайно эту 
функцию на неправильной платформе вызовем. 
Собственно ничего  не изменилось, кроме использования тега !windows, я не знал про него. Никакого более элегантного способа нет.

четверг, 15 августа 2019 г., 8:54:03 UTC+3 пользователь Никита Лебедев написал:
Что по итогу получилось-то?

ср, 14 авг. 2019 г., 19:47 Дмитрий Фролов <frolov....@gmail.com>:

Всем спасибо,
разобрался.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес gola...@googlegroups.com.

Pavel Tsvetkov

unread,
Aug 19, 2019, 3:38:24 AM8/19/19
to Golang Russian
Как написал Daniel Podolsky так обычно и делается,

2019-08-14_11-56-05.png

То есть, есть  общий файл, в нем общие методы, а когда нужно разделить код на разные системы, то создают _windows   _linux   _darwin файлы. в них пишете билд тэги и все, под каждую систему пишете то, что нужно чтобы работало. Разделение будет на процессе сборки и тем самым не будет включать не нужный код и увеличивать размер исполняемого файла. И это удобно еще тем что повышает читаемость кода
Reply all
Reply to author
Forward
0 new messages