#swift #xcode #swift-package-manager
#swift #xcode #swift-package-manager
Вопрос:
Я пытаюсь запустить целевой объект тестирования пакета Swift в Xcode в режиме выпуска без создания проекта Xcode.
Однако, когда я устанавливаю конфигурацию сборки схемы тестирования на release, сборка завершается неудачно из-за отсутствия -enable-testing
флага, который должен быть передан компилятору при @testable import
использовании.
Как я могу добавить этот флаг в Xcode для пакета Swift? Обратите внимание, что традиционные параметры конфигурации сборки недоступны, поскольку проект Xcode не существует. Добавление -Xswiftc -enable-testing
в качестве аргументов запуска для схемы тестирования не работает.
Комментарии:
1. какие версии xcode и swift вы используете?
2. Xcode 12.0 (но у меня также была эта проблема с версиями 11.x)
3. Я могу скомпилировать для выпуска. Пожалуйста, поделитесь ошибкой, которая у вас есть?
4. Проблема не в компиляции для выпуска. Но запуск тестов пакетов в режиме выпуска не работает, потому что, если вы используете
@testable
импорт,MyLibrary was not compiled for testing
выдается ошибка.5. @Palle вы хотите запускать тесты с терминала или внутри Xcode?
Ответ №1:
Вы можете передавать флаги компилятора swift, используя swiftSettings
параметр target(name:dependencies:path:exclude:sources:publicHeadersPath:cSettings:cxxSettings:swiftSettings:linkerSettings: ) функция в вашем файле манифеста SPM:
import PackageDescription
let package = Package(
name: "MyPackage",
targets: [
.target(name: "MyPackage", swiftSettings: [.unsafeFlags(["-enable-testing"])]),
.testTarget(name: "MyPackageTests", dependencies: ["MyPackage"]),
]
)
Если, с другой стороны, вы хотите запускать свои тесты с терминала, вы можете использовать -Xswiftc
опцию, как обычно:
swift test -c release -Xswiftc -enable-testing
Комментарии:
1. Отлично! Теперь было бы неплохо, если
-enable-testing
бы это было предусмотрено только при запуске тестов.2. К сожалению, я больше не могу устанавливать пакет как зависимость в проекте iOS, потому что там запрещены небезопасные лаги.
3. @Palle это прискорбно. Боюсь, вам придется придерживаться второй части моего ответа: используйте терминал для запуска тестов в выпуске. По крайней мере, на данный момент.
4. Да, я уже делал это раньше, но мне было любопытно, доступно ли это и в Xcode.
Ответ №2:
Вы можете скомпилировать свои тесты для выпуска, удалив @testable
атрибут import
инструкции:
// MyPackageTests.swift
import XCTest
import MyPackage
...
Это частичное решение, потому что ваши тесты не имеют доступа к внутренним объектам в вашем модуле, но оно отлично работает для общедоступных.
Комментарии:
1. Это не вариант для меня, так как я хочу протестировать материал с внутренней видимостью.