2022-10-16

ExpoのConfig PluginでPodfileを直接書き換える

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の中身が変わり更新が効かなくなる可能性があるので、使う場合はバージョンアップ時に都度動作するかどうか検証する必要があります。

最終更新: 2022-10-16 08:09
筆者: @gaishimo 主にReact Nativeでのアプリ開発を行っています。
© 2021 Omoidasu, Inc. All rights reserved.