#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().