В одном из моих определений .proto я импортирую определение метки времени Google:import "google/protobuf/timestamp.proto";
Из документации,
IMPORT_PATH указывает каталог, в котором нужно искать файлы .proto. при разрешении директив импорта.
Я почти уверен, что timestamp.proto не находится в моем IMPORT_PATH, который является текущим рабочим каталогом.
Являются ли определения google protobuf какими-то особенными? Эти определения Google установлены локально, когда был установлен protoc?





Они действительно особенные - их называют общеизвестными типами.
Компилятор пытается разрешить эти импорты относительно места установки исполняемого файла протокола; проверяются разные места. Если найдено местоположение, содержащее прото-определения для известных типов, это местоположение рассматривается как запасной вариант — другими словами, сначала проверяется путь относительно того, где запускается исполняемый файл protoc, перед проверкой местоположения. с известными определениями типов.
Вы можете увидеть это при выполнении компилятора с помощью strace или dtruss, например. на ОС X:
stat64("google/protobuf/timestamp.proto\0", 0x7FFEE4219B98, 0x0) = -1 2
open("google/protobuf/timestamp.proto\0", 0x0, 0xFFFFFFFFFFFFFFFF) = -1 2
stat64("/usr/local/Cellar/protobuf/21.8/include/google/protobuf/timestamp.proto\0", 0x7FFEE4219B98, 0x0) = 0 0
open("/usr/local/Cellar/protobuf/21.8/include/google/protobuf/timestamp.proto\0", 0x0, 0x0) = 3 0
Спасибо за все эти подробности - я не вижу ничего подходящего в каталоге исполняемого файла протокола, поэтому я думаю, что эти импорты имеют доступ
Cellar/protobuf/21.9_1/include. Таким образом, они были установлены одновременно с установкойprotoc, в отличие, например, от . Maven/Gradle, которые извлекают зависимости из API во время сборки.