😬
[Swift6に向けて] SE-0274: Concise magic file names
要約
変更点
#fileの挙動が変わる
- ASIS: そのファイルへのFullPathを含むString (e.g.
/Users/becca/Desktop/0274-magic-file.swift) - TOBE: ModuleNameとFileNameを含むString (e.g.
MagicFile/0274-magic-file.swift)
いつから
Swift6で導入される
Feature Flagで有効にできる(ConciseMagicFile)
対応の難易度
小
影響がありそうなこと
- コードベース上で
#fileを使っている箇所- e.g. データの読み込む/書き込む場所を
#fileの値を利用して指定している(e.g. Cache, SnapshotTest) - e.g. デバッグログに
#fileの値を利用している
- e.g. データの読み込む/書き込む場所を
対応すべきこと
-
#fileの挙動の変更で困る箇所があるなら、#filePathで置き換える
(#filePathは新しく登場したMagic Idenfitierで、既存の#fileと同じ挙動をする)
Proposalの内容
モチベーション
現在#fileは、 そのファイルへのFullPathを含むSrtingとして評価される
#fileがFullPathを表示する挙動には、以下の欠点がある
- usernameなどのsensitiveな情報が含まれる可能性がある
- FullPathは文字列として長く、成果物のbinaryサイズが大きくなってしまい、パフォーマンスが悪くなる
- FullPathの値は、実行するマシンや環境によって値が変化するため、生成されるBinaryやハッシュ値が変わる
新しい提案
-
#fileは、FullPathではなく、<ModuleName>/<fileName>として評価される - 互換性のため、既存の
#fileと同じ挙動の、#filePathを導入する
標準ライブラリの関数は#fileを使っているものがある(e.g. fatalError)ので、それらのログも影響を受ける
print(#file)
// MagicFile/0274-magic-file.swift
print(#filePath)
// /Users/becca/Desktop/0274-magic-file.swift
fatalError("Something bad happened!")
// Fatal error: Something bad happened!: file MagicFile/0274-magic-file.swift, line 3
いまのところ、同一モジュールに同じ名前のファイルは存在できないので、#fileの値はユニークなまま。
実装の詳細
文字列のフォーマット
file-string → module-name "/" file-name
file-string → module-name "/" disambiguator "/" file-name // Reserved for future use
将来的に、文字列にdisambiguatorが挿入される可能性がある
/でsplitするときは、ModuleNameは最初の要素、fileNameは最後の要素というようにアクセスしたほうがよい
既存のコードとの互換性
#fileの挙動が変わるので、使用している箇所には影響がある
既存の#fileの挙動(FullPath)を使用したいなら、#filePathを使用できる
影響がありそうなこと
- ログ内のパスの表示が少し変わる(FullPath -> ModuleName/FullPath)
- #fileのFullPathの部分文字列を切り出す操作をしていたら、値が変わる
- ファイルの読み出し/書き出しの場所を#fileで指定していると、場所が変わる
まとめ
#fileの挙動が変わる
-
ASIS: そのファイルへのFullPathを含むString (e.g.
/Users/becca/Desktop/0274-magic-file.swift) -
TOBE: ModuleNameとFileNameを含むString (e.g.
MagicFile/0274-magic-file.swift) -
コードベース上で
#fileを使っている箇所は影響がある可能性があるので、ひとつひとつチェックする。
Discussion