J'ai utilisé Cocoapods pour gérer les dépendances pour mon Swift. J'ai rencontré ce package qui n'est pas répertorié sur Cocoapods. Au lieu de cela, il suggère d'utiliser Swift Package Manager. Cependant, chaque fois que j'essaie d'utiliser Swift Package Manager pour faire pratiquement n'importe quoi, cela finit par détruire complètement tout mon projet.
Donc, pour comprendre comment réellement utiliser Swift Package Manager, je joue avec lui dans un projet de test.
Voici ce que j'ai essayé:
Fichier -> Nouveau -> Projet -> Cocoa App
Nom du produit: basic-ssh-test
Cela crée une application de base qui charge une fenêtre vide lorsque je clique sur "Exécuter". Juste pour le plaisir, j'ai ajouté print("test")
à la fonction applicationDidFinishLaunching
dans mon AppDelegate
donc la fenêtre de débogage dit "test" lorsque j'exécute le programme.
Maintenant, je veux ajouter le package Shout
en tant que dépendance.
Swift package init --type executable
Cela crée les fichiers suivants:
Creating executable package: basic-ssh-test
Creating Package.Swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/basic-ssh-test/main.Swift
Creating Tests/
Maintenant, je vais ajouter la dépendance "Shout" à mon nouveau fichier Package.Swift
:
// Swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "basic-ssh-test",
dependencies: [
.package(url: "https://github.com/jakeheis/Shout", from: "0.2.0")
],
targets: [
.target(
name: "basic-ssh-test",
dependencies: ["Shout"]),
]
)
Et je vais tirer dans les dépendances:
Swift package resolve
Il en résulte que les dépendances sont extraites dans le répertoire .build
:
Fetching https://github.com/jakeheis/Shout
Fetching https://github.com/jakeheis/CSSH
Fetching https://github.com/IBM-Swift/BlueSocket
Cloning https://github.com/IBM-Swift/BlueSocket
Resolving https://github.com/IBM-Swift/BlueSocket at 0.12.91
Cloning https://github.com/jakeheis/CSSH
Resolving https://github.com/jakeheis/CSSH at 1.0.3
Cloning https://github.com/jakeheis/Shout
Resolving https://github.com/jakeheis/Shout at 0.3.0
Maintenant, je régénère le fichier xcodeproj
:
Swift package generate-xcodeproj
Maintenant, lorsque j'ouvre le fichier xcodeproj
, il y a un nouveau groupe appelé Sources
qui a un seul répertoire basic-ssh-test
Avec un seul fichier Swift dans il main.Swift
avec print("Hello, world!")
.
Le code que je suis réellement intéressé à exécuter est maintenant dans un dossier bleu appelé basic-ssh-test
. Tous les fichiers nécessaires sont toujours là, mais au lieu d'exécuter mon application, Xcode exécute le fichier main.Swift
. Je peux le dire parce que la sortie de débogage est "Bonjour tout le monde!" au lieu de "test".
J'ai lu quelques tutoriels qui prétendent que Swift Package Manager va déplacer mes fichiers source et continuer à construire les mêmes qu'avant, mais ce n'est clairement pas le cas.
Il n'y a également plus d'option "Interface principale" dans mes paramètres de construction, donc je ne peux pas sélectionner "MainMenu.xib" comme point de départ de mon application.
C'est essentiellement la même chose qui se produit lorsque j'essaie d'utiliser Swift Project Manager avec mon projet existant. Il récupère les dépendances, mais il ignore essentiellement tout mon projet existant et exécute simplement le "bonjour" monde ".
Comment utiliser Swift Gestionnaire de packages pour ajouter une dépendance à un projet existant sans ignorer la base de code existante?
Je pense que SPM n'est compatible qu'avec les exécutables ou bibliothèques de ligne de commande Mac. This indique explicitement que SPM ne prend pas du tout en charge les plateformes iOS, watchOS ou tvOS. Mais, étant donné que les cibles d'application macOS AppKit/Cocoa sont très similaires aux cibles iOS ou tvOS Xcode, je dirais que cette déclaration implique que SPM ne peut pas être utilisé avec les applications macOS Cocoa non plus, ce que je pense que vous êtes Espérer que.
Il semble qu'il y ait certains travaux ici sur la façon de l'utiliser avec des cibles d'application iOS qui devraient se traduire en grande partie par une cible macOS Cocoa.
Vous pouvez créer une application fenêtrée à l'aide de SPM (j'ai tout un projet en attente d'ABI qui le fait), vous avez juste besoin d'une plaque de chaudière dans Swift.main. Je vais le creuser.
Cependant, la méthode suggérée par d'autres ne fonctionnera jamais (avec les versions actuelles de SPM).
Cependant, ce que je vois, c'est que vous voulez vraiment utiliser SPM pour gérer les dépendances (se tenir à jour, etc.). Je pense donc que vous pourriez le faire beaucoup plus facilement.
Plutôt que de créer un exécutable comme cible par défaut, créez plutôt une bibliothèque (peut-être appelez-la basic-ssh-dependencies). Générez votre projet Xcode et faites-le glisser dans votre projet Xcode principal et configurez votre cible pour en dépendre. Lorsque vous mettez à jour la bibliothèque à partir de SPM pour les modifications des dépendances, vous devez régénérer votre Xcode-proj.
Faites-moi savoir votre kilométrage et vos rides, ou si j'ai mal compris ce que vous essayez de réaliser.
Jusqu'au moment de la rédaction de cette réponse, Swift Package Manager ne prend pas en charge iOS, tvOS et watchOS. Au lieu de cela, vous devrez ajouter les fichiers du package directement à votre projet.
Je vous suggère de créer un groupe de dépendances dans votre projet et un groupe en dessous avec le nom du package, comme cette réponse :
Ainsi, vous allez d'abord ajouter la dépendance de fichiers que vous souhaitez importer dans votre projet au nom du nom de package inclus dans le groupe de dépendances que nous avons créé auparavant.
Après avoir ajouté les fichiers, vous pouvez accéder au code comme vous le feriez habituellement lorsque vous l'écrivez vous-même comme l'image ci-dessous. Pas besoin d'importations. Vous pouvez voir plus de détails dans ici . J'espère que ça aide.