Как связать библиотеку CocoaPods без Xcode (integrate_targets false) - PullRequest
1 голос
/ 06 марта 2019

У меня есть быстрый проект, который построен без XCode.Я хочу использовать библиотеку из CocoaPods с ним.Учитывая следующее Podfile:

platform :osx, '10.11'
install! 'cocoapods', :integrate_targets => false
target 'Foo' do
  pod "PlainPing"
end
pre_install do |installer|
  installer.analysis_result.specifications.each do |s|
    s.swift_version = '4.2' unless s.swift_version
  end
end

Я могу легко встроить библиотеку в файлы .a и .swiftmodule:

pod install
cd Pods
xcodebuild

Но использование скомпилированной библиотеки из swiftc кажетсячтобы быть хитрым, я не могу угадать правильные заклинания пути поиска или гуглить их.Моя лучшая ставка:

swiftc -I ./build/Release/PlainPing -L ./build/Release/PlainPing -lPlainPing main.swift 

Сбой при

main.swift:2:8: error: cannot load underlying module for 'PlainPing'

Кажется, что -L путь поиска в библиотеке работает, но swiftc отсутствует что-то, чтобы фактически использовать .aфайл библиотеки.

1 Ответ

1 голос
/ 08 марта 2019

Версия с ручной компиляцией CocoaPod

Чтобы скомпилировать библиотеку CocoaPods, которая включает в себя и код Swift, и код Objective-C, выполните следующие действия:

  1. Скопируйте main.swift в Pods/PlainPing/Pod/Classes
  2. Компиляция PlainPing Код Objective-C
  3. Излучение PlainPing.swiftmodule
  4. Компиляция PlainPing испускающих объектов
  5. Компиляция приложения, включая испускаемые объекты и main.swift

Скрипт (скопировать и вставить в терминал):

 echo "1. Compiling Objective-C code" && \
 clang \
      -c \
      -fmodules \
      -fobjc-weak \
      -arch x86_64 \
      -w \
      SimplePing.m \
 && \
 echo "2. Emitting PlainPing.swiftmodule" && \
 swiftc \
      -emit-module \
      -module-name PlainPing \
      -import-objc-header SimplePing.h \
      PlainPing.swift SimplePingAdapter.swift \
 && \
 echo "3. Compiling PlainPing" && \
 swiftc \
      -emit-object \
      -module-name PlainPing \
      -import-objc-header SimplePing.h \
      PlainPing.swift SimplePingAdapter.swift \
 && \
 echo "4. Compiling app" && \
 swiftc \
      -o app \
      -I . \
      -L . \
      *.o main.swift \
 && \
 echo "5. Running app" && \
 ./app

Версия с использованием xcodebuild

Обязательно добавьте use_frameworks! во второй строке Podfile.

Скрипт (скопировать и вставить в терминал):

echo "Compiling Pods" && \
pod install && \
xcodebuild -project Pods/Pods.xcodeproj \
&& \
echo "Compiling App" && \
dir="build/Pods.build/Release/PlainPing.build/Objects-normal/x86_64" && \
swiftc \
  -o app \
  -L "$dir" \
  -I "$dir" \
  main.swift \
  $(find $dir -name '*.o' -exec echo -n '{} ' \;) \
&& \
echo "Running App" && \
./app

Пример main.swift

import Foundation
import PlainPing

PlainPing.ping("www.apple.com", withTimeout: 1.0, completionBlock: { (timeElapsed:Double?, error:Error?) in
    if let latency = timeElapsed {
        print("latency (ms): \(latency)")
    }

    if let error = error {
        print("error: \(error.localizedDescription)")
    }
})

RunLoop.main.run()
...