Совместимость исходного кода Swift
Совместимость исходного кода является важной целью будущих релизов Swift. Для достижения этой цели сообщество поддерживает набор тестов совместимости исходного кода, который используется для проверки регрессий изменений в компиляторе на основе (постепенно расширяющегося) набора Swift исходного кода. Проекты, добавленные в этот набор тестов, периодически компилируются с использованием последних версий разработки Swift в рамках системы непрерывной интеграции Swift, позволяя разработчикам Swift компилятора понимать влияние своих изменений на реальные Swift проекты.
Текущий список проектов
- ACHNBrowserUI
- AMScrollingNavbar
- Alamofire
- AsyncNinja
- BeaconKit
- BlueSocket
- Bow
- CareKit
- Chatto
- CleanroomLogger
- CoreStore
- cub
- DNS
- Deferred
- Doggie
- Dollar
- Dwifft
- Eureka
- Evergreen
- exercism-swift
- fluent
- GRDB.swift
- grpc-swift
- Guitar
- Html
- IBAnimatable
- JSQCoreDataKit
- JSQDataSourcesKit
- KeychainAccess
- Kickstarter-Prelude
- Kickstarter-ReactiveExtensions
- Kingfisher
- Kitura
- Kronos
- Lark
- line-sdk-ios-swift
- ModelAssistant
- Moya
- NetService
- NonEmpty
- MovieSwift
- NSAttributedStringBuilder
- ObjectMapper
- Overture
- Perfect
- PinkyPromise
- Plank
- ProcedureKit
- PromiseKit
- R.swift
- Re-Lax
- ReSwift
- ReactiveCocoa
- ReactiveKit
- ReactiveSwift
- Result
- RxDataSources
- RxReactiveObjC
- RxSwift
- SRP
- Serpent
- Sourcery
- Starscream
- Surge
- swift-algorithms
- swift-argument-parser
- swift-atomics
- swift-standard-library-preview
- SwiftDate
- SwiftFormat
- SwiftGraph
- SwiftLint-Legacy
- SwiftLint
- SwifterSwift
- swift-futures
- swift-nio
- swift-log
- async-http-client
- swift-nio-http2
- swift-metrics
- swift-nio-extras
- swift-nio-ssl
- swift-nio-ssh
- swift-nio-transport-services
- swift-crypto
- swift-numerics
- swift-protobuf-plugin-example
- swift-system
- swift-distributed-tracing
- swift-cluster-membership
- SwiftyJSON
- SwiftyStoreKit
- Tagged
- Then
- Kommander
- launchscreensnapshot
- mapper
- siesta-legacy
- siesta
- vapor_console
- vapor_core
- vapor_database-kit
- vapor_multipart
- vapor_routing
- vapor_service
- vapor_template-kit
- vapor_url-encoded-form
- vapor_validation
- Base64CoderSwiftUI
- Nimble
- swift-collections
- swift-collections-benchmark
- mqtt-nio
Добавление проектов
Набор тестов совместимости исходного кода Swift создается сообществом, что означает, что владельцы открытых проектов Swift могут отправлять свои проекты, которые соответствуют критериям приемлемости для включения в набор тестов. Проекты, добавленные в набор, служат общими тестами совместимости исходного кода и обеспечивают большую защиту от непреднамеренных разрывов совместимости в будущих выпусках Swift.
Критерии приемлемости
Для включения в набор тестов совместимости исходного кода Swift проект должен:
- Поддерживать Linux, macOS или устройства iOS/tvOS/watchOS
- Быть проектом Xcode или Swift Package Manager (Carthage и CocoaPods в настоящее время не поддерживаются, но их поддержка рассматривается в будущем)
- Поддерживать сборку как на Linux, так и на macOS
- Располагаться в общедоступном репозитории Git
- Поддерживать ветку проекта, которая собирается с использованием текущего режима совместимости Swift GM и проходит все тесты
- Иметь ответственных за поддержку, которые обязуются решать проблемы в разумные сроки
- Быть совместимым с последними версиями GM/Beta Xcode и swiftpm
- Добавлять ценности, которые еще не включены в набор
- Использовать одну из следующих разрешительных лицензий:
- BSD
- MIT
- Apache License, версия 2.0
- Eclipse Public License
- Mozilla Public License (MPL) 1.1
- MPL 2.0
- CDDL
Примечание: тестирование совместимости с Linux в непрерывной интеграции пока недоступно, но проекты Linux принимаются.
Добавление проекта
Чтобы добавить проект, соответствующий критериям принятия, выполните следующие шаги:
- Убедитесь, что проект успешно собирается по выбранному коммиту против текущей версии Swift GM.
- Создайте запрос на вытягивание против репозитория набора инструментов совместимости исходного кода, изменив файл projects.json, чтобы включить ссылку на проект, добавляемый в набор тестов.
Индекс проектов — это JSON-файл, содержащий список репозиториев, содержащих действия для Xcode и/или Swift Package Manager.
Для добавления нового проекта Swift Package Manager используйте следующий шаблон:
{"repository":"Git","url":"https://github.com/example/project.git","path":"project","branch":"main","maintainer":"email@example.com","compatibility":{"3.0":{"commit":"195cd8cde2bb717242b3081f9c367ccd0a2f0121"}},"platforms":["Darwin"],"actions":[{"action":"BuildSwiftPackage","configuration":"release"},{"action":"TestSwiftPackage"}]}Поле commit указывает хеш коммита для привязки репозитория. Оно содержится внутри поля compatibility, которое указывает версию Swift, с которой известен коммит. Можно указать несколько коммитов, совместимых с разными версиями Swift.
Поле platforms указывает платформы, которые могут быть использованы для сборки проекта. В настоящее время можно указать Linux и Darwin.
Если тесты не поддерживаются, удалите запись действия теста.
Для добавления нового проекта Swift Xcode workspace используйте следующий шаблон:
{"repository":"Git","url":"https://github.com/example/project.git","path":"project","branch":"main","maintainer":"email@example.com","compatibility":{"3.0":{"commit":"195cd8cde2bb717242b3081f9c367ccd0a2f0121"}},"platforms":["Darwin"],"actions":[{"action":"BuildXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project OSX","destination":"platform=macOS","configuration":"Release"},{"action":"BuildXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project iOS","destination":"generic/platform=iOS","configuration":"Release"},{"action":"BuildXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project tvOS","destination":"generic/platform=tvOS","configuration":"Release"},{"action":"BuildXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project watchOS","destination":"generic/platform=watchOS","configuration":"Release"},{"action":"TestXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project OSX","destination":"platform=macOS"},{"action":"TestXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project iOS","destination":"platform=iOS Simulator,name=iPhone 7"},{"action":"TestXcodeWorkspaceScheme","workspace":"project.xcworkspace","scheme":"project tvOS","destination":"platform=tvOS Simulator,name=Apple TV 1080p"}]}Для добавления нового проекта Swift Xcode используйте следующий шаблон:
{"repository":"Git","url":"https://github.com/example/project.git","path":"project","branch":"main","maintainer":"email@example.com","compatibility":{"3.0":{"commit":"195cd8cde2bb717242b3081f9c367ccd0a2f0121"}},"platforms":["Darwin"],"actions":[{"action":"BuildXcodeProjectTarget","project":"project.xcodeproj","target":"project","destination":"generic/platform=iOS","configuration":"Release"}]}После добавления нового проекта в индекс убедитесь, что он успешно собирается по привязанным коммитам против указанных версий Swift. В примерах коммиты указаны как совместимые со Swift 3.0, который включён в Xcode 8.0.
# Select Xcode 8.0 GM
sudo xcode-select -s /Applications/Xcode.app
# Build project at pinned commit against selected Xcode
./check project-path-field
В Linux вы можете собрать проект с помощью инструментальной цепочки Swift 3.0:
curl -O https://download.swift.org/swift-3.0-release/ubuntu1510/swift-3.0-RELEASE/swift-3.0-RELEASE-ubuntu15.10.tar.gz
tar xzvf swift-3.0-RELEASE-ubuntu15.10.tar.gz
./check project-path-field --swiftc swift-3.0-RELEASE-ubuntu15.10/usr/bin/swiftc
Поддержка проектов
В случае, если Swift вводит изменения, которые нарушают исходную совместимость с проектом (например, исправление ошибки компилятора, устраняющей неправильное поведение компилятора), ожидается, что авторы проекта обновят свои проекты и отправят новый запрос на вытягивание с обновлённым хешем коммита в течение двух недель с момента уведомления. В противном случае не обновляемые проекты могут быть удалены из индекса проектов.
Тестирование запросов на вытягивание
Тестирование запросов на вытягивание против набора инструментов совместимости исходного кода Swift можно выполнить, добавив комментарий @swift-ci Please test source compatibility в запросе на вытягивание Swift.
Сборка проектов
Для сборки всех проектов против указанного компилятора Swift локально используйте утилиту runner.py, как показано ниже.
./runner.py --swift-branch main --projects projects.json --swift-version 3 --include-actions 'action.startswith("Build")' --swiftc path/to/swiftc
Используйте флаг --include-repos для сборки конкретного проекта.
./runner.py --swift-branch main --projects projects.json --swift-version 3 --include-actions 'action.startswith("Build")' --include-repos 'path == "Alamofire"' --swiftc path/to/swiftc
По умолчанию, выходные данные сборки перенаправляются в файлы .log по действию в текущей рабочей директории. Чтобы изменить это поведение и вывести результаты сборки в стандартный вывод, используйте флаг --verbose.
The Swift Programming Language, Copyright © 2014-2025 Apple Inc.
Swift and the Swift logo are trademarks of Apple Inc.
Documentation for Swift 6.0.3
https://www.swift.org/documentation/source-compatibility/