Как скомпилировать программу находясь на каталог выше go.mod?

У меня есть программа которая компилирует другие программы: compiler.go:

package main

import (
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command("go", "build", "projects/helloword/main.go")
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin
    cmd.Stderr = os.Stderr
    cmd.Run()
}

Всё дерево каталогов выглядит так:

.
├── compiler <- Исполняемый файл который билдит проект ниже.
└── projects
    └── helloword
        ├── go.mod
        ├── hi
        │   └── hi.go
        └── main.go

Проблема в том что насколько я понял компилятор не видит go.mod так как go build запускается на каталог выше go.mod.

projects/helloword/main.go:3:8: no required module provides package github.com/c0caina/helloword/hi: go.mod file not found in current directory or any parent directory; see 'go help modules'

Как скомпилировать проект из другой программы? Я не могу опустить compiler на уровень ниже что бы он находился в одной папке с go.mod. Есть какие то другие способы скомпилировать? Например вызвать exec.Command не в том же месте где лежит исполняемый файл а в каталоге helloword. Или может есть какой то другой способ об котором я не догадываюсь?


Ответы (1 шт):

Автор решения: Senior Pomidor

в cmd есть специальное поле Dir, отвечающее за рабочую директорию. можно ее определить, задать из какой директории будет выполняться программа.

cmd := exec.Command("go", "build", "projects/helloword/main.go")
cmd.Dir = "/path/to/dir/"
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
cmd.Run()
→ Ссылка