Как использовать поля структуры syscall.SysProcAttr для Windows, когда ОС установлена ​​на Linux - PullRequest
1 голос
/ 11 июля 2020

Я работаю над кодом в Go, который установит программу. Он должен работать с системами Linux и Windows. Я использую Intellij.

    if isWindows() {
        cmd := exec.Command("msiexec.exe", "/i", filename, "/quiet", "L*V", installLog)
        cmd.SysProcAttr = &syscall.SysProcAttr{
            CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
        }
        if err := cmd.Start(); err != nil {
            log.Printf(failedInstallMsg, filename, err)
            return
        }
    } else if isLinux() {
            cmd := exec.Command("sudo", "-n", packageManagerTool, "--disablerepo=*", "install", "-y", filename)
            cmd.SysProcAttr = &syscall.SysProcAttr{
                Setpgid: true,
                Pgid: 0,
            }
            if err := cmd.Start(); err != nil {
                log.Printf(failedInstallMsg, filename, err)
                return
            }
        }
    }

Моя проблема в том, что, поскольку в IDE Go Project settings> Build tags для ОС установлено значение Linux, то поля структуры syscall.SysProcAttr доступны только для Linux. Это означает, что строка в случае windows, которая инициализирует структуру с помощью

        cmd.SysProcAttr = &syscall.SysProcAttr{
            CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP,
        }

, вызывает ошибку компиляции

unknown field CreationFlags in struct literal

Я попытался добавить

// +build linux windows

At в верхней части файла, но это не помогает.

Есть ли простой способ сосуществования кода для windows и linux, как описано выше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...