Правильный способ связать RxSwift в инструмент командной строки - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь собрать RxSwift для инструмента командной строки, но кажется, что это намного сложнее, чем с приложением для iOS.

Я создал новый проект командной строки и установил RxSwift с pod

$ cat Podfile
# Podfile
use_frameworks!

target 'HelloRx' do
    pod 'RxSwift',    '~> 4.0'
end

$ pod --version
1.5.3

XCode 10.1

После открытия рабочей области (.xcworkspace) и без добавления какого-либо кода проект строится нормально, но происходит сбой при запуске:

dyld: Library not loaded: @rpath/RxAtomic.framework/Versions/A/RxAtomic
  Referenced from: /Users/luke/Library/Developer/Xcode/DerivedData/HelloRx-ftbkqquhoytidfesyxazbaovndbu/Build/Products/Debug/HelloRx
  Reason: image not found

Динамические зависимости не видны для двоичного файла.

$ otool -l HelloRx | grep -A 2 RPATH | grep path
         path @executable_path/../Frameworks (offset 12)
         path @loader_path/Frameworks (offset 12)
         path @executable_path/../Frameworks (offset 12)
         path @loader_path/Frameworks (offset 12)

XCode предположил, что двоичный файл может найти рамки в каталоге Frameworks относительно двоичного файла.К сожалению, если я загляну в каталог сборки, там нет Frameworks dir, отсюда и ошибка.

$ ls
HelloRx         Pods_HelloRx.framework  RxCocoa
HelloRx.swiftmodule RxAtomic        RxSwift

$ ls ..
Debug

Чтобы сделать его еще более запутанным, все фреймворки были скопированы в собственный Rx* dir, а не в один глобальный Frameworks dir.

Я могу это исправить, добавив дополнительные пути в «Настройки сборки» >> «Пути поиска по пути».

'@executable_path/RxAtomic'
'@executable_path/RxSwift'

Я добиваюсь цели, но бинарный файл все равно падает.

dyld: Library not loaded: @rpath/libswiftAppKit.dylib
  Referenced from: /Users/luke/Library/Developer/Xcode/DerivedData/HelloRx-ftbkqquhoytidfesyxazbaovndbu/Build/Products/Debug/RxSwift/RxSwift.framework/Versions/A/RxSwift
  Reason: image not found

Теперь отсутствует RxSwift libswiftAppKit.dylib.

Это можно «исправить», добавив еще один путь к Runpath.

'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx'

Это, наконец, остановит сбои, номое приложение выдает много предупреждений:

objc[64025]: Class _TtCE6AppKitVSo17NSAnimationEffectP33_9E6F1C1DB126EBCC5B18B8BAC8A387CC26_CompletionHandlerDelegate is implemented in both /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftAppKit.dylib (0x101360b98) and /Users/luke/Library/Developer/Xcode/DerivedData/HelloRx-ftbkqquhoytidfesyxazbaovndbu/Build/Products/Debug/HelloRx (0x10059a250). One of the two will be used. Which one is undefined.
objc[64025]: Class _TtC8Dispatch16DispatchWorkItem is implemented in both /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftDispatch.dylib (0x101a7c6d0) and /Users/luke/Library/Developer/Xcode/DerivedData/HelloRx-ftbkqquhoytidfesyxazbaovndbu/Build/Products/Debug/HelloRx (0x10059bd28). One of the two will be used. Which one is undefined.
objc[64025]: Class _TtC10FoundationP33_45BFD3D387700B862E3A7353B97EF7ED20_CharacterSetStorage is implemented in both /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftFoundation.dylib (0x101c34f00) and /Users/luke/Library/Developer/Xcode/DerivedData/HelloRx-ftbkqquhoytidfesyxazbaovndbu/Build/Products/Debug/HelloRx (0x10059d5e8). One of the two will be used. Which one is undefined.
objc[64025]: Class _TtC10Foundation12_DataStorage is implemented in both /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftFoundation.dylib (0x101c34fa8) and /Users/luke/Library/Developer/Xcode/DerivedData/HelloRx-ftbkqquhoytidfesyxazbaovndbu/Build/Products/Debug/HelloRx (0x10059d690). One of the two will be used. Which one is undefined.
...

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

(я новичок в XCode и Swift, так что, возможно, я делаю что-то сумасшедшее)

1 Ответ

0 голосов
/ 22 января 2019

Одним из быстрых способов может стать использование всех структур pods в качестве статических библиотек.

  1. Выбор проекта Pods в Навигаторе проекта
  2. Выбор основного проекта Pod над всеми целями pods
  3. Перейдите в Настройки сборки и измените Mach-O Type на Static Library.Это изменит все модули, чтобы иметь Mach-O Type как Static Library.(Каждый раз, когда вы запускаете pod install, это будет изменяться обратно, поэтому вам, возможно, придется делать это снова)
  4. Очистить

Преимущество этого метода в том, что ваш вывод будетодин исполняемый файл.

Если вы хотите использовать динамические платформы, следуйте этому руководству: https://medium.com/livefront/how-to-add-a-dynamic-swift-framework-to-a-command-line-tool-bab6426d6c31. Используя этот второй метод, вы получите не просто один исполняемый файл, но вам нужно будет предоставить все динамическиерамки также.

...