Почему моя golang программа имеет такую ​​ошибку? exe c: "lib / synonyms": файл не существует - PullRequest
0 голосов
/ 02 февраля 2020

Я новичок в программировании, и я пытаюсь учиться golang. Я пишу учебные программы, и эта программа называется domainfinder, которая состоит из подпрограмм, одна из которых - синонимы. Я создал файл build.bat, который объединяет все программы и помещает их в папку lib. Затем mainfinder main. go выполняет все программы и запускает их вместе. Вот фрагмент main. go в папке domainfinder. Извините, если вопрос не велик, я никогда не задавал вопрос здесь раньше.

package main
import(
  "log"
  "os"
  "os/exec"
)
var cmdChain = []*exec.Cmd{
  exec.Command("lib/synonyms"),
  exec.Command("lib/sprinkle"),
  exec.Command("lib/coolify"),
  exec.Command("lib/domainify"),
  exec.Command("lib/available"),
}

1 Ответ

0 голосов
/ 02 февраля 2020

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.

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