Могу ли я определить, какие файлы находятся в проекте во время компиляции?

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

Мы используем основные данные, и разные приложения имеют разные модели данных; Если сущность не используется моделью данных приложения, соответствующий класс не будет встроен в это приложение.

Результатом этого является то, что некоторые из наших контроллеров содержат ссылки на классы, которые могут существовать или не существовать, когда контроллер используется в конкретном приложении. В настоящее время мы обходим это, используя "волшебный" #defines в файлах PCH наших приложений; поэтому некоторый код в нашем контроллере Issue обернут в #ifdef SGB_ISSUES_HAVE_TAGS и некоторый код в нашем контроллере регионов обернут в #ifdef SGB_REGIONS_ARE_FILTERED_BY_WORKFLOW,

Вместо этого я хотел бы сделать это, обнаружив, был ли файл включен в проект. Так что в верхней части нашего контроллера Issue у меня будет что-то вроде этого:

#if exists_in_project("SGBIssueTag.h")
#import "SGBIssueTag.h"
#endif

и тогда я мог бы поставить #ifdef SGB_ISSUES_HAVE_TAGS в SGBIssueTag.h; любое созданное нами приложение, использующее контроллер проблем, получит функциональность тега проблемы, как только мы включим сущность IssueTag, и нам не придется возиться с файлом PCH.

Возможно ли что-нибудь подобное?

1 ответ

Эта проблема укусила многих людей - проблема с заголовочными файлами, являющимися "глобальными" для проекта.

Мое предложение состоит в том, чтобы попытаться форсировать ошибки во время компиляции. Вы можете добавить в PCH или файл, включенный в него, определения для каждого приложения - допустим, у вас есть приложения A, B и C. Поэтому во время любой сборки активна только одна из них.

Затем в каждом файле.m (и, возможно, в некоторых файлах.h) вы будете условно включать заголовки:

...
#if defined(A) || defined(B)
#include "SomeInterfaceFile.h"
#endif
...

Как только вы начнете создавать A, вы получите ошибки компиляции в файлах, где исходный код ссылается на некоторый объект, который определен в заголовочном файле вне области видимости. Этот код вы также должны будете заключить в похожее выражение if.

Это будет отлично работать, с тем недостатком, что ваш код будет загроможден этими условными операторами.

Другие вопросы по тегам