exec.Command("lib/synonyms")
означает выполнение файла lib/synonyms
относительно каталога, из которого была запущена программа , а не относительно источника main.go
.
Если ваш проект выглядит так this:
domainfinder/
main.go
lib/
synonyms
sprinkle
coolify
domainify
available
Программа будет работать только при выполнении из исходного каталога domainfinder/
. Где-нибудь еще, и он не сможет найти файлы. Или, что еще хуже, он выполнит несколько несвязанных файлов с тем же именем.
Вместо этого вы должны убедиться, что эти исполняемые файлы поставляются вместе с вашим исполняемым файлом (я не собираюсь демонстрировать это, потому что это не очень хорошая идея) , Затем используйте os.Executable () , чтобы найти, где хранится ваш исполняемый файл, и получить соответствующие файлы.
package main
import(
"os/exec"
"log"
"os"
"path/filepath"
)
func main() {
ex, err := os.Executable()
if err != nil {
panic(err)
}
executableDir := filepath.Dir(ex)
libDir := filepath.Join(executableDir, "lib")
cmd := exec.Command(filepath.Join(libDir, "synonyms"))
stdout, err := cmd.Output()
log.Printf("Command finished with error: %v", err)
log.Printf(string(stdout))
}
Однако вместо вызова исполняемых файлов гораздо, гораздо лучше вместо этого запишите их как Go библиотеки и функции. Это приведет к созданию более надежного, простого и легкого в использовании кода. Если вам нужны дополнительные исполняемые файлы, запишите их в виде библиотек и предоставьте тонкую исполняемую оболочку.
Как писать Go Код описывает, как структурировать проект Go.