Совместное использование кода для целей тестирования при использовании диспетчера пакетов Swift

#swift #xcode #swift-package-manager

#swift #xcode #swift-package-manager

Вопрос:

У меня есть некоторый код, который мне нужно совместно использовать для целей тестирования, пока я использую диспетчер пакетов Swift. Для этого у меня есть .testTarget, который я также называю зависимостью в другом .testTarget.

Вот простой пример:

 // 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: "ExampleLib",
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "ExampleLib",
            targets: ["ExampleLib"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    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 this package depends on.
        .target(
            name: "ExampleLib",
            dependencies: []),
        .testTarget(
            name: "Common",
            dependencies: ["ExampleLib"]),
        .testTarget(
            name: "ExampleLibTests",
            dependencies: ["Common"]),
            
    ]
)
  

Если я попытаюсь собрать этот пакет в Xcode, я получаю следующую ошибку:

 Unable to resolve build file: XCBCore.BuildFile (The workspace has a reference to a missing target with GUID 'PACKAGE-TARGET:Common')
  

Однако, если я создаю из командной строки ( swift build ) или тестирую из командной строки ( swift test ), я получаю успех.

Я использую Xcode 12 beta 6, но также пробовал Xcode 11.5 (с изменением заголовка Package.swift) и получаю те же результаты.

Вот полный пример пакета Swift:https://www.dropbox.com/s/h6ypvbfonnb2zyk/ExampleLib.zip?dl=0

Я действительно хотел бы использовать это в Xcode для сборки для iOS. Мысли?

Ответ №1:

Я столкнулся с той же проблемой и решил ее, определив цель (не тестовую цель) вместо Common .

Мой Package.swift файл:

 // ...
.target(name: "Common", dependencies: ["App"], path: "Tests/Common"),
.testTarget(name: "AppTests", dependencies: ["App", "Common"]),
.testTarget(name: "IntegrationTests", dependencies: ["App", "Common"])
// ...
  

Комментарии:

1. Потрясающе! Спасибо! Это работает! Я предполагаю, что это не так, как предполагалось, и это обходной путь?

2. Хорошее решение 50

3. Это хорошее решение, если только вам действительно не нужно использовать импорт @testsble для повышения уровней доступа, который доступен только внутри .testTarget().