Swift Package Manager(SPM)
[iOS 依赖管理器]
使用: [SPM 管理依赖项]
生成: 如果您正在开发库/模块(模块化),则应该注意支持它
Package.swift
- 清单文件。
- 这是一个硬编码名称。
- 应该放置在相同或更高的级别,否则:
target '<target_name>' in package '<package_name>' is outside the package root
Package.swift 示例
import PackageDescription
let package = Package(
name: "PackageName1",
platforms: [
.iOS(.v11)
],
products: [
.library(
name: "LibraryName1",
targets: ["TargetName1"]),
],
dependencies: [
.package(name: "PackageName2", path: "../Feature1")
.package(name: "PackageName2", url: "file:///some_local_path", .branch("master"))
.package(name: "PackageName2", url: "https://github.com/user/repo", .branch("master")),
],
targets: [
.target(
name: "TargetName1",
dependencies: [
"LibraryName2"
.product(name: "PM2LibraryName1", package: "PackageName2")
]),
path: "Sources/TargetName1"
]
)
Swift 依赖项的观察
import Module1
import Module2
- Swift库通过
.modulemap umbrella.h
[关于]暴露模块,以便Objective-C消费者通过@import SomeModule;
使用。
- You are able to work with `Package.swift` in Xcode if double click on it
.swiftpm/xcode with .xcworkspace will be generated
- When you work with `Package.swift` you are able to check it, just save this file
- When you work with `Package.swift` you should specify schema and device(platform)
- When you build `Package.swift`
- library and .swiftmodule is located:
<path_to_derived_data>/DerivedData/<folder_name_where_Package.swift_located>-<randomizer>/Build/Products/<platform>
//e.g.
/Users/alex/Library/Developer/Xcode/DerivedData/someFolder-ccivqbbjujxuvdcxtuydyqfeepfx/Build/Products/Debug-iphonesimulator
- .modulemap and umbrella.header is located:
<path_to_derived_data>/DerivedData/<folder_name_where_Package.swift_located>-<randomizer>/Build/Intermediates.noindex/<project_name>.build/<platform>/<target_name>.build/<.modulemap> and plus /Objects-normal/<arch>/<tarhet_name-Swift.h>
- When you build consumer with `Package.swift` results files will be located:
<path_to_derived_data>/DerivedData/<target_name>-<randomizer>/Build/Products/<platform>
- When you work with consumer of `Package.swift` SPM clones it into
<path_to_derived_data>/DerivedData/<target_name>-<randomizer>/SourcePackages/checkouts
package.products.library.targets
您可以指定多个目标。这意味着可以从单个可执行二进制文件(一种类似于“伞”库)中使用多个模块。
producer:
package.products.library.targets: ["TargetName1", "TargetName2"]
consumer:
1. adds single library
2. several imports
import TargetName1
import TargetName2
package.targets.target.dependencies
如果您的目标有依赖关系,您将获得相同的效果 - Umbrella库。
1.从同一软件包中添加另一个目标
例如,使用显式依赖项
[关于]。重要提示:使用相同的名称(模块和SPM目标)。如果您没有在package.targets.target.dependencies
中设置依赖项,则会出现以下错误
Undefined symbol
2.从另一个软件包添加产品。其他软件包中的所有目标将被公开。
2.1 本地软件包路径
您无法在消费端使用它。但至少可以让您进行调试。
package <package_name_1> is required using a revision-based requirement and it depends on local package <package_name_2>, which is not supported
2.2 本地包 URL
路径中不要使用空格(
),否则会出现以下错误
The URL file:///hello world/some_local_path is invalid
如果您不指定// swift-tools-version:<version>
,则会得到以下结果:
package at '<some_path>' is using Swift tools version 3.1.0 which is no longer supported
*不要忘记在测试之前提交您的更改并更新[关于]
Package.swift
文件添加到你的问题中? - mueschaswift package init
i guess - krafter