ExpoのManaged Workflowを使っている場合にPodfileの内容を書き換えたい時があります。一部の項目(deploymentTarget
, useFrameworks
)についてはexpo-build-properties で書き換えることができます(ExpoのManaged Workflowでビルド時の設定値(ターゲットOSバージョン等)を変更する)が、それ以外の箇所を更新する場合、Config PluginのModを使って直接書き換える必要があります。
firebase関連で以下のpod指定を追加しないといけない場合を例とします。
pod 'Firebase', :modular_headers => true
pod 'FirebaseCore', :modular_headers => true
pod 'FirebaseCoreInternal', :modular_headers => true
pod 'GoogleUtilities', :modular_headers => true
Podfileを書き換えるためのMod pluginはデフォルトでは用意されていないため、withDangerousMod
を使います。withDangerousMod
に渡す非同期functionの中でファイルを読み込んで中身を更新します。
import { ConfigPlugin, withDangerousMod } from "@expo/config-plugins"
import fs from "fs"
import path from "path"
export const withPodfileUpdate: ConfigPlugin = config => {
return withDangerousMod(config, [
"ios",
async c => {
const podfilePath = path.join(c.modRequest.platformProjectRoot, "Podfile")
const contents = fs.readFileSync(podfilePath, "utf-8")
const replaced = contents.replace(SEARCH_TEXT, REPLACE_TEXT)
fs.writeFileSync(podfilePath, replaced)
return c
},
])
}
const SEARCH_TEXT = " # Uncomment to opt-in to using Flipper"
const REPLACE_TEXT = `
pod 'Firebase', :modular_headers => true
pod 'FirebaseCore', :modular_headers => true
pod 'FirebaseCoreInternal', :modular_headers => true
pod 'GoogleUtilities', :modular_headers => true
# Uncomment to opt-in to using Flipper`
`
中身はテキスト置換で強引に更新していますが、React Native (Expo SDK)のバージョンアップ等で元のPodfileの中身が変わり更新が効かなくなる可能性があるので、使う場合はバージョンアップ時に都度動作するかどうか検証する必要があります。