当我离开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的代码。
// 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"])])
]
)