Я являюсь соавтором библиотеки React Native, которая зависит от RCTBridge. В процессе реализации поддержки автоподключения я пишу Podspec и задаюсь вопросом, как лучше объявить зависимость от React.
Концерн # 1
Мой текущий подход заключается в наличии зависимости PodSpec от (устаревшего) модуля React (который, я считаю, будет разрешен в модуле dev, указанном в подфиле потребляющего приложения) и добавления пути заголовков React к xcconfig HEADER_SEARCH_PATHS
, в основном:
app_path = File.expand_path('../..', __dir__)
Pod::Spec.new do |s|
# ... here goes a lot of other stuff
s.dependency 'React'
s.pod_target_xcconfig = { "'#{app_path}/ios/Pods/Headers/Public/React-Core'" }
end
Это работает, но мне не нравится, что он делает предположение о местонахождении пути моего модуля узлов относительно папки ios и Pods потребляющих приложений. На практике мы могли бы использовать '"$(PODS_ROOT)/Headers/Public/React-Core/"'
вместо этого, но это нарушает линтование библиотеки (работает pod lib lint
), потому что тестовое приложение, созданное во время этого линтинга, не имеет Podfile, который зависит от локального модуля разработчика как обычное приложение React Native. Podfile.
Concern # 2
Мы бы хотели, чтобы наша библиотека поддерживала сценарии, в которых потребитель использует фреймворки через use_frameworks!
, которые объединяют React в каталог фреймворков,Это означает, что заголовок больше не будет находиться в папке ios/Pods/Headers
, и вместо этого наш модуль должен зависеть от React
framework:
Pod::Spec.new do |s|
# ... here goes a lot of other stuff
s.framework 'React'
s.dependency 'React'
end
Но при добавлении этого Podfile для потребителей должен вызвать use_frameworks!
.
Насколько мне известно, есть:
- Нет способа "аккуратно" в зависимости от каркаса (использовать его, только если он есть).
- Нет элегантногоспособ определить, вызывает ли подфайл потребляющий Podfile
use_frameworks!
изнутри Podspec.
Это правда?
Мой текущий (и супер хакерский) способ обойти этопримите местоположение подфайла потребителей и проверьте наличие «use_framework!»:
app_path = File.expand_path('../..', __dir__)
podfile_path = File.expand_path('ios/Podfile', app_path)
begin
podfile = File.read(podfile_path)
uses_frameworks = podfile.scan(/\n\s*use_frameworks!\n/).any?
rescue
uses_frameworks = false
end
Pod::Spec.new do |s|
# ... here goes a lot of other stuff
# Conditionally depend on the React framework
if uses_frameworks
s.framework 'React'
end
# Depending on the React pod is still needed for some reason ...
s.dependency 'React'
end
Мой вопрос к вам
Есть ли у вас какие-либо идеи о более изящных способах достижения целей? импорта заголовка «React / RCTBridge + Private.h» и поддержки потребителей независимо от них с помощью «use_frameworks!»или нет?