Я столкнулся с этой проблемой в некоторых проектах с Xcode 9.3.1, и в моем случае проблема связана с некоторым быстрым кодом, который по какой-то причине Xcode не нравится. Эта проблема трудно решить, потому что трудно найти, какой файл вызывает проблему.
Когда у меня возникает эта проблема, я удаляю некоторые файлы из проекта Xcode (удаление ссылок), и я пытаюсь проверить, работает. Мой процесс для этого
В моем случае у меня было определение класса с реактивным расширением в том же файле, и по какой-то причине Xcode ему не нравится, я переместил реактивное расширение в другой файл и теперь индексирование отлично работает.
Решением является использование свойства Stderr
объекта Command. Это можно сделать следующим образом:
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
fmt.Println("Result: " + out.String())
Выполнение приведенного выше кода позволит понять, в чем заключается проблема:
состояние выхода 1: найти: -exec: нет завершения ";" или "+"
Редактировать:
В приведенном выше коде мы ожидаем, что в случае ошибки сообщения будут напечатаны в stderr и команду вернет ненулевой код ошибки. Это более или менее стандартно.
Однако, как упомянуто ниже @snorberhuis, некоторые команды выводят ошибки на стандартный вывод. Другие команды могут печатать в stderr, но возвращать код ошибки 0 (в этом случае err
будет nil
). И наличие сообщений в stderr не обязательно означает, что есть ошибка (инструменты ffmpeg делают это много).
Таким образом, в основном вам может понадобиться настроить приведенный выше код для соответствия ожидаемым командам.
Как упоминал Лоран, вы можете переопределить файловый дескриптор Stderr, чтобы захватить вывод stderr для лучшего сообщения об ошибке. Лично я предпочитаю использовать метод CombinedOutput
для команды, если выполняешь что-то относительно простое:
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
output, err := cmd.CombinedOutput()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + string(output))
return
}
fmt.Println(string(output))
Вот ссылка play.golang.org для приведенного выше примера: http: // play. golang.org/p/z8k9zO755P