Bir komanda xətti alətinə bir Swift dinamik çərçivəsi necə əlavə olunur

Komanda xətti alətimə necə dinamik bir çərçivə əlavə etməyə çalışdığımı və səhv olanları hər addımda müzakirə etdiyimi görək.

Addım 1: "Bağlı Çərçivələr və Kitabxanalar" bölməsinə əlavə edin

Tətbiqinizi işə saldığınız zaman nə baş verir:

dyld: Kitabxana yüklənməyib: @ rpath / libswiftAppKit.dylib
İstinad: /Users/seanberry/Library/Developer/Xcode/DerivedData/TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv/Build/Products/Debug/ThirdParty.framework/Versions/AT
Səbəb: şəkil tapılmadı

ThirdParty.framework, @rpath qovluğunda libswiftAppKit.dylib (standart Swift kitabxanalarının bir hissəsi olan) tapmağa çalışır.

Üçüncü Partiya.framework'ünü @rpath tərifini işləyərək görə bilərik

$ oTool -l Üçüncü Tərəf.framework / Versions / Current / ThirdParty
Yükləmə əmri 27 cmd LC_RPATH cmdsize 48 yol @executable_path /../ Frameworks (ofset 12)
Yük əmri 28 cmd LC_RPATH cmdsize 40 yol @ loader_path / Frameworks (ofset 12)

Yaxşı çək. Bunlar komut satırı alətimizlə əlaqəli deyil. / Frameworks və ya ../Frameworks adlı qovluqlarımız yoxdur. Niyə orada standart Swift kitabxanalarını axtarır?

Çünki iOS və Mac tətbiqetmələri üçün hazırlanmışdır. Bir Mac tətbiqindəki kataloq quruluşu:

Bu @executable_path /../ Frameworks yolunu izah edir

Və iOS üçün tətbiqdəki kataloq quruluşu:

Çərçivə yürütülebilir proqramdan yüklənəndə @loader_path @executable_path-ə bərabərdir

Və bu @ loader_path / Frameworks yolunu izah edir (ofset 12)

Bəs təvazökar bir komanda xətti alət inkişaf etdiricisi olan bizim haqqımızda? Standart Swift kitabxanaları yürütülebilir sənədimizdə statik olaraq əlaqələndirilir, ancaq üçüncü tərəflərimiz bunları tapa bilmir. Təəssüf ki, hər Mac-da standart bir yerdə saxlanmırlar. Geliştiricilər bunlara Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx daxil ola bilər (lakin istifadəçilərinizin Xcode yükləməsinə ehtiyac yoxdur).

Bəs nə edirik Adi təcrübə layihəniz üçün xüsusi bir çərçivə yaratmaq, bütün asılılıqları çərçivəyə gətirmək və sonra standart sürətli kitabxanaları da kopyalamaqdır.

Adım 2: xüsusi bir çərçivə yaradın və standart Swift kitabxanalarını kopyalayın

Bu, standart Swift kitabxanalarını kopyalayacaq / FirstParty.framework / Versions / Current / Frameworks / -ə yapışdıracaq.Üçüncü tərəfdən olan asılılığınızı da kopyaladığınızdan əmin olunİndi çərçivələriniz bir yerdə!

Mükəmməl! İndi komanda xətti alətimizi işə salın.

ObjC [2335] class _TtC8Dispatch16DispatchWorkItem həm dərsləri / İstifadəçilər / seanberry / Library / Developer / Xcode / DerivedData / TestCommandLineTool-fnrmhjvjmugvqueaqvbklzwhqvuv / Buildine / Prugyfibs / DerCommon / Buildine / Prugyfibs / Library / Oyunlar / seancode / Xcode / Test / Kitabxana / İstifadəçi / Kitabxana / FirstFrameworks / Xcode / Test / Kitabxana / Test / Kitabxana / Xcode edir / -fnrmhjvjmugvqueaqvbklzwhqvuv / Build / Products / Debug / TestCommandLineTool (0x1005c7698). İkisindən biri istifadə olunur. Hansı ki, təyin olunmamışdır.
Yuxarıdakı səhvləri 20 fərqli yolla təkrarlayın

İndi tətbiqinizdə standart Swift kitabxanalarının iki fərqli nüsxəsini görəcəksiniz: statistik olaraq yürütülebilir sənədinizdə və / Frameworks qovluğunda.

Bunun iki həlli var.

Adım 3 (Seçim A): Bunun əvəzinə bir Mac tətbiqi yaradın və yürütülebilir proqramı çıxarın

Bu problemlə necə məşğul olduqlarını görmək üçün məşhur Kartof və SwiftLint komut satırı alətlərini araşdırdım. Komanda xətti alətləri kimi qurulmadıqları ortaya çıxdı. Onlar Mac tətbiqetmələridir! Niyə? Bir Mac tətbiqi standart kitabxanaları statik olaraq bağlamadığından. Uygulama paketindən icra edilə bilənləri çıxaran bir icra mərhələsi əlavə edərək özlərini komanda xətti alətləri kimi yerləşdirirlər.

#! / bin / bash ## Carthage CLI alətini tətbiq paketindən çıxarır. Xcode Run Script qurma mərhələsinin bir hissəsi olaraq # işlədiləcəkdir.
cp -v "$ {BUILT_PRODUCTS_DIR} / $ {EXECUTABLE_PATH}" "$ {BUILT_PRODUCTS_DIR} / $ {EXECUTABLE_NAME}"

Bunu belə edə bilərsiniz, problem yoxdu. Ancaq bu problemi həll etmək üçün başqa bir yol tapdım.

Addım 3 (Seçim B): Statik əlaqəni söndürün

Bunları xüsusi qurma parametrlərinizə yapışdırın:

SWIFT_FORCE_DYNAMIC_LINK_STDLIB EVET SWIFT_FORCE_STATIC_LINK_STDLIB YOX

Bu, icra oluna bilən kitabçanı bütün kitabxanaları dinamik şəkildə əlaqələndirməyə məcbur edəcəkdir. Çalışma yolları üçün axtarış yollarına çərçivə kataloqu əlavə edərək Xcode-un harada tapacağını söylədiyinizdən əmin olun.

@ executable_path / FirstParty.framework / Versions / Current / Framework

Komanda xətti alətinizdə uğurlar!

Sean Xcode-un Livefront-da tərtib etməsini təmin etməyə çalışır