我对swift和xcode世界不熟悉,所以我在尝试将软件包集成到我的项目时遇到了问题。
我想使用以下命令添加Alamofire依赖项:
在我的根项目文件夹中:
swift init
这会创建Package.swift文件,我在里面添加依赖项,然后运行:
swift build
一切似乎都没问题,但是当我尝试导入我的库时,我的项目是:
import Alamofire
我收到错误,它说该模块无法识别。 所以我的问题是,在没有崩溃的情况下,将Package Manager和依赖项集成到现有项目的正确步骤是什么。
更新
swift build
输出:
Resolved version: 4.3.0
Compile Swift Module 'Alamofire' (17 sources)
Compile Swift Module 'Sample' (1 sources)
我的Package.swift是:
import PackageDescription
let package = Package(
name: "Sample",
dependencies: [
.Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4)
]
)
答案 0 :(得分:5)
Swift Package Manager是一个独立的工具,无需Xcode即可管理依赖关系和构建项目。它可以使用swift package generate-xcodeproj
为您生成Xcode项目。
但是,目前,Swift Package Manager仅支持为macOS和Linux平台构建项目。构建适用于iOS,tvOS和watchOS的项目的唯一方法是使用Xcode,其中包括这些平台所需的SDK。
有多种方法可以使用Swift Packages Manager来管理iOS / tvOS / watchOS的依赖关系,但这并不容易,并且需要手动操作。如果您有兴趣,请看看https://github.com/j-channings/swift-package-manager-ios
答案 1 :(得分:1)
如果你使用的是 Xcode 项目,则不需要 Package.swift
,只需在 Xcode 中的 Swift Packages 中点击加号图标,并添加 Swift Package 的 GitHub URL,该库也会自动添加到您的目标(按照下面的 GIF,或点击图片中的添加图标 here):
您不能为相同的目标同时维护 Xcode 项目和 Swift.package。它们不同步,swift package generate-xcodeproj
已被弃用(这曾经是基于 Package.swift 创建 xcodeproj 的方式,但对此 Xcodeproj 的更改并未反映在原始 Package.swift
中)。
答案 2 :(得分:0)
Swift 包管理器 (SPM)
生产:如果您正在开发库/模块(模块化),您应该注意支持它
Package.swift
- 清单文件。
target '<target_name>' in package '<package_name>' is outside the package root
Package.swift 示例
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "PackageName1",
//Supported platforms
platforms: [
.iOS(.v11)
],
//Product list - executable binary
products: [
.library(
name: "LibraryName1",
targets: ["TargetName1"]),
],
//Additional SPM dependencies declaration(packages) which are used in targets
dependencies: [
//Local package path
.package(name: "PackageName2", path: "../Feature1")
//Local package URL
.package(name: "PackageName2", url: "file:///some_local_path", .branch("master"))
//Remote package URL
.package(name: "PackageName2", url: "https://github.com/user/repo", .branch("master")),
],
targets: [
//Source code location. implicitly `Sources/<target_name>`(Sources/TargetName1) or explicitly `path:`
.target(
name: "TargetName1",
dependencies: [
//using dependencies from package.targets and package.dependencies
//package.targets
"LibraryName2"
//package.dependencies
.product(name: "PM2LibraryName1", package: "PackageName2")
]),
path: "Sources/TargetName1"
]
)
对 Swift 依赖的观察
explicit multi module
[About] 的 .modulemap
并且可以访问想import Module1
import Module2
.modulemap umbrella.h
[About],用于为 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.从同一个包中添加另一个目标
例如使用 Explicit Dependency
[About]。重要提示:使用相同的名称(模块和 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; consider using '// swift-tools-version:5.3' to specify the current tools version
*在测试之前不要忘记提交您的更改并更新[About]