急にSPMがエラーになって困ったのをなんとか解決した話

本投稿は TECOTEC Advent Calendar 2024 の8日目の記事です。

おはこんばんちは、証券フロンティア事業部の赤池です。
iOSエンジニアとして、iOS向けのアプリを開発しています。
ブログに登場するのはおそらく2年ぶりくらいです。

皆さんはSwift Package Manager(SPM)を使ってますか?
……使ってますよね、便利ですもんね。
CocoaPodsも便利でしたが、SPMはより便利になったという感じで手放せない感じになりました。
多分今のiOS開発環境では、よほどのことがなければSPMがファーストチョイスになっていると思います。

では、Git管理のクライアントソフトは何か使っていますか?
私は定番 of 定番(ですかね?)のSourceTree

www.sourcetreeapp.com

を使用しています。

ということで今回は、SPM + SourceTreeの環境で起こった問題についてお話します。
それ以外の環境の方は、ちょっとした読み物だと思ってお読みください。

事件勃発

ことの発端は、

(そういや、最近SourceTreeアップデートしとらんな。しておくか)

くらいの、割とありがちな感じでした。
そして、あまりに軽い気持ちでアップデートしたため、後々ここに問題があったと気づくまでにだいぶ時間がかかることになるのでした。

SourceTreeのアップデート自体はなんの問題もなく終わり、
さて、開発続けるか
と、Xcodeで開発途中のプロジェクトを開いてビルドしようとします。

が、

GitShellError(result: <ProcessResult: exit: terminated(code: 1), output: ...

……は?????

そこには、今まで見たことのないエラー文言が表示されていました。
GitShellErrorってなんやねん! などとブツブツ言いながらネットの海を調べたところ……

なるほど全然わからん(諦め)。
このエラー文言を調べても、全く解決策が出てこないんですよね(調べた当時)。

試行錯誤

とはいえ、だいたいこういうのはSPMのキャッシュに問題がある。

なんとなくの経験則でそう感じていたため、とりあえずお決まりの、
「Reset Package Caches」 -> 「Resolve Package Versions」
でSPMのキャッシュを綺麗にして試してみると……

GitShellError(result: <ProcessResult: exit: terminated(code: 1), output: ...

……ん?????

二度目の同じエラー。
なるほどなるほど、もっと深いところのキャッシュね。

震える手を握りしめ努めて冷静さを保ちつつ、続いてはこれまたおなじみ、
「DerivedData」ディレクトリを削除
します。

Xcode使用者の常で、
問題が起こったらこれを削除してXcodeを再起動すればだいたい直る
が染み付いてますからね。

というわけで、諸々済ませてXcodeの再起動を起動したところ、

(画像略)

は〜〜〜〜〜〜……、と大きなため息を吐き出しました。

なんと困ったことに、
普段から使っているエラー解決ノウハウが全く通用しなかったんですね。

こうなってくると流石に焦りだします。
次に試したのはXcodeの再インストールでしたが、それもダメ。
他にも様々な方法を調べて試してみたのですが、全部空振りでエラーは解決しませんでした。

そして解決へ…

その後も色々とXcodeをいじったりPCを再起動したりしていると、
何かの拍子にエラーメッセージが以下のものに変わりました(その時の画像は残ってないです。すみません)。

fatal: cannot use bare repository SPMパッケージのディレクトリ (safe.bareRepository is 'explicit')

これまた見たことのないエラーでしたが、藁にも縋る思いでGoogle検索でそのままの文字列を調べてみます。

すると、

forums.swift.org

や〜〜〜〜〜〜〜〜っと解決しました。

どうやら、何の気なしにSourceTreeを更新した時、SourceTree側が.gitconfig内へ

[safe]
    bareRepository = explicit

という項目を書き込んでいたのが原因だったようです。

この時点でようやく、
(そういや、SourceTree更新したな……)
と思い出しました。

そこでフォーラムに従い、この部分を

綺麗に

念入りに

(恨みを込めて)

削除すると、

あっけなくビルドに成功しました。

終わりに

こんな感じでだいぶ悩んだ末になんとか解決できました。

軽い気持ちで何かすると、
問題が起こったときの原因究明の際になかなか自分の行動を思い返せなくなる
ということを思い知らされました。

この記事が、同じ症状で悩んでいる方の一助になれば恐悦至極に存じます。

ということで、長々とお付き合いいただきありがとうございました。
明日以降の記事もお楽しみに。ではまた。

テコテックの採用活動について

テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。 tecotec.co.jp