Написание CocoaPod в зависимости от React-Core (React / RCTBridge + Private.h) - PullRequest
0 голосов
/ 04 ноября 2019

Я являюсь соавтором библиотеки 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!.

Насколько мне известно, есть:

  1. Нет способа "аккуратно" в зависимости от каркаса (использовать его, только если он есть).
  2. Нет элегантногоспособ определить, вызывает ли подфайл потребляющий 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!»или нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...