尝试根据第三方框架构建基于 Swift 的命令行工具时构建错误:此目标可能包含其自己的产品

Build error while trying to build a Swift-based command line tool depending on a third-party framework: this target might include its own product

上下文: 我想使用 CryptoSwift 创建一个简单的 Swift 命令行工具 我对 Xcode 和 Swift(以及 MacOS!)比较陌生。

配置:
- MacOS High Sierra 10.13.2
- Xcode:9.2

步骤:

  1. 我开始Xcode
  2. 为 MacOS 创建一个新项目“命令行工具”
  3. 我的项目选项:
    • 产品名称:cryptodemo
    • 组织标识符:com.demo
    • 语言Swift
  4. 我把项目创建成~/Documents
  5. 填写我的main.swift:

    import Foundation
    import CryptoSwift
    
    print("Hello, World!")
    
    let bytes:Array<UInt8> = [0x01, 0x02, 0x03]
    let digest = Digest.md5(bytes)
    
  6. 打开shell进入~/Documents/cryptodemo

  7. 将 CryptoSwift 添加为由 project’s README 定义的子模块,使用:git submodule add https://github.com/krzyzanowskim/CryptoSwift.git
  8. 打开 Finder 并将 CryptoSwift.xcodeproj 文件拖到我的 Xcode 项目中
  9. 在Xcode,我进入我的项目Build Phase

    • 我添加了 CryptoSwift 作为目标依赖项
    • 我将 CryptoSwift.framework 添加到 Link Binaries with Libraries
    • 我将 CryptoSwift.framework 添加到 Copy Files 中:
      • 目的地:Framework
      • 子路径:(空)
  10. 那我建一个。我有这个错误:

    Check dependencies
    
    Unable to run command 'PBXCp CryptoSwift.framework' - this target might include its own product.
    Unable to run command 'CodeSign A' - this target might include its own product.
    

这里是项目的存档cryptodemo.zip

删除第 9 步并将 CryptoSwift.framework 添加到“Linked Frameworks and Libraries

喜欢这里:

我设法使用第三方 Swift 库构建命令行工具的唯一方法是使用 Swift Package Manager (SPM).

使用 SPM 的 Swift 项目示例(可以使用 swift package init --type executable 生成):

// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: “mytool”,
    dependencies: [
        .package(url: "https://github.com/myfreeweb/SwiftCBOR.git", .branch("master")),
    ],
    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: “mytool”,
            dependencies: [ "SwiftCBOR" ]),
    ]
)

一个 Xcode 项目可以从这个 SPM 使用:swift package generate-xcodeproj