Библиотека SwiftPM не включена - PullRequest
0 голосов
/ 01 января 2019

В настоящее время я пытаюсь создать Swift Wrapper для библиотеки C.Для этого я использую менеджер пакетов Swift.

Мой план состоял в том, чтобы сначала создать system-module, который обернет нужную C-библиотеку.После этого эта библиотека будет включена в другой пакет Swift типа Library.Чтобы проверить все, я хотел сделать еще один пакет Swift типа executable

Проблема заключается в последней части.Исполняемый файл не находит ссылки на Library.

Чтобы объяснить все лучше, вот мой рабочий процесс:

1) Создайте новый пакет swift с:swift package init --type system-module.Вот окончательный файл Package.swift:

// swift-tools-version:4.2

import PackageDescription

let package = Package(
    name: "Clibmongoc",
    pkgConfig: "libmongoc-1.0",
    providers: [
        .brew(["mongo-c-driver"])
    ],
    products: [
        .library(name: "Clibmongoc", targets: ["Clibmongoc"])
    ]
)

И .modulemap:

module Clibmongoc [system] {
    header "/usr/local/include/libmongoc-1.0/mongoc.h"
    link "Clibmongoc"
    export *
}

2) Теперь мне нужно было создать Library:

Сначала я инициализировал его с помощью: swift package init --type Library.В результате был получен Package.swift:

// swift-tools-version:4.2

import PackageDescription

let package = Package(
    name: "SwiftLibMongoC",
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "SwiftLibMongoC",
            targets: ["SwiftLibMongoC"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "../Clibmongoc", from: "1.0.2")
    ],
    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 which this package depends on.
        .target(
            name: "SwiftLibMongoC",
            dependencies: ["Clibmongoc"]),
        .testTarget(
            name: "SwiftLibMongoCTests",
            dependencies: ["SwiftLibMongoC"]),
    ]
)

Поэтому я просто скопировал ранее созданный пакет в новую библиотеку.Я также убедился, что тег git system-module установлен на 1.0.2.Я также удостоверился, чтобы включить зависимость в цель.Как и ожидалось, при создании .xcodeproj у меня был доступ к Clibmongoc system-module.

Теперь мы подошли к проблеме.

3) Я создалтестовый модуль с swift package init --type executable и я включил только что созданный Library в манифест:

// swift-tools-version:4.2

import PackageDescription

let package = Package(
    name: "SwiftLibMongoCTest",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "../SwiftLibMongoC", from: "0.0.2")
    ],
    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 which this package depends on.
        .target(
            name: "SwiftLibMongoCTest",
            dependencies: ["SwiftLibMongoC"]),
        .testTarget(
            name: "SwiftLibMongoCTestTests",
            dependencies: ["SwiftLibMongoCTest"]),
    ]
)

Опять я убедился, что версия из тега git правильно установлена ​​на 0.0.2, а также зависимость SwiftLibMongoC был установлен в зависимости в цели.

При попытке построить исполняемый файл он работает, однако, когда создается .xcodeproj, я могу импортировать system-module Clibmongoc, но я делаюне получить auto completion для нового Library SwiftLibMongoC.Но если я импортирую и создаю его, я не получаю ошибок, однако, если я пытаюсь получить доступ к сгенерированному по умолчанию коду из Library в новом executable, я получаю ошибку:

useнеразрешенного идентификатора

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 01 января 2019

Это была довольно глупая ошибка.Уровень доступа по умолчанию для swift - внутренний, то есть вы не можете видеть код снаружи модуля.Я никогда не смотрел на предварительно сгенерированный код и поэтому не думал, что мне придется изменить структуру по умолчанию на public.

Я надеюсь, что в будущем это будет решено лучше в документации.

...