#ios #swift #xcode #dependencies #swift-package-manager
#iOS #swift #xcode #зависимости #swift-package-manager
Вопрос:
У меня есть локальный пакет SPM, который содержит 2 библиотеки, и я хочу импортировать одну из этих библиотек в другой локальный пакет SPM: файл, содержащий библиотеки:
let package = Package(
name: "LocationService",
platforms: [.iOS(.v13)],
products: [
.library(
name: "LocationService",
type: .dynamic,
targets: ["LocationService"]),
.library(
name: "LocationLiveClient",
type: .dynamic,
targets: ["LocationLiveClient"]),
],
targets: [
.target(
name: "LocationService",
dependencies: []),
.target(
name: "LocationLiveClient",
dependencies: ["LocationService"],
path: "Sources/LocationLiveClient"),
]
)
Файл, импортирующий библиотеки:
let package = Package(
name: "HomePage",
products: [
.library(
name: "HomePage",
type: .dynamic,
targets: ["HomePage"])
],
dependencies: [
.package(path: "../RouterService"),
.package(path: "../LocationService/Sources/LocationLiveClient"),
],
targets: [
.target(
name: "HomePage",
dependencies: ["RouterService", "LocationLiveClient"])
]
)
Ответ №1:
Здесь необходимо решить несколько проблем.
(Если требованием вашего дизайна является использование «динамической» компоновки, этот подход может вам не подойти.)
type: .dynamic
:
Если вам абсолютно не нужно гарантировать, как достигается связывание библиотек, рекомендуется оставить это значение в качестве значения по умолчанию nil
(просто удалите строку). Это позволяет менеджеру пакетов swift определять, как наилучшим образом связать библиотеки (по умолчанию используется значение «статический»).
.package(path: "../LocationService/Sources/LocationLiveClient"),
LocationLiveClient
является продуктом и целью LocationService
пакета. В зависимостях здесь должна быть сделана ссылка на пакет в целом. Поэтому измените это на .package(path: "../LocationService"),
dependencies: ["RouterService", "LocationLiveClient"])
Как только изменение зависит от всего пакета службы определения местоположения, компилятору требуется немного дополнительной информации. Вы можете обновить свои целевые зависимости, чтобы конкретно использовать LocationLiveClient
библиотеку в LocationService
пакете : .product(name: "LocationLiveClient", package: "LocationService")
.
С учетом этих изменений вы получите определение пакета, подобное этому:
let package = Package(
name: "HomePage",
products: [
.library(
name: "HomePage",
targets: ["HomePage"]),
],
dependencies: [
.package(path: "../RouterService"),
.package(path: "../LocationService"),
],
targets: [
.target(
name: "HomePage",
dependencies: [
"RouterService",
.product(name: "LocationLiveClient", package: "LocationService")
]
),
]
)
Затем вы должны иметь возможность import LocationLiveClient
, как и ожидалось.
Примечание: предполагая, что ваш пакет ‘LocationService’ имеет следующую структуру папок, вы можете безопасно удалить path: "Sources/LocationLiveClient"
его из своего LocationLiveClient
целевого определения.
LocationService
-> Sources
-> LocationService
-> LocationLiveClient
Комментарии:
1. Спасибо 🙂 это сработало, мне не хватало того факта, что я могу добавить весь продукт в качестве зависимости.