Как добавить дополнения редактора VSCode для платформ iOS в Linux - PullRequest
0 голосов
/ 27 июня 2019

Я все еще хотел бы иметь возможность использовать VSCode для черчения кода Swift на моей машине с Linux, пока я вдали от своего Mac.Но я не могу заставить sourcekit-lsp распознавать модули из iOS SDK.

У меня есть время от времени доступ к Mac, но я в основном использую свой компьютер с Linux.Таким образом, я могу создавать приложения на своем Mac, но я все же хотел бы иметь возможность использовать VSCode для предварительного написания кода Swift на моей машине с Linux.

Но я не могу получить sourcekit-lspраспознавать модули из iOS SDK.Аналогичен references.d.ts для разработчиков TypeScript, но с использованием swift, и об этом заботится только VSCode / sourcekit-lsp.

Я обкопал Xcode.app и нашел различные .modulemap и .swiftinterface файлы, которые, посмотрев в текстовом редакторе, похоже, что они предоставляют то, что я хочу, но я не знаю, как заставить sourcekit-lsp смотреть на них.

Чтобы подчеркнуть, я не ожидаю илихочу иметь возможность компилировать код iOS на машине с Linux.При устранении неполадок я использовал swift build только для поиска более значимых ошибок.Я не ожидаю реальных сборок - вот для чего Mac.Я просто хочу иметь возможность использовать автозаполнение из собственных модулей, таких как UIKit, в VSCode, чтобы потом я мог скопировать его на Mac для проверки.

Я знаю, это странный рабочий процесс, ноэто то, к чему у меня есть доступ прямо сейчас.

Настройка

Я скачал бета-версию Xcode 11 и извлек ее, чтобы получить доступ к фреймворкам / SDK.Тем не менее, я не могу найти способ заставить sourcekit-lsp понять заголовки для различных структур.

Кроме того, swift установлен в /usr/local/bin/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-06-21-a-ubuntu18.04.

, начиная с sourcekit-lsp не регистрирует много ошибок, я решил попробовать swift build снова и снова, приближаясь к «работе» настолько, насколько это возможно, пока, надеюсь, sourcekit-lsp что-нибудь подхватит.

Метод проб и ошибок

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

Я начал с указания swiftc на мой целевой SDK и iOS, используя -sdk Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -target arm64-apple-ios13.0

Это исправило ошибки модуля, не найденные (при запуске swift build)

<unknown>:0: error: unable to load standard library for target 'arm64-apple-ios13.0'

Я догадался, что это не были включены быстрые библиотеки, поэтому я скопировал Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos в /usr/local/bin/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-06-21-a-ubuntu18.04/usr/lib/swift/iphoneos, что действительно исправляет вышеуказанную ошибку.

Где я застрял

Теперь swift build выдает мне новую ошибку:

<unknown>:0: error: compiled module was created by an older version of the compiler; rebuild 'Swift' and try again: /usr/local/bin/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-06-21-a-ubuntu18.04/usr/lib/swift/iphoneos/Swift.swiftmodule/arm64.swiftmodule

Кроме того, при возврате к VSCode при наведении указателя мыши на импорт модуля (например, Foundation) выдается другая ошибка:

error response (Request Failed): did not find primary SourceFile

Я безуспешно пытался исправить эти ошибки.Мне не нужно swift build для работы, но я просто хочу sourcekit-lsp, чтобы позволить мне писать код, который использует UIKit / и т.д.

Package.swift

// swift-tools-version:5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription

let package = Package(
    name: "Example",
    platforms: [
        .iOS("13.0")
    ],
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "Example",
            targets: ["Example"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "Example",
            dependencies: [], swiftSettings: [SwiftSetting.unsafeFlags(["-sdk", "/why/doesnt/this/work/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk", "-target", "arm64-apple-ios13.0"])])
    ]

)
...