はじめに
個人開発でも業務でも iOS や watchOS のアプリ開発で
リソースファイルを扱いやすくするためによく R.swift を使っています。
詳しくは GitHub や良記事が多々あるので見てください。
久々にライブラリの更新作業やっていたら
R.swift の 6系から 7系のアップデートに
少し大きな変更があったようで
マイグレーション作業が必要になっていました。
7.0.0 のリリースノートにマイグレーションガイドのリンクがあって,
親切にも CocoaPods から Swift Package Manager への
移行動画も用意されていていたにも関わらず少し詰まってしまったのでメモ程度に残します。
開発環境
- M2 MacBook Air
- macOS 12.5.1
- Xcode 14.1
- R.swift 6.1.0 -> 7.2.2
- CocoaPods から Swift Package Manager に移行したい
まずやったこと
マイグレーションガイドを参考に🧑💻
-
Podfile
から R.swift を削除して(bundle exec) pod install
で削除 -
R.generated.swift
を削除 - Build Phase の R.swift 用の Run Script 削除
- SPM で R.swift の導入
- Build Phase の
Run Build Tool Plug-in
にRswiftGenerateInternalResources
追加 - RswiftXcodeModifyPackages をクリック
-
import Rswift
をimport RswiftResources
に -
ImageResourceType
などをガイド見ながら適切に書き換え - ビルド・・・
ビルド失敗😇
詰まった点
x86_64 がちらつく
シミュレータ起動しようと Run するものの・・・
/Users/xxx/Library/Developer/Xcode/DerivedData/XXXX/SourcePackages/plugins/XXXX.output/XXXX/RswiftGenerateInternalResources/XXXX/Resources/R.generated.swift:7:8 Could not find module 'RswiftResources' for target 'x86_64-apple-ios-simulator'; found: arm64-apple-ios-simulator,
そういえば,M1 Mac の対応でいじった記憶ある。
Excluded Architectures
の arm64
を削除。
さらに,Podfile
にワークアラウンド的に書いてた記述を削除。
// Podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
// ↓ここ消す
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
ようやくビルド成功。
Bitrise でこける
PR 出してみたものの・・・
CI こけとる😓
該当ステップ部分は Xcode Test for iOS のテスト部分。
こういうログが確認できる。
The following build commands failed:
Validate plug-in “RswiftGenerateInternalResources” in package “r.swift”
そういえばマイグレーションガイドに書いてあったような・・・
CI の場合 -skipPackagePluginValidation
オプション使えと。
Bitrise の Xcode Test for iOS のステップだとどこになるのか。
あった。
xcodebuild configuration の
Additional options for the xcodebuild command 部分。
オプションを入力して,
再度ワークフロー実行で CI 通った🎉
おまけのモヤモヤ
文字列は strings ファイルで管理しています。
ちょっと記述が長くなるので,下記のように typealias
を使って少し短く描けるようにしてました。
typealias Strings = R.string.localizable
例)
label.text = Strings.hogefuge()
グローバルに宣言して書いてたら怒られるので一旦戻した。
ちょっと対応考える🤔
おわりに
R.swift を CocoaPods から Swift Package Manager(6.1.0->7.2.2)に移行した際に困ったことについて書きました。
こういうの対応してうまく動くと嬉しい。
CocoaPods に比べて導入は楽になったようには感じますね。