初めに
全然情報がなくて詰まったので、tips くらいの感覚で残しておきます。
前提
Swift Packgage Manager
(以後 SPM) はリモート(GitHubなど)から、ライブラリを読み込む際に使われることが多いでしょう。
今回は、ローカルにある Swift Packgage(例えば、自分で作成したオリジナルのパッケージ)を読み込む場合を想定しています。
- Example
問題
環境
発生した環境は Xcode 13.4 からでした。
(それより前は不明)
内容
ローカル SPM で開発を進めると、テストもそちらに移行したくなりますが、ここでリソースを読み込む際に問題がありました。
具体的には、以下の記事に従って行なったのですがうまくいかず...
Json が読み込まれず、テストで使用できない問題が発生しました。
解決策
パッケージのコードを修正します。
元のコード例は記事より引用するとこちらです。
import PackageDescription
targets: [
.target(
name: "Example",
dependencies: [],
resources: [
.process("Resources"),
]),
.testTarget(
name: "ExampleTests",
dependencies: [Example],
resources: [
.copy("Resources"),
]),
これを以下のようにします。
import PackageDescription
targets: [
.target(
name: "Example",
dependencies: [],
resources: [
/// これはプロダクションで使用しないならなくても良い ///
.process("Resources"),
]),
.testTarget(
name: "ExampleTests",
dependencies: [Example],
resources: [
/// ディレクトリ指定だとファイルが読み込まれないので、ファイルごとに指定する ///
- .copy("Resources"),
+ .copy("Resources/Json/xxx.json"),
+ .copy("Resources/Json/yyy.json"),
]),
1つずつファイルを指定することで読み込まれるようになりました。
上記の記事では、古い Xcode ではディレクトリが 、Resources
だと読み込まれないとありました。新しい Xcode では特に問題はなかったです。
ちなみに余談ですが、 Swift Playgrounds
でアプリ開発する場合は、Resources
が内部の予約後として使用されているので、扱いには注意が必要です。
読み込みの注意
Bundle
を読み込む際にも注意が必要です。
SPM からの場合は module
からにしないと読み込まれません。 SwiftGen
のコードを参考にして以下のようにすると良いでしょう。
#if SWIFT_PACKAGE
return Bundle.module
#else
return Bundle(for: Xxx.self) // 任意のクラス
#endif
終わりに
ファイルが増えると Package の中身が大きくなってしまうので、ディレクトリで指定する方法があるはずでは?と思っているので、どなたかご存知であればコメントいただけますとmm
冒頭の通り、忘れたくない自分のメモ書きを記事にしたので、誰かのお役に立てたら幸いですmm