Пакет Swift и `#if canImport (...)`. Как это работает? - PullRequest
0 голосов
/ 06 апреля 2020

Извините за смутное название.

Я пытаюсь создать пакет, который поможет мне использовать сторонние API облачного хранилища (например, Firebase Storage), добавив поддержку Combine и т. Д. c. Этот пакет делает то же самое с CloudKit. Все компилируется нормально, но когда я импортирую модуль пакета в отдельный мой проект, в модуле явно отсутствуют некоторые публичные c символы ...

В частности, те, которые заключены в условие #if canImport(FirebaseStorage) , Поскольку Firebase еще не поддерживает SwiftPM, эта часть пакета ведет себя так, как ожидается в самом проекте пакета; он просто пропускает компиляцию всего этого. Я подумал, что клиентский проект, который может импортировать этот модуль, скомпилирует его нормально.

В сторону: то, что я пытаюсь сделать, выглядит как необязательные зависимости. Я не хочу импортировать Firebase, чтобы использовать другие функции этого пакета. Я рассмотрел возможность разделения пакета на отдельные подпакеты, каждый из которых зависит от конкретной сторонней библиотеки, которую я хочу использовать. Я мог бы сделать это в любом случае. Но проблема остается в том, что Firebase еще не поддерживает SwiftPM (, хотя я слышал, что они близки ).

Моя проблема похожа на эта . Мой клиентский проект просто не видит условных символов, хотя он может импортировать Firebase и FirebaseStorage просто отлично! Я имею в виду, что в сгенерированном заголовке модуля они полностью отсутствуют, что не позволяет моему клиентскому проекту компилироваться, когда я их использую.

Мне кажется, что условие компиляции никогда не покидает объем зависимых целей пакета. Это тот случай? Или я что-то упускаю очевидное? Я всегда предполагал, что пакеты Swift просто импортируют и компилируют исходные файлы Swift в именованные модули, но теперь я думаю, что это не так.

Есть ли способ встроить код в пакет Swift, который компилируется только тогда, когда клиент может импортировать сторонний модуль, который еще не поддерживает SwiftPM? Или условная компиляция не работает таким образом?

РЕДАКТИРОВАТЬ: Вот документация Swift по условной компиляции, для справки.

...