はじめに
Xcode
でファイル追加や削除をするときに知らないとおそらく確実に最初にはまってしまう落とし穴があるので今回まとめていこうと思います。
iOSアプリ開発をする際に実際のファイル階層とXcode
上で表示されるファイル構造は異なっています。それを管理しているのがprojectファイル
で、実際のファイル階層がXcode
上でどの階層になっているかを管理するファイルになっています。
それゆえにファイル追加や削除をする際に注意が必要になってきます。
ファイル追加
今回aaa.txt
を作成しXcode
に追加します。
Xcode
上にドラッグ&ドロップして追加することができますが、その際にこのような画面がでてきます。
ここが最重要ポイントで一番上のCopy items if needed
にチェックを入れてください。
Finish
を押すとファイルが追加されます。
無事できました。
では、さっきのCopy items if needed
にチェックをいれないとどうなるか試してみます。
このようにチェックを入れたときと同様ファイルが追加されてるように見えますが、ディレクトリの中身を確認してみると、
aaa.txt
は存在していません。
git
でprojectファイル
の変更差分をgit diff
で確認してみると、
% git diff ../SampleApp.xcodeproj/project.pbxproj
[15:55:46]
diff --git a/SampleApp.xcodeproj/project.pbxproj b/SampleApp.xcodeproj/project.pbxproj
index dfda407..6006a8f 100644
--- a/SampleApp.xcodeproj/project.pbxproj
+++ b/SampleApp.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ C50B01181F36F4B900331006 /* aaa in Resources */ = {isa = PBXBuildFile; fileRef = C50B01171F36F4B900331006 /* aaa */; };
C5ED9AA11ED351FE00AF40C7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5ED9AA01ED351FE00AF40C7 /* AppDelegate.swift */; };
C5ED9AA31ED351FE00AF40C7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5ED9AA21ED351FE00AF40C7 /* ViewController.swift */; };
C5ED9AA61ED351FE00AF40C7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C5ED9AA41ED351FE00AF40C7 /* Main.storyboard */; };
@@ -36,6 +37,7 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
+ C50B01171F36F4B900331006 /* aaa */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = aaa; path = ../../Desktop/aaa; sourceTree = ""; };
C5ED9A9D1ED351FE00AF40C7 /* SampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
C5ED9AA01ED351FE00AF40C7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
C5ED9AA21ED351FE00AF40C7 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
@@ -109,6 +111,7 @@
C5ED9AA71ED351FE00AF40C7 /* Assets.xcassets */,
C5ED9AA91ED351FE00AF40C7 /* LaunchScreen.storyboard */,
C5ED9AAC1ED351FE00AF40C7 /* Info.plist */,
+ C50B01171F36F4B900331006 /* aaa */,
);
path = SampleApp;
sourceTree = "";
@@ -240,6 +243,7 @@
files = (
C5ED9AAB1ED351FE00AF40C7 /* LaunchScreen.storyboard in Resources */,
C5F060B31F1F3F450034FD0E /* TableViewCell.xib in Resources */,
+ C50B01181F36F4B900331006 /* aaa in Resources */,
C5ED9AA81ED351FE00AF40C7 /* Assets.xcassets in Resources */,
C5ED9AA61ED351FE00AF40C7 /* Main.storyboard in Resources */,
);
これのこの部分を見てみると、
+ C50B01171F36F4B900331006 /* aaa */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = aaa; path = ../../Desktop/aaa; sourceTree = ""; };
このように追加したファイルのパスが僕のPCのデスクトップになっています。
つまりCopy items if needed
にチェックをいれないと、元々aaa.txt
は、僕のPCのデスクトップにあったのでXcode
上では、特に問題なさそうに見えますが、実際にはデスクトップにある元のファイルを直接参照しています。
1人で開発してる場合は特にエラーも発生せずに進んでしまいますが、共同開発する際に他の人が開発する際にはその人のPCのデスクトップにはaaa.txt
は存在しないのでエラーになってしまいます。
Copy items if needed
にチェックを入れた場合はコピーが作られ、このプロジェクトの管理下のディレクトリに保存されようになるのでこのようなエラーは発生しません。
なので基本的に、Copy items if needed
にチェックを入れるようにしましょう。
ファイル削除
次はファイル削除です。右クリックしてDelete
を選択して削除することができます。
するとこのような確認画面がでてきます。
ここも注意が必要です。
何も考えずに青いボタンを選択してしまうと、Xcode
上ではファイルが削除されたように見えますが、
このようにファイル自体は残ったままになってしまいます。
これもRemove Reference
からなんとなくわかるかと思いますが、Projectファイル
での参照を消すだけなので実際にファイルを削除してるわけではありません。
こちらに関しては特にエラーが出るわけではありませんが、不要ファイルが残り続けてしまい無駄な容量を食ってしまいます。
なので一番右のMove to Trash
を選択すればファイルも削除されるので、基本的にはこちらを選択するようにしましょう。
まとめ
- ファイル追加のときは、
Copy items if needed
にチェックをいれる。 - ファイル削除のときは
Move to Trash
を選択する。