Xcode дает Не удается найти тип «TYPE» в ошибках области действия с пакетом Swift

Я занимаюсь разработкой на стороне сервера уже несколько лет, используя Swift на стороне сервера, используя Xcode в качестве удобного инструмента редактирования. А теперь, когда в Xcode появилась поддержка пакетов Swift, ситуация в целом улучшилась. Я не нацелен на какое-либо традиционное оборудование Apple, так что это может быть источником моей проблемы, но, поскольку эта проблема начала возникать только недавно, я сообщаю об этом на случай, если другие тоже столкнутся с ней.

С одним из моих пакетов: http://github.com/SyncServerII/ServerDropboxAccount.git I больше не может создавать его с помощью Xcode.

Моим намерением в этом является в первую очередь редактирование и удаление синтаксических ошибок, то есть я использую Xcode в качестве редактора. В некоторых случаях с этими серверными пакетами я могу запускать модульные тесты в Xcode. В некоторых случаях мне приходится запускать тесты на моей целевой платформе Ubuntu.

Буквально за последние несколько дней я больше не могу собрать этот конкретный пакет ни в Xcode, ни в командной строке в Mac OS.

Я получаю такие ошибки:

/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:140:37: Cannot find type 'APICallResult' in scope
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds.swift:16:29: Cannot find type 'AccountAPICall' in scope
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds.swift:16:45: Cannot find type 'Account' in scope
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:49:14: Value of type 'DropboxCreds' has no member 'apiCall'
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:49:111: Cannot infer contextual base in reference to member 'string'
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:49:147: Cannot infer contextual base in reference to member 'json'
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:106:14: Value of type 'DropboxCreds' has no member 'apiCall'
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:106:133: Cannot infer contextual base in reference to member 'data'
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:106:167: Cannot infer contextual base in reference to member 'json'
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:106:190: Unable to infer type of a closure parameter 'apiResult' in the current context
/Users/chris/Desktop/NewSyncServer/ServerDropboxAccount/Sources/ServerDropboxAccount/DropboxCreds+CloudStorage.swift:106:201: Unable to infer type of a closure parameter 'statusCode' in the current context

Я получаю те же ошибки, когда использую swift build в командной строке в Mac OS. Однако, когда я использую swift build в Ubuntu, я не получаю ошибок — пакет собирается чисто.

В Mac OS:

MacBook-Pro-4:ServerDropboxAccount chris$ swift --version
Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28)
Target: x86_64-apple-darwin19.6.0

На Убунту:

root@7b763a0a0a3f:~/Apps/ServerDropboxAccount# swift --version
Swift version 5.3.1 (swift-5.3.1-RELEASE)
Target: x86_64-unknown-linux-gnu

Это может быть второстепенным вариантом использования, но прежде чем я полностью отойду от использования Xcode для этого, я хотел бы понять, почему это происходит. Мысли ценятся. Спасибо!

Я включаю в этот вопрос тег для Kitura, потому что мой сервер основан на Kitura. И потому, что Китура в последнее время претерпевает некоторые изменения, переходя от IBM к поддержке сообщества.


person Chris Prince    schedule 25.12.2020    source источник


Ответы (1)


Ну, я чувствую себя довольно глупо сейчас. У меня было условие в одном из файлов в зависимой библиотеке, которое исключало некоторый код.

#if os(Linux) || SERVER

// Code

#endif

Я оставлю этот вопрос, чтобы показать исправление. Мне нужно было добавить определение для SERVER в Package.swift для этой зависимой библиотеки:

        .target(
            name: "ServerAccount",
            dependencies: [
                "ServerShared",
                // For new condition feature, see https://forums.swift.org/t/package-manager-conditional-target-dependencies/31306/26
                .product(name: "Kitura", package: "Kitura", condition: .when(platforms: [.linux, .macOS])),
                .product(name: "HeliumLogger", package: "HeliumLogger", condition: .when(platforms: [.linux, .macOS])),
                .product(name: "Credentials", package: "Kitura-Credentials", condition: .when(platforms: [.linux, .macOS])),
            ],
            swiftSettings: [
                // So I can do basic development and editing with this on Mac OS. Otherwise if some dependent library uses this it will not get Account related code. See Account.swift.
                .define("SERVER", .when(platforms: [.macOS], configuration: .debug)),
            ]),

Упс. :).

person Chris Prince    schedule 26.12.2020