簡體   English   中英

在現有的 xcode 項目上使用 swift 包管理器

[英]Use swift package manager on existing xcode project

我是 swift 和 xcode 世界的新手,所以我在嘗試將包集成到我的項目時遇到了問題。

我想使用以下命令添加 Alamofire 依賴項:

在我的根項目文件夾中:

swift init

這將創建 Package.swift 文件,我在里面添加依賴項,然后運行:

swift build

一切似乎都沒問題,但是當我嘗試導入我的庫時,我的項目是:

import Alamofire

我收到一個錯誤,它說模塊未被識別。 所以我的問題是,在不使一切崩潰的情況下,集成包管理器和對現有項目的依賴的正確步驟是什么。

更新:

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

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

除此之外,我建議使用CarthageCocoaPods

Xcode 11 更新

Swift 包管理器現已集成到 Xcode 11 中。您可以通過依次轉到“文件”、“Swift 包”和“添加包依賴項...”來添加包。將存儲庫的 URL 粘貼到上面的字段中,然后單擊“下一步”。 Xcode 將引導您完成其余步驟。 您可以在此 WWDC 演講中了解更多信息。

如果您使用的是 Xcode 項目,則不需要(也不應該使用) Package.swift ,只需在 Xcode 中的 Swift Packages 中單擊加號圖標,然后添加 Swift Package 的 GitHub URL 和庫也將自動添加到您的目標(按照下面的 GIF 操作,或單擊此處圖像中的添加圖標):

額外信息

您不能為相同的目標同時維護 Xcode 項目和 Swift.package。 它們不同步,並且會變得不一致,因此根據使用哪些工具,您將獲得不同的構建:令人困惑。 您過去可以使用swift package generate-xcodeproj基於Package.swift創建swift package generate-xcodeproj ,但現在已棄用。 您對此 Xcodeproj 所做的更改未反映在原始Package.swift )。

Swift 包管理器 (SPM)

[iOS 依賴管理器]

消費[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 依賴的觀察

  • [SWIFT_MODULE_NAME、PRODUCT_NAME、EXECUTABLE_NAME] == package.targets.target.name
  • package.products.library.name 僅用於 Xcode 表示
  • 圖書館被使用[關於]
  • 當目標依賴於另一個目標時,源代碼將被包含到單個庫中,並帶有一種來自.modulemap [About]explicit multi module ,並且可以考慮訪問
import Module1
import Module2
  • Swift 庫轉換為單個.o format [About]文件和.swiftmodule [About]
  • Swift 庫公開.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 本地包地址

不要使用空格( ) 在路徑中或者你得到

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

*在測試之前不要忘記提交您的更改並更新[關於]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM