対象者
- CodeMagicでCI/CDを構築し、ビルド時にアプリ固有の設定を自動化したいFlutterエンジニア
- macOS標準のシェル機能(パラメータ展開/変数展開)や
sed
を使った文字列置換に興味がある開発者 - 環境変数を用いて複数アプリを同一リポジトリで切り替え運用したいプロジェクトリーダー
はじめに
Macなどのシェルで文字列を置換したい場合があります。通常は一回きりなので、あまりシリアスに考えてなかったのです。しかし、今回CICDツールのCodeMagicを使い、ビルド時に外部から与えられた環境変数に応じて、データを書き換えるケースがありました。その中で以下をしました。
- 変数の中身を加工
- ソースファイル中の文字列をまとめて置換
本記事では、macOSでのシェルの「パラメータ展開」と「sed
コマンド」の2つのケースをご紹介します。
ケース1: 変数の中身を書き換える(パラメータ展開)
概要
環境変数の値そのものを「ドット→スラッシュ」に変換したい場合、bash
/ zsh
が備えるパラメータ展開機能を使うと高速かつ簡潔に実現できます。
実例:Android パッケージ名からディレクトリパスを生成
# 例:環境変数 PACKAGE_NAME="salon.flutter.cool.app" を
# ディレクトリ構造用に "salon/flutter/cool/app" に変換する
PACKAGE_NAME="salon.flutter.cool.app"
# ドット (.) をすべてスラッシュ (/) に置換
PACKAGE_DIR=${PACKAGE_NAME//\./\/}
echo "$PACKAGE_DIR"
# => salon/flutter/cool/app
メモ
//
を使うと文字の全置換(global replace).
や/
はメタ文字なので\.
のようにエスケープ- OS標準のため、
sed
に比べて高速
ケース2: ファイルの中身を書き換える(sed
コマンド)
概要
ソースコード中の特定文字列(例:アプリ名やパッケージ名)をまとめて置換したいときは、sed
が便利です。
実ファイルを直接書き換えつつ、最後にgrepで結果を確認するワークフローもご紹介します。
実例:iOSのプロジェクト設定ファイル内のアプリ名を置換
ー 置換前のファイル(sample.txt)
APP_NAME = "アプリ名";
色々なデータ
APP_NAME = "アプリ名";
色々なデータ
APP_NAME = "アプリ名";
- 実行コマンド
# 置換用変数(ダブルクォートやスペースを含む場合もOK)
APP_NAME="cool app name"
# sedで一括置換(-i '' はmacOS版sedのインプレース編集オプション)
sed -i '' -e "s/アプリ名/$APP_NAME/g" sample.txt
/g
: これがないと、一行内の最初の置換文字しか置き換わらない。 g
があると、一行に複数置換したい文字列があっても、全部置換される
置換後の確認
# sample.tx 内で最後に現れる APP_NAME の行だけを表示
grep APP_NAME sample.txt | tail -n 1
# 期待出力例
# APP_NAME = "cool app name";
変数の中身を出力
## 変数の中身が展開される
echo $APP_NAME
echo ${APP_NAME}
print $APP_NAME
print ${APP_NAME}
## これはダメ(そのままAPP_NAMEが出力される)
print APP_NAME
まとめ
- 変数の中身を置換 したいときは、シェルのパラメータ展開(
${VAR//検索/置換}
)が最速・最簡潔。 - ファイル内の文字列を置換 したいときは、
sed
コマンドを活用してインプレース編集。 - 置換後は
grep
+tail
で最後の1行だけ確認すると、長いファイルでもサクッと検証できます。
これらを組み合わせることで、CodeMagicなどのCIスクリプト内で「ビルド時の微調整」を自動化し、複数アプリの共存や環境ごとの差し替えをスマートに実現できます。
Q&A
Q1: sed
とパラメータ展開、どちらを使うべき?
A1:
- パラメータ展開:変数の値自身を加工するとき(例:ディレクトリパス生成など)
sed
:ファイルの中身を置換するとき(例:ソースコードや設定ファイルの文字列置換)
Q2: macOS版の sed -i ''
は何を意味する?
A2:
macOS標準のsed
は、-i
だけだと「バックアップ拡張子」の指定が必須です。
-i ''
とすると「バックアップファイルを作らずに上書き編集」できます。
参考
- 【脱sed】いい加減シェルスクリプトで文字列をsedで置換するなんてやめよう
- Macのsedでスラッシュを置換したい
置換する文字列のs
の次を記号にすると、それが情報の分け目になるらしい。URLなど区切り文字が置換する文字列の情報に入り込んでるとき便利かも。
sed -i "" "s%https://flutter.salon/%https://localhost:3000%g" test.txt
(/
が置換前後の文字に入っているので、%
で分けるようにした)
-
Next
記事がありません