如何在Linux上为iOS框架添加VSCode编辑器完成

时间:2019-06-27 01:28:54

标签: ios swift visual-studio-code language-server-protocol

当我离开Mac时,我仍然希望能够使用VSCode在Linux机器上起草Swift代码。但是我无法sourcekit-lsp来识别iOS SDK中的模块。

我偶尔可以访问Mac,但是大多数情况下使用的是Linux计算机。这样,我可以在Mac上构建应用程序,但是我仍然希望能够使用VSCode提前在Linux机器上起草Swift代码。

但是我无法获得sourcekit-lsp来识别iOS SDK中的模块。与TypeScript开发人员的references.d.ts类似,但操作迅速,只有VSCode / sourcekit-lsp关心它。

我在Xcode.app周围进行了挖掘,发现了各种.modulemap.swiftinterface文件,这些文件在文本编辑器中查找后看起来好像它们提供了我想要的,但我没有知道如何让sourcekit-lsp来看他们。

  

为了强调,我不希望也不想能够在Linux计算机上编译 iOS代码。在故障排除中,我仅使用swift build来查找更有意义的错误。我不希望实际的构建会发生-这就是Mac的用途。我只希望能够在VSCode中使用本机模块(如UIKit)中的自动补全功能,以便稍后将其复制到Mac上进行测试。

我知道,这是一个奇怪的工作流程,但这是我现在可以访问的内容。

设置

我已经下载了Xcode 11 beta并解压缩了它,以便可以访问框架/ SDK。但是,我似乎找不到找到sourcekit-lsp来了解各种框架标头的方法。

此外,在/usr/local/bin/swift-5.1-DEVELOPMENT-SNAPSHOT-2019-06-21-a-ubuntu18.04下安装了swift。

由于sourcekit-lsp不会记录很多错误,因此我决定一遍又一遍地尝试swift build,并尽可能接近“工作”状态,直到希望sourcekit-lsp会有所收获

试错

到目前为止,我已经尝试了许多不同的命令。但是,我将遵循我所取得的最好的进步。

我首先使用swiftc-sdk Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -target arm64-apple-ios13.0指向我的SDK和iOS目标

这解决了模块未找到的错误(当我运行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 / etc的代码。

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"])])
    ]

)

0 个答案:

没有答案