😬
[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