Xcode配置指南.md 5.7 KB

Xcode 配置指南 - Swift Package 依赖

📋 问题说明

在 Xcode 中,Swift Package 需要通过以下方式添加依赖:

  1. BaseCommon 依赖 BaseCore
  2. 能力层(CapabilityPush)依赖 BaseCore
  3. 业务项目(xdz)依赖所有模块

🔧 配置步骤

方法一:在 Xcode 项目中添加本地包依赖(推荐)

1. 打开 Xcode 项目

cd xdz_ios/xdz
open xdz.xcodeproj

2. 添加 BaseCommon 依赖

  1. 在 Xcode 中,选择项目 xdz(左侧导航栏最顶部)
  2. 选择 Target xdz
  3. 点击 "General" 标签
  4. 找到 "Frameworks, Libraries, and Embedded Content" 部分
  5. 点击 "+" 按钮
  6. 选择 "Add Other...""Add Package Dependency..."
  7. 选择 "Add Local..."
  8. 导航到 ../BaseCommon 目录并选择
  9. 点击 "Add Package"

注意:BaseCommon 已经依赖了 BaseCore,所以添加 BaseCommon 后会自动传递依赖 BaseCore,不需要单独添加 BaseCore!

3. 添加 CapabilityPush 依赖

重复步骤 2,但这次选择 ../CapabilityPush 目录。

注意:CapabilityPush 已经依赖了 BaseCore,所以添加 CapabilityPush 后也会自动传递依赖 BaseCore。

方法二:使用 Package.swift(如果项目支持)

如果你的 xdz 项目也使用 Swift Package Manager,可以创建 Package.swift

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "xdz",
    platforms: [
        .iOS(.v15)
    ],
    dependencies: [
        // 只需要依赖 BaseCommon 和 CapabilityPush
        // BaseCore 会通过传递依赖自动引入
        .package(path: "../BaseCommon"),
        .package(path: "../CapabilityPush")
    ],
    targets: [
        .executableTarget(
            name: "xdz",
            dependencies: [
                // BaseCommon 已经依赖了 BaseCore,所以会自动传递
                .product(name: "BaseCommon", package: "BaseCommon"),
                // CapabilityPush 已经依赖了 BaseCore,所以会自动传递
                .product(name: "CapabilityPush", package: "CapabilityPush")
            ]
        )
    ]
)

方法三:使用 Xcode Workspace(推荐用于多模块项目)

1. 创建 Workspace

cd xdz_ios
xcodebuild -workspace xdz.xcworkspace -list 2>/dev/null || \
  mkdir -p xdz.xcworkspace/xcshareddata/swiftpm && \
  cat > xdz.xcworkspace/contents.xcworkspacedata << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:xdz.xcodeproj">
   </FileRef>
   <FileRef
      location = "self:BaseCore">
   </FileRef>
   <FileRef
      location = "self:BaseCommon">
   </FileRef>
   <FileRef
      location = "self:CapabilityPush">
   </FileRef>
</Workspace>
EOF

2. 打开 Workspace

open xdz.xcworkspace

📝 验证依赖关系

1. 检查 BaseCommon 是否正确依赖 BaseCore

BaseCommon/Sources/BaseCommon/Common/Network/NetworkHelper.swift 中:

import BaseCore  // 应该可以正常导入

2. 检查 CapabilityPush 是否正确依赖 BaseCore

CapabilityPush/Sources/CapabilityPush/Push/Impl/PushServiceImpl.swift 中:

import BaseCore  // 应该可以正常导入

3. 检查 xdz 项目是否正确依赖所有模块

xdz/xdz/xdzApp.swift 中:

import BaseCommon      // 直接导入 BaseCommon(会自动包含 BaseCore)
import CapabilityPush  // 直接导入 CapabilityPush(会自动包含 BaseCore)

// 如果需要直接使用 BaseCore 的接口,也可以导入
import BaseCore        // 可选,因为 BaseCommon 已经包含了

🐛 常见问题

问题 1:Xcode 找不到包

解决方案

  1. 确保所有 Package.swift 文件都在正确的目录中
  2. 在 Xcode 中:File → Packages → Reset Package Caches
  3. 重新添加包依赖

问题 2:依赖关系错误

解决方案

  1. 检查 Package.swift 中的路径是否正确(相对路径)
  2. 确保所有包都在同一层级目录中: xdz_ios/ ├── BaseCore/ ├── BaseCommon/ ├── CapabilityPush/ └── xdz/

问题 3:编译错误 "No such module 'BaseCore'"

解决方案

  1. 确保在 Target 的 "Build Phases" → "Link Binary With Libraries" 中添加了依赖
  2. 清理构建:Product → Clean Build Folder (Shift+Cmd+K)
  3. 重新构建:Product → Build (Cmd+B)

🔍 快速检查脚本

创建一个检查脚本:

#!/bin/bash
# check_dependencies.sh

cd "$(dirname "$0")"

echo "=== 检查 Swift Package 结构 ==="
echo ""

echo "1. BaseCore Package.swift:"
if [ -f "BaseCore/Package.swift" ]; then
    echo "   ✅ 存在"
    grep -q "name: \"BaseCore\"" BaseCore/Package.swift && echo "   ✅ 名称正确" || echo "   ❌ 名称错误"
else
    echo "   ❌ 不存在"
fi

echo ""
echo "2. BaseCommon Package.swift:"
if [ -f "BaseCommon/Package.swift" ]; then
    echo "   ✅ 存在"
    grep -q "BaseCore" BaseCommon/Package.swift && echo "   ✅ 依赖 BaseCore" || echo "   ❌ 未依赖 BaseCore"
else
    echo "   ❌ 不存在"
fi

echo ""
echo "3. CapabilityPush Package.swift:"
if [ -f "CapabilityPush/Package.swift" ]; then
    echo "   ✅ 存在"
    grep -q "BaseCore" CapabilityPush/Package.swift && echo "   ✅ 依赖 BaseCore" || echo "   ❌ 未依赖 BaseCore"
else
    echo "   ❌ 不存在"
fi

echo ""
echo "=== 检查目录结构 ==="
ls -d BaseCore BaseCommon CapabilityPush xdz 2>/dev/null | while read dir; do
    echo "✅ $dir"
done

📚 参考