Help us understand the problem. What is going on with this article?

Swift Package Manager (SwiftPM) Version 4 概要

More than 1 year has passed since last update.

この記事は、Swift Package Manager (以下 SwiftPM) の Version 3 から 4 への変更内容をまとめたものです。

有効に活用するためにはさらに掘り下げていきたいところですが、この記事では概要にとどめています。なお SwiftPM の基本的な使い方はすでに 参考になるスライド、記事、ツール がありますのでそちらを参考にしてください。

はじめに

SwiftPM は Swift 3 で登場しました。まだ発展途上で CocoaPods や Carthage に変わる存在とまではいかないものの、すでに Swift 製のコマンドラインツールやサーバーサイド Swift で活用されています。

さて今回の WWDC17 ではどのような発表があったのか、ビデオとスライドで確認しました。ただこれまで見た限り Session 402「What’s New in Swift」 で少し触れられているだけで詳しくは語られていないようです。

そこで Swift Evolution を確認しました。

Swift Evolution

https://apple.github.io/swift-evolution/

検索欄に「Package Manager」と入力して SwiftPM 関連を抽出しました。

SwiftEvolution.png

14 件のプロポーザルが抽出されますが Swift 4 で実装されたものは次の 6 件です。

Swift 4 で実装されたもの

このほか、すでに実装されていましたが Swift 4 に関わるものとして次のプロポーザルがあります。

Swift 3.1 で実装されたもの

それぞれの概要

SE-0151 Package Manager Swift Language Compatibility Version

  • 後方互換性維持のため Swift 3.1 で実装されました。

Example

let package = Package(
    name: "Pancake",
    ...
    swiftLanguageVersions: [3, 4])

事例

SwiftPM Version 3
  • swiftLanguageVersions: [3]
    • Swift 3 でコンパイルされます。
  • swiftLanguageVersions: [4]
    • SwiftPM Version 3 が Swift 4 をサポートしていないためエラーになります。
  • swiftLanguageVersions: [3, 4]
    • Swift 3 でコンパイルされます。
SwiftPM Version 4
  • swiftLanguageVersions: [3]
    • Swift 3 でコンパイルされます。
  • swiftLanguageVersions: [4]
    • Swift 4 でコンパイルされます。
  • swiftLanguageVersions: [3, 4]
    • Swift 4 でコンパイルされます。

SE-0152 Package Manager Tools Version

  • 後方互換性維持のため Swift 3.1 で実装されました。

SwiftPM Version 4 を使用している場合

Package のツールバージョンを確認

$ swift package tools-version

4.0.0

Version 3 に設定

$ swift package tools-version --set 3.0.0
$ swift package tools-version

3.0.0

使用中のツールバージョンに設定

$ swift package tools-version --set-current
$ swift package tools-version

4.0.0

SE-0146 Package Manager Product Definitions

  • Product が導入されました。
    • Package 内で任意の Target を限定して公開できるようになりました。(従来は Package を分割する必要がありました)
  • マニフェスト(Package.swift)が Version 3 の場合は既存コードへの影響はありません。

SE-0149 Package Manager Support for Top of Tree development

  • $ swift package edit コマンドに --path オプションが追加されました。
  • 既存コードへの影響はありません。

SE-0150 Package Manager Support for branches

  • 依存する Package のブランチやリビジョンを指定できるようになりました。(従来は Version(タグ)を指定する必要がありました)
  • 既存コードへの影響はありません。

Example

import PackageDescription

let package = Package(
    name: "Pancake",
    dependencies: [
        .Package(url: "../PancakeCore", branch: "matcha"),
    ]
)

Example

import PackageDescription

let package = Package(
    name: "Pancake",
    dependencies: [
        .Package(url: "../PancakeCore", revision: "0123456789012345678901234567890123456789"),
    ]
)

リビジョンは 40 文字のコミットハッシュを指定します。

SE-0158 Package Manager Manifest API Redesign

  • マニフェストの既存 API が再設計されました。
    • Version の指定方法などが変更されました。
  • 新機能追加は別のプロポーザルで行われています。

SE-0162 Package Manager Custom Target Layouts

  • マニフェストで Target を明示的に宣言するようになりました。(省略不可)
  • SourcesTests のパスを任意に指定できるようになりました。(従来は規定がありました)
  • Target クラスに 3 つのプロパティが追加されました。
    • path: Package のルートディレクトリを基準にソースファイルのパスを指定します。
    • sources: Target に含めるソースを指定します。デフォルトは nil ですべてのファイルが対象になります。
    • exclude: ソースから除外するディレクトリやファイルを指定します。sources の設定より優先されます。(従来は Package クラスで設定していましたがこちらは削除されました)
  • マニフェストが Version 3 の場合は既存コードへの影響はありません。

Example

.target(name: "Pancake", path: "Sources/Pancake", exclude: ["Tests"]),
.testTarget(name: "PancakeTests", dependencies: ["Pancake"], path: "Sources/Pancake/Tests"),

Version 4 への移行

前述のとおり Package のマニフェストが Version 3 の場合は既存コードへの影響はありませんが、Version 4 へ移行する場合はマニフェストを更新する必要があります。

Package.swift
Sources/
Tests/
import PackageDescription

let package = Package(
    name: "Pancake",
    targets: [
        .target(name: "Pancake", path: "Sources"),
        .testTarget(name: "PancakeTests", dependencies: ["Pancake"], path: "Tests"),
    ]
)

SE-0175 Package Manager Revised Dependency Resolution

  • 依存関係解決処理の改善が図られました。
    • $ swift package pin/unpin コマンドが廃止されました。
    • $ swift package fetch コマンドが $ swift package resolve コマンドに置き換えられました。
    • Package.pins ファイルが Package.resolved ファイルに置き換えられました。

参考

以上、詳しくは今後別の記事で紹介します。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away