anz blog

SwiftlineをSwiftPackageManager 4.0対応した話

2019-04-27 #Swift #SwiftPM

ざっくりまとめ。

  • SwiftlineをSwiftPM v4系で使いたい
  • 本家は放置されているっぽいので、Forkして対応する
    • SwiftPM v4を使うということを明示
    • さらにPackage.swiftにlibrary名などを追加で記述設定

です。

環境

  • Swift Package Manager v5.0.0

なのだけれど、自分の Package.swift で指定しているのは v4.2 です

やりたいこと

こちらのSwiftlineを現環境でビルドできるようにしたい。

過去にコマンドライン上であつかえる Twitter クライアントを作ってたのですけど、
それが Xcode v10系 にして以降ビルド出来ない状態だったのだけれど、
ビルドエラーのひとつがSwfitlineにあって、
SwiftPMのバージョンが古すぎて無理っていうエラーでした。
(SwiftPM v4.0 以降をサポートしている Switline は v3.0 で設定されているから駄目だ!みたいな)

解決へ

リポジトリの最終コミット2年前なのでここからアップデートされる可能性は極めて低いだろうということで、
Fork して自分で修正することにしました。

Package.swift に とりあえず SwiftPM v4.0 を使うように指定をして
(5.0.0にすると他の関係もあってちょっと断念)
ビルドが通るようにいくつか修正して、コミットしてプッシュして
あとはこの Fork したものを指定するようにこちらの Package.swift を修正

したら行けるとおもったのですが、
Fork したものを指定してビルドすると

error: product dependency 'Swiftline' not found
warning: dependency 'Swiftline' is not used by any target

というエラーとワーニングがでてビルドできませんでした。

Swiftline が見つからないとか言っておいて、Swiftline はどこでも使用されてないみたいだけれど問題ないか?
っていうなんともちぐはぐなメッセージでなんだろう?っていう感じですね。

ちなみに指定している Package.swift はこういう感じ

dependencies: [
    .package(url: "https://github.com/anzfactory/Swiftline.git", .branch("master"))
],
targets: [
    .target(
        name: "Project name",
        dependencies: [
            "Swiftline"
        ]
    )
]

ワーニングの方は、.targetdependencies でしていていない時に言われることがありますが、
ちゃんと指定しているし、エラーのほうはなんで??っていう感じでちょっとこまっていたのですけど、
こちらのページをみてわかりました。
ライブラリの場合は参照できるように Package.swift に新しく設定が必要になったらしいです。

以前別記事でアプリの場合は Package.swift に追加で設定が必要になったっていうのを書いたのですけど、
コレと同じでライブラリはライブラリで追加が必要になったようです。

products: [
    .library(name: "Swiftline", targets: ["Swiftline"]),
],

Fork した Swiftline でも同じ用に指定して上げると無事にビルドが通るようになりました!🎉
しかし、以前記事書いておいてなんだけど完全に忘れていた...👴🏻

SwiftPM v3系から SwiftPM v4系以降に以降するときは、この追加設定が必須っていうことです!
(頼みますよ未来の僕!!)