Kuidas käsureatööriistale dünaamilist Swifti raamistikku lisada

Vaatame läbi, kuidas ma üritasin oma käsurealtööriistale dünaamilist raamistikku lisada ja arutasime, mis igal sammul valesti läks.

1. samm: lisage see jaotisesse „Lingitud raamistikud ja teegid”

Rakenduse käitamisel juhtub järgmist:

dyld: teek pole laaditud: @ rpath / libswiftAppKit.dylib
Viidatud: /Users/seanberry/Library/Developer/Xcode/DerivedData/TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv/Build/Products/Debug/ThirdParty.framework/Versions/A
Põhjus: pilti ei leitud

KolmasParty.raamistik üritab leida kataloogi @rpath libswiftAppKit.dylib (mis on osa Swifti standardteekidest).

Näeme, kuidas ThirdParty.framework defineerib @rpath jooksmise teel

$ oTool -l ThirdParty.framework / Versioonid / Praegune / ThirdParty
Laadimiskäsk 27
cmd LC_RPATH
cmdsize 48
tee @execvable_path /../ raamistikud (nihe 12)
Laadimiskäsk 28
cmd LC_RPATH
cmdsize 40
tee @ laadimisrada / raamid (nihkumine 12)

Noh tulistada. Need pole meie käsurea tööriista jaoks asjakohased. Meil ei ole ühtegi kausta nimega / raamistikud ega ../raamistikud. Miks ta otsib seal Swifti standardraamatukogusid?

Kuna see on loodud iOS-i ja Mac-i rakenduste jaoks. Siin on Maci rakenduses kataloogistruktuur:

See seletab teed @execvable_path /../ Framework

Ja iOS-i puhul on rakenduse kataloogistruktuur järgmine:

@loader_path võrdub @execvable_path, kui raamistik laaditakse käivitatavast failist

Ja see selgitab tee @ loader_path / raamistikud (nihkumine 12)

Aga kuidas on meie, alandliku käsurea tööriista arendajaga? Swifti standardteegid on meie käivitatavas olekus staatiliselt seotud, kuid meie kolmanda osapoole raamistikud neid ei leia. Kahjuks ei salvestata neid igas Macis standardsesse kohta. Arendajad saavad juurdepääsu neile, mis on maetud Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx sisse (kuid ärge nõudke oma kasutajatelt Xcode'i installimist).

Mida me siis teeme? Tavaline tava, mida ma olen näinud, on luua oma projekti jaoks kohandatud raamistik, importida sinna kõik oma sõltuvused ja kopeerida ka kiired standardteegid.

2. samm: looge kohandatud raamistik ja kopeerige standardsed Swifti teegid

See kopeerib / kleepib Swifti standardsed teegid FirstParty.framework / Versioonid / Aktuaalne / Raamistikud /Kopeerige kindlasti ka oma kolmandast isikust sõltuvusNüüd on teie raamid kõik koos!

Täiuslik! Lähme nüüd edasi ja käivitage meie käsurea tööriist ...

objc [2335]: Klass _TtC8Dispatch16DispatchWorkItem on rakendatud mõlemas /Users/seanberry/Library/Developer/Xcode/DerivedData/TestCommandLineTool-fnrmhjvjmmvvceaqvbklzwhf/World/Despace/Web/Despace_Despace_Studio.html ja / Kasutajad / seanberry / Raamatukogu / Arendaja / Xcode / DerivedData / TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv / Ehitamine / Tooted / Silumine / TestCommandLineTool (0x1005c7698). Kasutatakse ühte kahest. Milline neist on määratlemata.
KORRIGE ÜLEMINE VIGA 20 erineval viisil

Teie rakendus näeb nüüd Swifti standardteekide kahte erinevat koopiat: need, mis on staatiliselt lingitud teie käivitatavas sisemuses, ja need, mis asuvad kaustas / Raamid.

Siit on kaks lahendust.

3. samm (valik A): tehke selle asemel Maci rakendus ja ekstraheerige käivitatav fail

Uurisin kuulsaid käsuridariistu Carthage ja SwiftLint, et näha, kuidas nad selle probleemiga hakkama said. Selgub, et neid ei seata üles käsurea tööriistadena! Need on Maci rakendused! Miks? Kuna Maci rakendus ei ühenda statistiliselt tavalisi raamatukogusid. Nad juurutavad end käsuridade tööriistadena, lisades käitamisfaasi, mis ekstraheerib rakenduse paketist käivitatava faili.

#! / prügikast / bash
## ekstraheerib Carthage CLI tööriista selle rakenduste kogumist. Taheti joosta
# osana Xcode Run Scripti ehitusetapist.
cp -v "$ {BUILT_PRODUCTS_DIR} / $ {EXECUTABLE_PATH}" "" $ {BUILT_PRODUCTS_DIR} / $ {EXECUTABLE_NAME} "

Võite minna edasi ja teha seda nii, pole probleemi. Kuid leidsin selle teema ümber teise tee.

3. samm (variant B): keelake staatiline linkimine

Lisage need oma kasutaja määratud seadistusseadetesse:

SWIFT_FORCE_DYNAMIC_LINK_STDLIB JAH
SWIFT_FORCE_STATIC_LINK_STDLIB EI

See sunnib teie käivitatavat dünaamiliselt linkima kõik teegid. Kindlasti öelge Xcode'ile, kust neid leida, lisades raamkataloogi otsinguradadele Runpath

@ käivitatav_tee / FirstParty.framework / versioonid / praegune / raamistikud

Õnne teie käsuridariistale!

Sean proovib saada Xcode'i Livefrontis kompileerimiseks