Импорт локальной библиотеки SPM в локальный пакет SPM

#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. Спасибо 🙂 это сработало, мне не хватало того факта, что я могу добавить весь продукт в качестве зависимости.