web-dev-qa-db-ja.com

既存のmacOSプロジェクトでSwift Package Managerを使用するにはどうすればよいですか?

Cocoapodsを使用して、Swiftプロジェクトの依存関係を管理しています。 このパッケージ に遭遇しましたが、Cocoapodsにはリストされていません。代わりに、Swift Package Managerを使用することをお勧めします。ただし、Swift Package Managerを使用して基本的に何かをしようとすると、プロジェクト全体が完全に破壊されてしまいます。

したがって、Swift Package Managerを実際に使用する方法を理解するために、テストプロジェクトでそれを使用しています。

私が試したものは次のとおりです。

  1. Xcodeから新しいプロジェクトを作成する

ファイル->新規->プロジェクト-> Cocoa App

製品名:basic-ssh-test

これにより、「実行」を押すと空白のウィンドウをロードする基本的なアプリケーションが作成されます。楽しみのために、applicationDidFinishLaunchingAppDelegate関数にprint("test")を追加したので、プログラムを実行するとデバッグウィンドウに「テスト」と表示されます。

ここで、Shoutパッケージを依存関係として追加します。

  1. _Swift package init --type executable_

これにより、次のファイルが作成されます。

_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/
_

次に、新しい_Package.Swift_ファイルに「Shout」依存関係を追加します。

_// 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"]),
    ]
)
_

そして、依存関係を取得します。

  1. _Swift package resolve_

これにより、依存関係が_.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
_

次に、xcodeprojファイルを再生成します。

  1. _Swift package generate-xcodeproj_

xcodeprojファイルを開くと、単一のSwiftファイルを含む単一のディレクトリ_basic-ssh-test_を持つSourcesという新しいグループがあります_main.Swift_ print("Hello, world!")で。

実際に実行したいコードは、_basic-ssh-test_という青いフォルダーにあります。必要なファイルはすべてそこにありますが、アプリケーションを実行する代わりに、Xcodeは_main.Swift_ファイルを実行しています。デバッグ出力が「Hello、world!」だからわかる「テスト」の代わりに。

Swift Package Managerがソースファイルを移動し、以前と同じビルドを続行すると主張するいくつかのチュートリアルを読みましたが、明らかにそうではありません。

また、ビルド設定に「メインインターフェイス」オプションがないため、アプリケーションの開始点として「MainMenu.xib」を選択できません。

これは、既存のプロジェクトでSwift Project Managerを使用しようとしたときに発生するものと本質的に同じです。依存関係を取り込みますが、基本的には既存のプロジェクト全体を無視し、「hello world」コードを実行するだけです。

Swift Package Managerを使用して、既存のコードベースを無視せずに既存のプロジェクトに依存関係を追加するにはどうすればよいですか?

29
Ben Harold

SPMはMacのコマンドライン実行可能ファイルまたはライブラリとのみ互換性があると思います。 This は、SPMがiOS、watchOS、またはtvOSプラットフォームをまったくサポートしないことを明示的に示しています。しかし、macOS AppKit/CocoaアプリケーションターゲットはiOSまたはtvOS Xcodeターゲットに非常に似ているため、このステートメントは、SPMをそのままmacOS Cocoaアプリケーションで使用できないことを意味すると思います。を期待しています。

一部の作業 iOSアプリケーションターゲットで使用する方法についてのようです。

8
allenh

Swift.mainにボイラープレートが必要なだけで、SPMを使用してウィンドウアプリケーションを作成できます(これを行うABIを待機しているプロジェクト全体があります)。掘り出します。

ただし、他の人が提案している方法は(SPMの現在のバージョンでは)動作しません。

ただし、私が見ているのは、本当にSPMを使用して依存関係を管理する(最新の状態に保つなど)ことです。だからもっと簡単にできると思う。

デフォルトのターゲットとして実行可能ファイルを作成するのではなく、代わりにライブラリを作成します(おそらく、basic-ssh-dependenciesと呼びます)。 Xcodeプロジェクトを生成し、それをプライマリXcodeプロジェクトにドラッグし、それに依存するようにターゲットを構成します。依存関係の変更のためにSPMからライブラリを更新する場合、Xcode-projを再生成する必要があります。

あなたの走行距離としわ、またはあなたが達成しようとしていることを誤解した場合はお知らせください。

3
rougeExciter

この回答を書いている時点まで、 Swift Package Manager はiOS、tvOS、およびwatchOSをサ​​ポートしていません。代わりに、パッケージのファイルをプロジェクトに直接追加する必要があります。

プロジェクトに依存関係グループを作成し、その下に this answer のようなパッケージ名を持つグループを作成することをお勧めします。

したがって、まず、プロジェクトにインポートするファイルの依存関係を、以前に作成したDependenciesグループに含まれるパッケージ名に追加します。

ファイルを追加すると、次の画像のように自分でコードを作成するときと同じように、コードにアクセスできます。インポートする必要はありません。詳細は here で確認できます。それが役に立てば幸い。

enter image description here

3
shafrianadhi